/* * Fichier TP3_NumA_E13.cpp à compléter pour le numéro A du TP3, été 2013 * (tableau DYNAMIQUE des personnes) * Ce programme incomplet, permet présentement de : * - lire le fichier met_e13.txt, remplir le tableau dynamique * des personnes, de compter le nombre effectif de personnes lues * - afficher ces personnes avant le tri en utilisant, entre autres, la * fonction membre afficher de la classe Personne * * 1. Surcharger l'opérateur << et adapter la fonction * void afficher(Personne pers[], int nbPers, string mess = "avant le tri") * pour afficher le contenu du tableau des personnes * * 2. Surcharger l'opérateur < et écrire le patron du tri par sélection * pour trier les personnes selon le nom et prénom (champ nomPre) * On réaffiche le contenu du tableau des personnes après le tri * * 3. Adapter la recherche dichotomique des personnes suivantes : * Desmarais Denise, Robitaille Suzanne , Richer Nicole * afin qu'on puisse afficher toutes les personnes trouvées (exemple : * il y a plusieurs Robitaille Suzanne) * * Par LVN pour IFT 1166 */ #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() ; void afficher(); }; // 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() { /* afficher le point de décimal */ cout.setf(ios::showpoint); /* afficher la partie décimale en mode point flottant fixe */ 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; } void continuer() { cout << endl << endl << "Appuyez sur une lettre suivie de Entree " ; char lettre; cin >> lettre ; cout << endl << endl; } /* ------------------------------------------------------ - Auteur : Tremblay Lise, section B - ------------------------------------------------------ - But : Cette méthode permet de lire un fichier - - remplir le tableau des personnes, compter et - - transmettre par référence le nombre de - - personnes lues - ------------------------------------------------------ - Dernière mise à jour : ... - ------------------------------------------------------ */ void lireRemplir(const char nomFichier[], Personne pers[], int & n) { ifstream aLire (nomFichier, ios::in); // localiser et ouvrir pour la lecture n = 0; // initialiser le compteur cout << "On est en train de lire le fichier " << nomFichier << " :\n"; string ligneLue; while ( getline(aLire, ligneLue, '\n')) pers[n++] = Personne(ligneLue); aLire.close(); // fermer le fichier à lire cout << "On a lu " << n << " personnes\n"; } // notez le paramètre par défaut (ici, le dernier paramètre) void afficher(Personne pers[], int nbPers, string mess = "avant le tri") { /* afficher le point de décimal */ cout.setf(ios::showpoint); /* afficher la partie décimale en mode point flottant fixe */ cout.setf(ios :: fixed); cout << "Informations des personnes " << mess << " :\n"; cout << " Rang Nom et prenom Numero Taille Poids Sexe" << endl; for (int i = 0 ; i < nbPers; i++) cout << setw(5) << i << ") ", pers[i].afficher(); cout << endl ; } // Une version de la recherche dichotomique int indDicho(string aChercher, Personne * pers, int nbPers) { int mini = 0, maxi = nbPers - 1, milieu ; int nbCars = aChercher.length(); while (mini <= maxi) { int milieu = (mini + maxi) / 2 ; if ( aChercher < pers[milieu].getNomPre().substr(0, nbCars) ) maxi = milieu - 1 ; else if (aChercher > pers[milieu].getNomPre().substr(0, nbCars) ) mini = milieu + 1 ; else return milieu; } return -1 ; // non trouvé } void rechercher(Personne * pers, int nbPers) { const int LONG_NOMPRE = 30; char nomRecherche[LONG_NOMPRE+1]; // chaîne de caractères en C char reponse; do { cout << "Tapez le nom de la personne recherchee >> "; cin.getline(nomRecherche, LONG_NOMPRE+1, '\n'); strupr(nomRecherche); // en MAJUSCULES toute la chaîne, en C string aChercher = nomRecherche; int indice = indDicho(aChercher, pers, nbPers); if (indice >= 0) // trouvé { cout << "Voici les informations d'une de ces personnes :\n"; pers[indice].afficher(); cout << endl; } else cout << aChercher << " est introuvable\n"; cout << "\nAvez-vous une autre personne a rechercher ? (O/N) "; cin >> reponse; cin.ignore(); } while (reponse == 'o' || reponse == 'O'); } int main() { // déclaration d'un tableau dynamique des personnes const int MAX_PERS = 30; Personne * pers = new Personne[MAX_PERS]; int nbPers; lireRemplir("met_e13.txt", pers, nbPers); afficher(pers, nbPers); // avant le tri continuer(); return 0; } /* Exécution : On est en train de lire le fichier met_e13.txt : On a lu 24 personnes Informations des personnes avant le tri : Rang Nom et prenom Numero Taille Poids Sexe 0) ROY CHANTAL 2754 1.63 54.9 feminin 1) MOLAISON CLAUDE 1848 1.57 62.2 masculin 2) ROBITAILLE SUZANNE 2007 1.79 72.3 feminin 3) BEDARD MARC-ANDRE 2636 1.43 80.5 masculin 4) MONAST STEPHANE 1750 1.65 61.7 masculin 5) JALBERT LYNE 2168 1.63 52.6 feminin 6) DUBE FRANCOISE 4612 1.68 67.5 feminin 7) ROBITAILLE SUZANNE 2325 1.72 65.4 feminin 8) LEMELIN SOPHIE 7777 1.68 57.8 feminin 9) LABELLE LISE 1512 1.79 68.0 feminin 10) RIVERIN HELENE 2340 1.71 60.8 feminin 11) MICHAUD NORMAND 3428 1.73 103.7 masculin 12) RICHER AGATHE 3563 1.65 53.1 feminin 13) BEGIN MARIE-LUCE 4101 1.62 49.0 feminin 14) COUTU PIERRE 4008 1.72 62.1 masculin 15) ROBITAILLE SUZANNE 4371 1.48 61.5 feminin 16) BERGEVIN GUILLAUME 2277 1.84 86.4 masculin 17) DUMITRU PIERRE 3629 1.92 99.4 masculin 18) ROBITAILLE MICHEL 6002 1.78 85.1 masculin 19) FILLION ERIC 2630 1.78 75.7 masculin 20) DESMARAIS DENISE 3215 1.75 58.7 feminin 21) TREMBLAY MARC 3529 1.79 64.9 masculin 22) TREMBLAY SYLVAIN 1538 1.83 86.2 masculin 23) ROBITAILLE SUZANNE 4119 1.58 60.2 feminin Appuyez sur une lettre suivie de Entree Appuyez sur une lettre suivie de Entree k */