IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Programme d'enregistrement d'étudiant qui plante au bout de trois


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant en Mthématique et informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Algérie

    Informations professionnelles :
    Activité : Etudiant en Mthématique et informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Programme d'enregistrement d'étudiant qui plante au bout de trois
    Bonjour à tous !

    Notre professeur à l’université nous a donné un exercice à résoudre, il s’agit d’un programme C++ qui permet de lire les informations de 180 étudiants de la section (nom, prénom, identificateur, numéro de groupe (de 1 à 4) et une note) (j’en ai fait que 3 étudiants pour gagner du temps à l’exécution) puis de rechercher et afficher le nom et le prénom de tous les étudiants du groupe 2 ayant une note inférieure à 10.

    Alors ici, c’est un exercice pour mieux comprendre les enregistrements qu’on a vu en cours C++, au début, je l’ai fait sur papier puis, je l’ai tapé sur Dev-C++, il n’y avait aucune erreur après la compilation donc j’ai lancé le programme, j’ai commencé à saisir les informations des 2 premiers étudiants mais quand je clique sur Entré après avoir tapé le nom du 3ème étudiant, il me fait un saut de ligne et ne me permet pas de saisir son prénom et juste après, il m’affiche un message d’erreur :

    Nom : Erreur.jpg
