C++

Fermé
antipopol - 18 juil. 2006 à 19:20
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 - 19 juil. 2006 à 09:53
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

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
18 juil. 2006 à 19:46
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é?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
19 juil. 2006 à 08:22
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
0
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 7 809
19 juil. 2006 à 09:53
Attention la liste peut paraître longue mais il ne faut surtout pas prendre ça comme un reproche ;-)

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
0