C++
bonjour s'il vous plait dites moi ce qui ne va pas dans ce code de programme merci
#include<iostream.h> #include<conio.h> #include<ctype.h> class Liste { private: char *nom; char *prenom; int note; Liste *suivant; public: //Liste(char *a,char*b,int c):nom(a),prenom(b),note(c){}; //~Liste(); void creation(); void ajoute();//l'ajout se fait en tete de Liste void affiche(Liste *); }; int encore(void); Liste *liste=NULL; int encore(void) { cout<<"\n\tEncore (O/N) ?"; return (toupper(getch()=='o')); } void Liste::creation() { Liste *list; cout<<"\n\tLe nom de l'etudiant :";cin>>list->nom; cout<<"\n\tLe prenom de l'etudiant :";cin>>list->prenom; cout<<"\n\tLa note de l'etudiant :";cin>>list->note; list->suivant=liste;liste=list;list=NULL; while(encore()) { Liste *o=new Liste; cout<<"\n\tLe nom de l'etudiant :";cin>>o->nom; cout<<"\n\tLe prenom de l'etudiant :";cin>>o->prenom; cout<<"\n\tLa note de l'etudiant :";cin>>o->note; o->suivant=liste; liste=o; o=NULL; delete o; } } void Liste::ajoute() { Liste *l; cout<<"\n\tNom a ajouter :";cin>>l->nom; cout<<"\n\tPrenom a ajouter :";cin>>l->prenom; cout<<"\n\tNote a ajouter :";cin>>l->note; l->suivant=liste; liste=l; l=NULL; } void Liste::affiche(Liste *th) { cout<<"\n\tLa liste finale est :"; while(th!=NULL) { cout<<"\n\tNom :"<<th->nom<<"\n\tPrenom:"<<th->prenom<<"\n\tNote :"<<th->note; th=th->suivant; } } void main() { liste->creation(); //liste->ajoute(); liste->affiche(liste); getch(); }
3 réponses
Bonjour,
Avant celà, dis nous quand même quel est le problème. Problème à l'execution? Problème à la compilation? Qu'est ce qui est affiché?
Avant celà, dis nous quand même quel est le problème. Problème à l'execution? Problème à la compilation? Qu'est ce qui est affiché?
ce qui ne va pas :
aucune allocation mémoire, et plein de pointeurs.
Et ta class liste devrai plutot portée le nom d'étudiant
aucune allocation mémoire, et plein de pointeurs.
Et ta class liste devrai plutot portée le nom d'étudiant
Attention la liste peut paraître longue mais il ne faut surtout pas prendre ça comme un reproche ;-)
1) Cette syntaxe est obsolète :
A remplacer par :
Idéalement il faudrait ne pas utiliser la ligne using namespace std et changer tous les cout par des std::cout.
2) D'une manière générale en c++ on n'utilise pas de majuscule contrairement au jave mais c'est plus une convention qu'une règle. Sauf cas particulier on peut se passer en général des pointeurs en C++ notamment en utilisant les passages par référence (&). Syntaxiquement tout se passe comme si tu passais directement l'objet en paramètre, mais en terme d'éxécution et de compilation tout se passe comme s'il s'agissait du pointeur.
3) La classe Liste ne fournit aucun accesseur pour récupérer ou initialiser le nom. Il faudrait au moins un constructeur permettant de les initialiser.
4) La notion de suivant ne devrait pas être contenue dans l'objet Liste :
a) cet objet Liste devrait uniquemennt décrire un étudiant
b) il faut créer un objet liste encapsulant la liste d'élève. Note que le c++ fournit un certain nombre de conteneur pour stocker des objets quelconque (STL)
Pour plus d'infos ;
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
Idéalement j'utiliserai même un C en utilisant pour clé le nom et le prénom afin d'avoir un ensemble d'éleve trié et être sûr qu'on n'a pas de doublon. De plus la recherche se fera de manière plus efficace (O(log(n)) au lieu de O(n)). Pour plus d'infos ;
http://c.developpez.com/faq/cpp/?page=STL#STL_functor
5) Le C++ fournit une classe (std::string) beaucoup plus pratique que le basique char *.
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
6) Je n'ai pas vu où tu utilisais les headers <conio.h> et <ctypes.h> mais vu que ce sont des headers C tu aurais du écrire :
Enfin pour être standard, main est sensé retourner un entier indiquant le code d'éxecution (0 si tout va bien e tun numéro d'erreur sinon).
Bonne chance
1) Cette syntaxe est obsolète :
#include <iostream.h>
A remplacer par :
#include <iostream> using namespace std; // permet d'éviter d'écrire cout à la place de std::cout
Idéalement il faudrait ne pas utiliser la ligne using namespace std et changer tous les cout par des std::cout.
2) D'une manière générale en c++ on n'utilise pas de majuscule contrairement au jave mais c'est plus une convention qu'une règle. Sauf cas particulier on peut se passer en général des pointeurs en C++ notamment en utilisant les passages par référence (&). Syntaxiquement tout se passe comme si tu passais directement l'objet en paramètre, mais en terme d'éxécution et de compilation tout se passe comme s'il s'agissait du pointeur.
void plop(int i){ ++i; //i n'est pas incrementé à l'exterieur de la fonction } void plop(int & i){ ++i; //i est incrementé }
3) La classe Liste ne fournit aucun accesseur pour récupérer ou initialiser le nom. Il faudrait au moins un constructeur permettant de les initialiser.
Liste(const char *nom0,const char *prenom0,int note0): nom(nom0),prenom(prenom0),note(note0),suivant(NULL) {} inline void set_nom(const char *nom0){ nom = nom0;} inline const char * get_nom() const { return nom;}
4) La notion de suivant ne devrait pas être contenue dans l'objet Liste :
a) cet objet Liste devrait uniquemennt décrire un étudiant
b) il faut créer un objet liste encapsulant la liste d'élève. Note que le c++ fournit un certain nombre de conteneur pour stocker des objets quelconque (STL)
#include <list> typedef std::list<eleve> liste_eleve;
Pour plus d'infos ;
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
Idéalement j'utiliserai même un C en utilisant pour clé le nom et le prénom afin d'avoir un ensemble d'éleve trié et être sûr qu'on n'a pas de doublon. De plus la recherche se fera de manière plus efficace (O(log(n)) au lieu de O(n)). Pour plus d'infos ;
http://c.developpez.com/faq/cpp/?page=STL#STL_functor
5) Le C++ fournit une classe (std::string) beaucoup plus pratique que le basique char *.
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
#include <string> class eleve{ private: std::string nom; std::string prenom; int note; //Liste *suivant; public: eleve(const std::string & nom0,const std::string & prenom0,int note): nom(nom0),prenom(prenom0)note(note0) {} ... };
6) Je n'ai pas vu où tu utilisais les headers <conio.h> et <ctypes.h> mais vu que ce sont des headers C tu aurais du écrire :
extern "C"{ #include <conio.h> #include <ctypes.h> }
Enfin pour être standard, main est sensé retourner un entier indiquant le code d'éxecution (0 si tout va bien e tun numéro d'erreur sinon).
int main(){ ... return 0; }
Bonne chance