cptpingu
Messages postés
3837
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 mars 2023
123
22 mai 2009 à 22:11
J'ai apporté quelques corrections à ton code.
Quelques remarques:
- Utilise iostream et non iostream.h (qui est déprécié)
- Utilise std::getline, plutot que le cin.getline
- N'oublie pas que tu peux faire des getters/setters pour récupérer ou mettre à jour des attributs de classe. On ne les mets généralement pas en visibilité publique.
- Préfère std::endl à \n, qui est plus portable (je t'invite à jeter un coup d'oeil sur les problèmes et avantages de std::endl, et à regarder une implémentation de std::endl de mon cru, que j'avais nommé std::nl).
Fixe toi une norme d'écriture, voici la mienne, beaucoup basée sur celle de Sun, à titre indicatif:
* Une classe porte une majuscule, un nom de variable ou un nom de fonction commence par une miniscule (Utilisation du caml Case et du Pascal Case)
* L'étoile ou l'esperluette, collé au type
A noter que je n'ai pas vérifier si ça fonctionnait, j'ai juste fait en sorte que ça compile.
#include
#include <fstream>
#include <string>
class Eleve
{
friend std::ostream& operator<<(std::ostream& out, Eleve* v);
friend std::istream& operator>>(std::istream& in, Eleve* v);
public:
Eleve(const std::string& nom, const std::string& prenom, const std::string& matricule);
virtual void affiche() const;
virtual int getSalaire() const = 0;
virtual Eleve* getSuivant() const;
virtual void setSuivant(Eleve* suivant);
virtual void print(std::ostream& o) const;
protected:
std::string _nom;
std::string _prenom;
std::string _matricule;
Eleve* _pSuivant;
};
class Ecole
{
public :
Ecole();
virtual ~Ecole();
void ajouter(Eleve *pEle);
void afficheTout();
void enregistrer();
void recuperer();
private :
Eleve* _pPremier;
Eleve* _pCourant;
};
class Externe : public Eleve
{
public:
Externe(const std::string& nom, const std::string& prenom, const std::string& matricule, int fax);
virtual void affiche() const;
virtual int getSalaire() const;
protected:
int _fax;
};
Externe::Externe(const std::string& nom, const std::string& prenom, const std::string& matricule, int fax)
: Eleve(nom, prenom, matricule), _fax(fax)
{
}
void Externe::affiche() const
{
Eleve::affiche();
std::cout << _fax << std::endl;
}
int Externe::getSalaire() const
{
return 2500;
}
class Interne : public Eleve
{
public:
Interne(const std::string& nom, const std::string& prenom, const std::string& matricule, int prix);
virtual void affiche() const;
virtual int getSalaire() const;
protected:
int _prix;
};
Interne::Interne(const std::string& nom, const std::string& prenom, const std::string& matricule, int prix)
: Eleve(nom, prenom, matricule), _prix(prix)
{
}
void Interne::affiche() const
{
Eleve::affiche();
std::cout << _prix << std::endl;
}
int Interne::getSalaire() const
{
return 1200;
}
Eleve::Eleve(const std::string& nom, const std::string& prenom, const std::string& matricule)
: _nom(nom), _prenom(prenom), _matricule(matricule), _pSuivant(0)
{
}
Eleve* Eleve::getSuivant() const
{
return _pSuivant;
}
void Eleve::setSuivant(Eleve* suivant)
{
_pSuivant = suivant;
}
void Eleve::print(std::ostream& out) const
{
out << _nom << ';';
out << _prenom << ';';
out << _matricule << ';';
}
void Eleve::affiche() const
{
// affiche le contenu avec alignement a gauche
std::cout.setf(std::ios::left, std::ios::adjustfield);
std::cout << " Nom : ";
// width permet de definir le nombre de caractere maxi
std::cout.width(10);
std::cout << _nom;
std::cout << " Prenom : ";
std::cout.width(10);
std::cout << _prenom;
std::cout << " Matricule : ";
std::cout.width(10);
std::cout << _matricule;
std::cout << std::endl;
}
std::ostream& operator<< (std::ostream& out, Eleve* v)
{
v->print(out);
return out;
}
std::istream& operator>> (std::istream& in, Eleve* v)
{
// Recuperation des donnees du Fichier
// (voir fonction recuperer()) jusqu'au caractere ';'
std::getline(in, v->_nom, ';');
std::getline(in, v->_prenom, ';');
std::getline(in, v->_matricule, ';');
return in;
}
Ecole::Ecole()
: _pPremier(0), _pCourant(0)
{
recuperer();
}
void Ecole::enregistrer()
{
//destrcution du fichier ECOLE.TXT
remove("ECOLE.TXT");
std::ofstream fichier("ECOLE.TXT");
if (!fichier)
return;
Eleve* pTemp = 0;// pointeur vers l'objet Eleve
pTemp = _pPremier;
while (pTemp)
{
fichier << pTemp ;
pTemp = pTemp->getSuivant();
}
}
void Ecole::recuperer()
{
std::ifstream fichier("ECOLE.TXT");
if (!fichier)
return;
}
void Ecole::ajouter(Eleve *pEle)
{
if (_pPremier == 0)
{
//initialisation des pointeurs grace a l'objet
_pPremier = pEle;
_pCourant = pEle;
}
else
{
_pCourant->setSuivant(pEle);
_pCourant = _pCourant->getSuivant();
}
}
void Ecole::afficheTout()
{
Eleve *pTemp;
pTemp = _pPremier;
while (pTemp)
{
pTemp->affiche();
pTemp = pTemp->getSuivant();
}
}
Ecole::~Ecole()
{
enregistrer();
// if (_pPremier) : Inutile car delete ne fait
// automatiquement rien si _pPremier == 0
delete _pPremier;
}
Eleve* saisirEleve()
{
bool continuer = true;
int choix;
Eleve *pEle = 0;
std::string nom;
std::string prenom;
std::string matricule;
int prix = 0;
int fax = 0;
while (continuer)
{
std::cout << " Nom : ";
std::getline(std::cin, nom);
std::cout << std::endl << " Prenom : ";
std::getline(std::cin, prenom);
std::cout << std::endl << " Telephone : ";
std::getline(std::cin, matricule);
std::cout << "Vous etes externe a l'entreprise, taper 1" << std::endl
<< "Vous etes interne a l'entreprise, taper 2" << std::endl
<< "Votre choix : ";
std::cin >> choix;
switch (choix)
{
case 1:
std::cout << std::endl << "Prix : ";
std::cin >> prix;
pEle = new Externe(nom, prenom, matricule, prix);
continuer = false;
break;
case 2:
std::cout << std::endl << "Fax : ";
std::cin >> fax;
pEle = new Interne(nom, prenom, matricule, fax);
continuer = false;
break;
default:
std::cerr << "Erreur choix invalide, recommencez" << std::endl;
}
}
return pEle;
}
void menu()
{
Ecole cours;
int option = 0;
bool continuer = true;
while (continuer)
{
std::cout << "\nChoisissez une option de menu \n";
std::cout << "(1-Creation, 2-Afficher Ecole, 0-Pour quitter): ";
std::cin >> option;
std::cin.ignore();
switch (option)
{
case 1 :
cours.ajouter(saisirEleve());
break;
case 2 :
cours.afficheTout();
break;
case 0 :
continuer = false;
break;
default :
std::cerr << std::endl << "Choix invalide\a" << std::endl;
}
}
}
int main()
{
menu();
return 0;
}