/* * Fichier TP3_NumA_E12.cpp à compléter pour le numéro A du TP3, été 2012 * (tableau DYNAMIQUE des personnes) * Ce programme incomplet, permet présentement de : * - lire le fichier met_e12.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'elle affiche toutes les personnes trouvées (exemple * 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 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; } /* 012345678901234567890123456789012345678901234567890123456789 F 1.63 54.9 2754ROY CHANTAL M 1.57 62.2 1848MOLAISON CLAUDE F 1.63 54.9 2754ROY CHANTAL M 1.57 62.2 1848MOLAISON CLAUDE */ Personne::Personne(string ligneLue) { sexe = ligneLue[0]; taille = atof(ligneLue.substr(7,4).c_str()); poids = atof(ligneLue.substr(21,5).c_str()); numero = atoi(ligneLue.substr(34,4).c_str()); nomPre = ligneLue.substr(38); } 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(char nomFichier[], Personne pers[], int & n) { ifstream aLire (nomFichier, ios::in); // localiser et ouvrir pour la lecture n = 0; // initialiser le compteur string ligneLue; while ( getline(aLire, ligneLue, '\n')) pers[n++] = Personne(ligneLue); aLire.close(); // fermer le fichier à lire } // 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 = 25; Personne * pers = new Personne[MAX_PERS]; int nbPers; lireRemplir("met_e12.txt", pers, nbPers); afficher(pers, nbPers); // avant le tri continuer(); return 0; } /* Exécution : 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) BEDARD MARC-ANDRE 2636 1.43 80.5 masculin 3) MONAST STEPHANE 1750 1.65 61.7 masculin 4) JALBERT LYNE 2168 1.63 52.6 feminin 5) DUBE FRANCOISE 4612 1.68 67.5 feminin 6) ROBITAILLE SUZANNE 2325 1.72 65.4 feminin 7) LABELLE LISE 1512 1.79 68.0 feminin 8) RIVERIN HELENE 2340 1.71 60.8 feminin 9) MICHAUD NORMAND 3428 1.73 103.7 masculin 10) RICHER AGATHE 3563 1.65 53.1 feminin 11) BEGIN MARIE-LUCE 4101 1.62 49.0 feminin 12) ROBITAILLE SUZANNE 4371 1.48 61.5 feminin 13) DUMITRU PIERRE 3629 1.92 99.4 masculin 14) FILLION ERIC 2630 1.78 75.7 masculin 15) DESMARAIS DENISE 3215 1.75 58.7 feminin 16) TREMBLAY MARC 3529 1.79 64.9 masculin 17) TREMBLAY SYLVAIN 1538 1.83 86.2 masculin 18) ROBITAILLE SUZANNE 4119 1.58 60.2 feminin Appuyez sur une lettre suivie de Entree k */