/* Fichier Liste_Bis_Pers.cpp Une petite adaptation de liste FIFO et la lecture d'un fichier texte, ici "met_e15.txt" À améliorer + adapter selon vos besoins du TP3 et du final */ #include // entrée-sortie standard #include // formatage (présentation) #include // chaîne de caractères (détails : plus tard) #include #include #include using namespace std; // librairie standard class Personne { private : char sexe; int numero; double taille, poids; string nomPre; public : Personne(char sexe, int numero, double taille, double poids, string nomPre); Personne(string ligneLue); Personne(); string getNomPre() ; char getSexe() { return sexe; } void afficher(); bool operator > (const Personne & autre); bool operator <= (const Personne & autre); bool operator == (const Personne & autre); friend ostream& operator << (ostream&, const Personne&); }; // Partie implémentation Personne::Personne(char sexe, int numero, double taille, double poids, string nomPre) { this->sexe = sexe; this->numero = numero; this->taille = taille; this->poids = poids; this->nomPre = nomPre; } /* 0123456789012345678901234567890123456789012345678901234567890123456789 ROY CHANTAL F 1.63 54.9 2754 MOLAISON CLAUDE M 1.57 62.2 1848 ROBITAILLE SUZANNE F 1.79 72.3 2007 BEDARD MARC-ANDRE M 1.43 80.5 2636 etc... */ Personne::Personne(string ligneLue) { sexe = ligneLue[30]; taille = atof(ligneLue.substr(37,4).c_str()); poids = atof(ligneLue.substr(51,5).c_str()); numero = atoi(ligneLue.substr(64,4).c_str()); nomPre = ligneLue.substr(0, 30); } Personne::Personne() { } string Personne::getNomPre() { return nomPre; } void Personne::afficher() { cout.setf(ios::showpoint); cout.setf(ios :: fixed); cout << setw(30) << nomPre << setw(6) << numero << setw(8) << setprecision(2) << taille << setw(6) << setprecision(1) << poids << setw(10) << ( sexe == 'F' ? "feminin":"masculin") << endl; } bool Personne::operator > (const Personne & autre) { return this->nomPre > autre.nomPre ; } bool Personne::operator <= (const Personne & autre) { return ! ( *this > autre ); } bool Personne::operator == (const Personne & autre) { return this->nomPre == autre.nomPre ; } struct Element { Personne pers ; Element * suivant ; }; ostream& operator << (ostream& sortie, const Personne& unePers) { sortie.setf(ios::fixed); sortie.setf(ios::showpoint); sortie << setw(4) << unePers.sexe << setw(8) << unePers.numero << setw(7) << setprecision(2) << unePers.taille << setw(8) << setprecision(1) << unePers.poids << " " << setw(25) << unePers.nomPre << endl; return sortie; } typedef Element * Pointeur ; void lireRemplir(const char nomALire[], Pointeur & liste) { liste = NULL ; Pointeur dernier ; ifstream aLire (nomALire, ios::in); // localiser et ouvrir pour la lecture string ligneLue; while ( getline(aLire, ligneLue, '\n')) { Pointeur tempo = new Element ; tempo->pers = Personne(ligneLue); tempo->suivant = NULL; if (liste == NULL) liste = dernier = tempo; else { dernier->suivant = tempo ; dernier = tempo; } } aLire.close(); } void afficher(Pointeur liste) { cout << "Contenu de la liste des personnes :\n"; int n = 0; while (liste) { cout << setw(4) << n++ <<") " << liste->pers ; liste = liste->suivant; } } int nombre(char sexeVoulu, Pointeur liste) { int n = 0; while(liste) { if (liste->pers.getSexe() == sexeVoulu) n++; liste = liste->suivant; } return n; } void afficherDernier(char sexeVoulu, Pointeur liste) { Pointeur dernier = liste; while(liste) { if (liste->pers.getSexe() == sexeVoulu) dernier = liste ; liste = liste->suivant; } if (dernier) cout << "Infos du dernier ... dans la liste :\n" << dernier->pers << endl; else cout << "Aucune personne de sexe " << sexeVoulu << " dans la liste " << endl ; } int main() { Pointeur liste; lireRemplir("met_e15.txt",liste); afficher(liste); cout << "Nombre de femmes dans la liste : " << nombre('F', liste) << endl ; int nbHom = nombre('M', liste); cout << "Il y a " << nbHom << " homme(s) dans la liste\n"; afficherDernier('M', liste); return 0; } /* Exécution: Contenu de la liste des personnes : 0) F 2754 1.63 54.9 ROY CHANTAL 1) M 1848 1.57 62.2 MOLAISON CLAUDE 2) F 2007 1.79 72.3 ROBITAILLE SUZANNE 3) M 2636 1.43 80.5 BEDARD MARC-ANDRE 4) M 1750 1.65 61.7 MONAST STEPHANE 5) F 2168 1.63 52.6 JALBERT LYNE 6) F 4612 1.68 67.5 DUBE FRANCOISE 7) F 2325 1.72 65.4 ROBITAILLE SUZANNE 8) F 7777 1.68 57.8 LEMELIN SOPHIE 9) F 1512 1.79 68.0 LABELLE LISE 10) F 2340 1.71 60.8 RIVERIN HELENE 11) M 3428 1.73 103.7 MICHAUD NORMAND 12) F 3563 1.65 53.1 RICHER AGATHE 13) F 4101 1.62 49.0 BEGIN MARIE-LUCE 14) M 4008 1.72 62.1 COUTU PIERRE 15) F 4371 1.48 61.5 ROBITAILLE SUZANNE 16) M 2277 1.84 86.4 BERGEVIN GUILLAUME 17) M 3629 1.92 99.4 DUMITRU PIERRE 18) M 6002 1.78 85.1 ROBITAILLE MICHEL 19) M 2630 1.78 75.7 FILLION ERIC 20) F 3215 1.75 58.7 DESMARAIS DENISE 21) M 3529 1.79 64.9 TREMBLAY MARC 22) M 1538 1.83 86.2 TREMBLAY SYLVAIN 23) F 4119 1.58 60.2 ROBITAILLE SUZANNE Nombre de femmes dans la liste : 13 Il y a 11 homme(s) dans la liste Infos du dernier ... dans la liste : M 1538 1.83 86.2 TREMBLAY SYLVAIN -------------------------------- Process exited after 0.06204 seconds with return value 0 Appuyez sur une touche pour continuer... */