Salut !
J'ai un problème avec mon code en C++, il me donne des données farfelus et impossible de trouver où est le problème.
Le programme, après lecture d'un ficher .txt, doit afficher le tableau (présent dans ce fichier .txt), le trier, calculer des moyennes, trouver la valeur la plus grande, et faire une recherche séquentielle.
Toute les fonctions s'exécutes, afficher le tableau et le trier fonctionne correctement. Le problème vient des autres fonctions, j'ai l'impression que mon programme n'arrive pas à récupérer les données pour les afficher.
Ps : Je fais ce programme dans le cadre d'un cours en université, c'est arrangés pour les programmeurs de C, c'est pourquoi il y a un mélange de C et de C++ (même si l'extension du fichier est bien .cpp et non .c).
Quelqu'un pourrais m'aider à trouver le problème et m'expliquer ? Il faudrait que j'arrive à comprendre pour assurer mon examen ^^
Voici le code ainsi que son exécution :
Code:#include <iostream> #include <iomanip> #include <fstream> #include <string> #include <float.h> using namespace std; struct Personnes { int numero; char sexe; float taille, poids; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cette fonction d afficher les informations. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ void afficher(string mess) { cout << mess << " :\n"; cout << "numero : " << numero << endl ; cout << "sexe : " << (sexe == 'F'? "feminin" : "masculin") << endl ; cout << "taille : " << taille << " m\n"; cout << "poids : " << poids << " kg\n\n"; } }; void lireRemplir(const char nomALire[], int numero[], char sexe[], float taille[], float poids[], int * p) { const float PIED_EN_METRE = 0.3048, LIVRE_EN_KG = 0.454; int nbPieds, nbPouces, nbLivres; ifstream aLire (nomALire, ios::in); int n = 0; while (aLire >> sexe[n] >> numero[n] >> nbPieds >> nbPouces >> nbLivres) { taille[n] = (nbPieds + nbPouces /12.0) * PIED_EN_METRE; poids[n] = nbLivres * LIVRE_EN_KG ; n++; } aLire.close(); *p = n ; } /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cette fonction permet d afficher les tableaux. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ void afficherTab(int numero[], char sexe[], float taille[], float poids[], int nbElem, const char message[]) { cout.setf(ios::fixed); cout.setf(ios::showpoint); cout <<*"Contenu des 4 tableaux " << message << endl; cout << "numero sexe taille poids\n"; for(int i = 0; i < nbElem; i++) cout << setw(7) << numero[i] << setw(5) << sexe[i] << setw(9) << setprecision(2) << taille[i] << setw(7) << setprecision(2) << poids[i] << endl; cout << endl; } /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cette fonction permet de determiner une valeure maximum. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ int indMax(string voulu, Personnes pers[], int nbElem) { int ind = -1; float valMax = -FLT_MAX; if (voulu == "poids") { for(int i = 0; i < nbElem; i++) { if (pers[i].poids > valMax) { valMax = pers[i].poids; ind = i; } } } if (voulu == "taille") { for(int i = 0; i < nbElem; i++) { if (pers[i].taille > valMax) { valMax = pers[i].taille; ind = i; } } } return ind; } /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cette fonction permet de faire une recherche sequentielle. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ int rechSeq(int numVoulu, Personnes pers[], int nbElem) { int val; for(int i=0; i<nbElem-1; i++) if(pers[i].numero == numVoulu) { val = i; i = 2*nbElem; cout << "les infos de la personne " << numVoulu << ":\n"; } return val; } /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cette fonction permet de trier les tableaux. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ void trier(int numero[], char sexe[], float taille[], float poids[], int nbPers) { for(int i = 0; i < nbPers-1; i++) { int indMin = i; for(int j = i+1; j < nbPers; j++) if (numero[j] < numero[indMin]) indMin = j; if (indMin != i) { float tempo = numero[i] ; numero[i] = numero[indMin]; numero[indMin] = tempo; char tempo2 = sexe[i]; sexe[i] = sexe[indMin]; sexe[indMin] = tempo2; float tempo3 = taille[i] ; taille[i] = taille[indMin]; taille[indMin] = tempo3; tempo3 = poids[i] ; poids[i] = poids[indMin]; poids[indMin] = tempo3; } } } /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cette fonction permet de calculer une moyenne. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ template <class T> float moyenne(char sexeVoulu, T tab[], Personnes pers[], int nbElem) { float somme = 0.0; int nbSexe = 0; for(int i = 0; i < nbElem; i++) { if(pers[i].sexe == sexeVoulu) { somme += tab[i]; nbSexe++; } } return somme/nbSexe; } /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fonction principale +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ int main() { const int MAX_PERS = 25; int numero[MAX_PERS]; char sexe[MAX_PERS]; float taille[MAX_PERS], poids[MAX_PERS]; int nbPers; Personnes pers[MAX_PERS]; lireRemplir("imp_h18.txt", numero, sexe, taille, poids, &nbPers); cout << "On vient de lire les informations de " << nbPers << " personnes\n\n" ; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Appel pour afficher les tableaux. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ afficherTab(numero, sexe, taille, poids, nbPers, "avant le tri :"); /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Appel pour la recherche sequentielle +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ if (nbPers > 0) { int h = rechSeq(2233, pers, nbPers); pers[h].afficher("Infos de la personne 2233 avant tri"); } else cout << "Pas de personnes traitees\n"; if (nbPers > 0) { int h = rechSeq(4177, pers, nbPers); pers[h].afficher("Infos de la personne 4177 avant tri"); } else cout << "Pas de personnes traitees\n"; if (nbPers > 0) { int h = rechSeq(9876, pers, nbPers); pers[h].afficher("Infos de la personne 9876 avant tri"); } else cout << "Pas de personnes traitees\n"; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Appel pour determiner une valeure maximum. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ string P = "poids", T = "taille"; if (nbPers > 0) { int k = indMax(P, pers, nbPers); pers[k].afficher("Infos de la personne la plus lourde\n"); } else cout << "Pas de personnes traitees\n\n"; if (nbPers > 0) { int k = indMax(T, pers, nbPers); pers[k].afficher("Infos de la personne la plus grande\n"); } else cout << "Pas de personnes traitees\n\n"; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Appel de la fonction pour calaculer la moyenne +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ cout << "La moyenne de la taille des femmes est : " << moyenne('F', taille, pers, nbPers) << "m" << endl; cout << "La moyenne du poids des hommes est : " << moyenne('M', poids, pers, nbPers) << "kg" << endl; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Appel de la fonction pour trier +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ trier(numero, sexe, taille, poids, nbPers); /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Appel de la fonction pour afficher les tableaux. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ afficherTab(numero, sexe, taille, poids, nbPers, "apres le tri :"); /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Appel de la fonction pour la recherche sequentielle +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ if (nbPers > 0) { int h = rechSeq(2233, pers, nbPers); pers[h].afficher("Infos de la personne 2233 apres tri"); } else cout << "Pas de personnes traitees\n"; if (nbPers > 0) { int h = rechSeq(4177, pers, nbPers); pers[h].afficher("Infos de la personne 4177 apres tri"); } else cout << "Pas de personnes traitees\n"; if (nbPers > 0) { int h = rechSeq(9876, pers, nbPers); pers[h].afficher("Infos de la personne 9876 apres tri"); } else cout << "Pas de personnes traitees\n"; return 0; } /* Ex�cution: On vient de lire les informations de 21 personnes Contenu des 4 tableaux avant le tri : numero sexe taille poids 2187 F 1.68 81.72 4148 M 1.80 83.99 2233 M 1.85 85.35 4433 F 1.47 55.84 2108 F 1.70 74.91 7890 M 1.88 90.80 4100 M 1.65 54.03 2176 M 1.88 86.71 5423 M 1.75 66.74 4169 M 1.68 55.84 4177 F 1.75 62.65 2879 M 1.88 86.71 5477 F 1.80 66.74 4869 M 1.60 73.55 4354 F 1.68 63.11 2235 M 1.88 85.81 5444 M 1.78 68.55 4198 F 1.75 56.75 5678 M 2.01 90.80 1357 M 1.68 70.37 3498 F 1.50 61.29 Infos de la personne 2233 avant tri : numero : 1512448 sexe : masculin taille : 0.00 m poids : 0.00 kg Infos de la personne 4177 avant tri : numero : 1512448 sexe : masculin taille : 0.00 m poids : 0.00 kg Infos de la personne 9876 avant tri : numero : 1512448 sexe : masculin taille : 0.00 m poids : 0.00 kg Infos de la personne la plus lourde : numero : -487823824 sexe : masculin taille : -5925681015506954354688.00 m poids : 0.00 kg Infos de la personne la plus grande : numero : 32 sexe : masculin taille : 0.00 m poids : 0.00 kg La moyenne de la taille des femmes est : nanm La moyenne du poids des hommes est : nankg Contenu des 4 tableaux apres le tri : numero sexe taille poids 1357 M 1.68 70.37 2108 F 1.70 74.91 2176 M 1.88 86.71 2187 F 1.68 81.72 2233 M 1.85 85.35 2235 M 1.88 85.81 2879 M 1.88 86.71 3498 F 1.50 61.29 4100 M 1.65 54.03 4148 M 1.80 83.99 4169 M 1.68 55.84 4177 F 1.75 62.65 4198 F 1.75 56.75 4354 F 1.68 63.11 4433 F 1.47 55.84 4869 M 1.60 73.55 5423 M 1.75 66.74 5444 M 1.78 68.55 5477 F 1.80 66.74 5678 M 2.01 90.80 7890 M 1.88 90.80 Infos de la personne 2233 apres tri : numero : 1512448 sexe : masculin taille : 0.00 m poids : 0.00 kg Infos de la personne 4177 apres tri : numero : 1512448 sexe : masculin taille : 0.00 m poids : 0.00 kg Infos de la personne 9876 apres tri : numero : 1512448 sexe : masculin taille : 0.00 m poids : 0.00 kg -------------------------------- Process exited after 4.565 seconds with return value 0 Appuyez sur une touche pour continuer... */
Le fichier .txt :
F 2187 5 6 180
M 4148 5 11 185
M 2233 6 1 188
F 4433 4 10 123
F 2108 5 07 165
M 7890 6 2 200
M 4100 5 5 119
M 2176 6 2 191
M 5423 5 9 147
M 4169 5 6 123
F 4177 5 9 138
M 2879 6 2 191
F 5477 5 11 147
M 4869 5 3 162
F 4354 5 6 139
M 2235 6 2 189
M 5444 5 10 151
F 4198 5 9 125
M 5678 6 7 200
M 1357 5 6 155
F 3498 4 11 135
-----