Affichages : 1282
Taille : 63,9 Ko
    Voici le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include<iostream>
    using namespace std;
    int main()
    {
    	struct etudiant
    	{
    		string nom,prenom;
    		int identificateur,groupe;
    		float note;
    	};
     
    	int i; etudiant T[3];
     
    	for(i=1;i<=3;i++)
    	{
    		cout<<"\n\n \20 \220tudiant n\247"<<i<<" :\n\n";
    		cout<<" Nom : "; cin>>T[i].nom;
    		cout<<" Pr\202nom : "; cin>>T[i].prenom;
    		cout<<" Identificateur : "; cin>>T[i].identificateur;
    		do {cout<<" N\247 de groupe : "; cin>>T[i].groupe;} while ((T[i].groupe<1)||(T[i].groupe>4));
    		do {cout<<" Note : "; cin>>T[i].note;} while ((T[i].note<0)||(T[i].note>20));
    	}
     
    	cout<<"\n\n Les \202tudiants du groupe 2 ayant une note inf\202rieure \205 10 sont :\n\n";
    	for(i=1;i<=3;i++)
    	{
    		if((T[i].groupe==2)&&(T[i].note<10))
    		{
    			cout<<" - "<<T[i].prenom<<" "<<T[i].nom<<"\n";
    		}
    	}
     
    	cout<<"\n";
    	return 0;
    }
    Pouvez-vous m'aider à résoudre le problème ?
    Merci !

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Noi,

    L'éternelle question des indices des tableaux :

    Un tableau déclaré leType T[3] a des indices allant de 0 à 2, et pas de 1 à 3.

    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Ton problème vient du fait qu'en C++ on ne compte pas de 1 à n mais de 0 à (n-1).
    De là, tu peux voir que les bornes de ta boucle sont mauvaises (ce n'est de 1 à 3, mais de 0 à 2).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Etudiant en Mthématique et informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Algérie

    Informations professionnelles :
    Activité : Etudiant en Mthématique et informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci pour vos réponses ! j’oublierai jamais ça ...cependant, pourquoi dans certains programmes ça marche sans problème ?!
    Comme ici par exemple, dans ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #include<iostream>
    using namespace std;
    int main()
    {
    	struct date 
    	{
    	int jo,mo,an;
    	};
    	struct etudiant 
    	{
    	string nom,prenom;
    	date birthday;
    	};
     
    	int i,j; etudiant T[100]; string reponse;
    	do
    	{
    		i++;
    		cout<<"\n\n \220tudiant n\247"<<i<<" :\n\n";
     
    		cout<<" Nom : "; cin>>T[i].nom;
    		cout<<" Pr\202nom : "; cin>>T[i].prenom;
     
    		cout<<"\n Date de naissance :\n";
    		do {cout<<" Jour : "; cin>>T[i].birthday.jo;} while ((T[i].birthday.jo<1)||(T[i].birthday.jo>31));
    		do {cout<<" Mois : "; cin>>T[i].birthday.mo;} while ((T[i].birthday.mo<1)||(T[i].birthday.mo)>12);
    		do {cout<<" Ann\202e : "; cin>>T[i].birthday.an;} while ((T[i].birthday.an<1990)||(T[i].birthday.an)>2000);
     
    		cout<<"\n\n";
    		do
    		{
    		cout<<" Y-a-il un autre \202tudiant ? "; cin>>reponse;
    	    } while ((reponse!="oui")&&(reponse!="Oui")&&(reponse!="oUi")&&(reponse!="ouI")&&(reponse!="OUI")&&(reponse!="non")&&(reponse!="Non")&&(reponse!="nOn")&&(reponse!="noN")&&(reponse!="NON"));
    	} while ((reponse=="oui")||(reponse=="Oui")||(reponse=="oUi")||(reponse=="ouI")||(reponse=="OUI"));
     
    	cout<<"\n\n Les \202tudiants n\202s le mois de Mars sont :\n";
    	for(j=1;j<=i;j++)
    	{
    		if(T[j].birthday.mo==3)
    		{
    			cout<<" - "<<T[j].prenom<<" "<<T[j].nom<<"\n";
    		}
    	}
    	cout<<"\n";
    	return 0;
    }

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Tu as entré les informations de 100 étudiants pour tester ? Et ça a fonctionné ?
    Si oui, c'est uniquement le fruit du hasard. Je remarque que dans le deuxième code que tu fournis :
    - i n'est pas initialisé,
    - tu déclares une string reponse après etudiant T[100] ; l'agencement des données en mémoire, dans la pile, n'est alors plus le même (par rapport au premier code que tu fournis), ce qui a peut-être, par chance (ou plutôt malheur), permis à ton code de "déborder" du tableau et de ne pas provoquer un crash dans l'immédiat.

    Dans tous les cas, les indices d'un tableau de taille N vont de 0 à N-1, il n'y a pas d'exceptions à cela. Si un code fonctionne alors que les bornes sont autres, alors méfie t-en car cela a de grandes chances de provoquer des erreurs autre part dans ton programme, parfois difficiles à déboguer ...

    Dernier détail : ton code ne prend pas le cas où on tape "OUi" ou "oUI" ou "OuI"

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Le fait que les dépassements d'indice dans les tableaux à la C ne sont pas systématiquement détectés, quand on programme en C++, on s'en fout, car on les utilise plus depuis bien longtemps.
    Votre professeur, il sent pas un peu la naphtaline ?
    http://www.cplusplus.com/reference/vector/vector/
    http://fr.cppreference.com/w/cpp/container/array

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Etudiant en Mthématique et informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Algérie

    Informations professionnelles :
    Activité : Etudiant en Mthématique et informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par the Hound Voir le message
    Tu as entré les informations de 100 étudiants pour tester ? Et ça a fonctionné ?
    Si oui, c'est uniquement le fruit du hasard.
    Pas de 100 étudiants, 5 ou 6 c'est plus pratique, non ?!

    Citation Envoyé par the Hound Voir le message
    Je remarque que dans le deuxième code que tu fournis :
    - i n'est pas initialisé,
    - tu déclares une string reponse après etudiant T[100] ; l'agencement des données en mémoire, dans la pile, n'est alors plus le même (par rapport au premier code que tu fournis), ce qui a peut-être, par chance (ou plutôt malheur), permis à ton code de "déborder" du tableau et de ne pas provoquer un crash dans l'immédiat.
    Dans tous les cas, les indices d'un tableau de taille N vont de 0 à N-1, il n'y a pas d'exceptions à cela. Si un code fonctionne alors que les bornes sont autres, alors méfie t-en car cela a de grandes chances de provoquer des erreurs autre part dans ton programme, parfois difficiles à déboguer ...
    Pour le i, je pensais qu'ainsi il sera initialisé par un zéro (par défaut) , désolé je suis vraiment qu'un débutant ! mais à présent, je commencerai toujours par un zéro pour éviter de provoquer des erreurs .

    Citation Envoyé par the Hound Voir le message
    Dernier détail : ton code ne prend pas le cas où on tape "OUi" ou "oUI" ou "OuI"
    Oui ...c'était juste pour s'amuser un peu, par contre, je sais vraiment pas si c'est une bonne idée ou pas ?!

    Merci pour tes réponse ! on apprend plein de choses ici, j'adore !

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Etudiant en Mthématique et informatique
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Algérie

    Informations professionnelles :
    Activité : Etudiant en Mthématique et informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Le fait que les dépassements d'indice dans les tableaux à la C ne sont pas systématiquement détectés, quand on programme en C++, on s'en fout, car on les utilise plus depuis bien longtemps.
    Votre professeur, il sent pas un peu la naphtaline ?
    http://www.cplusplus.com/reference/vector/vector/
    http://fr.cppreference.com/w/cpp/container/array
    Carrément oui, je voie vraiment pas pourquoi j'assiste à son cours C++ !
    Merci.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par MK.Djahli Voir le message
    Pas de 100 étudiants, 5 ou 6 c'est plus pratique, non ?!
    Ben ça dépend... pour déceler un dépassement de mémoire dans un tableau de 100 éléments, en rentrer 5 ou 6 seulement c'est..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par MK.Djahli Voir le message
    Pour le i, je pensais qu'ainsi il sera initialisé par un zéro (par défaut)
    Ne sont initialisé que les variables globales et les objets de l'utilisateur (struct et classes). Pour ces derniers, l'initialisation consiste à appeler le constructeur par défaut. Si ce constructeur n'initialise pas les variables membres (quand c'est par exemple le compilateur qui génère ce constructeur) elles auront donc n'importe quelle valeur après la création de l'objet.

    Une bonne pratique consiste donc à initialiser explicitement toute variable que tu utilises. Et je rajoutes souvent à mes structures un constructeur par défaut qui initialise tous les membres, surtout quand la structure contient un pointeur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme qui plante : seg fault
    Par Premium dans le forum C
    Réponses: 10
    Dernier message: 01/12/2006, 15h12
  2. programme qui plante. chercher/remplacer dans des fichiers.
    Par [Hugo] dans le forum Général Python
    Réponses: 2
    Dernier message: 31/10/2006, 17h10
  3. [Kazaa]Programme de Peer To Peer qui plante
    Par snoopy69 dans le forum Sécurité
    Réponses: 11
    Dernier message: 23/06/2006, 15h58
  4. Faire un programme qui plante et noter le plantage
    Par cedricgirard dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 16h36
  5. Programme qui plante
    Par harris_macken dans le forum C++
    Réponses: 1
    Dernier message: 22/05/2005, 23h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo