Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Résultats farfelus en C++, besoin d'aide

  1. #1
    Slahwen

    Résultats farfelus en C++, besoin d'aide

    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

    -----


  2. Publicité
  3. #2
    DlzlogicPlus

    Re : Résultats farfelus en C++, besoin d'aide

    Bonjour,
    Je crois que le meilleur conseil qu'on puisse vous donner est d'écrire l'algorithme, et après, on en discute.
    Je précise que j'appelle "algorithme" la liste logique des opérations à réaliser. On peut l'écrire en Français ou sous forme d'un ordinogramme.
    Bonne journée.

  4. #3
    Jack

    Re : Résultats farfelus en C++, besoin d'aide

    Bonjour,

    je te conseille vivement l'utilisation d'un debugger qui te permettra de faire évoluer ton programme instruction par instruction et de visualiser tes variables en même temps.

    Ce qui me semble bizarre dans ton programme, c'est l'appel de la fonction rechSeq (int h = rechSeq(2233, pers, nbPers);) dans laquelle tu passes ton tableau de personnes pers, alors que tu n'a pas initialisé les données de celui-ci.
    Du coup, ta fonction de recherche n'a aucune chance de trouver la personne recherchée.

    Il faudrait également que tu sois plus attentif aux warning générés à la compilation. Normalement, il ne devrait y en avoir aucun alors qu'en compilant sur mon ordi, j'ai vu apparaître de nombreux warning annonçant une possibilité de perte de données lors de conversions de types.

    par exemple, ta classe template devrait permettre de gérer tout type de données décimales (avec une virgule donc). Hors tu calcule la somme des données dans un float ... A quoi bon faire une fonction template dans ce cas?

    Autre exemple:
    Code:
                float tempo = numero[i];
                numero[i] = numero[indMin];
                numero[indMin] = tempo;
    Pourquoi utiliser une variable temporaire de type float pour échanger 2 entiers ????

    Etc.

  5. #4
    Slahwen

    Re : Résultats farfelus en C++, besoin d'aide

    J'ai refait un bout du programme en recopiant l'exemple qu'à donné mon professeur, et je ne comprends toujours pas où est l'erreur. Le programme compte bien le nombre de personnes, mais n'est pas capable de compter le nombre de femmes et d'hommes, pourtant c'est exactement le même code (adapté à mon ficher .txt)

    Pour ce qui est des warning lors de la compilation, je n'en ai pas qui apparaissent, j'utilise les niveaux d'avertissement -Wall et -Wextra.

    Ensuite pour l'appel de la fonction rechSeq (int h = rechSeq(2233, pers, nbPers); ), je ne comprends pas quand tu me dit que je n'ai pas initialisé le tableau, ce n'est pas ce que fait la fonction lireRemplir ?


    Voici le code exemple du professeur :
    Code:
    /* Fichier structure.cpp
    
    */
    
    #include <iostream>  // pour entr�e-sortie  cin, cout
    #include <iomanip>   // pour le formatage
    #include <fstream>   // pour les fichiers
    #include <string>
    #include <float.h>
    
    using namespace std; // librairie standard
    
    struct Employe
    {
       char sexe ;
       int  numero;
       float salHebdo ;
    
       void afficher(string mess)
       {
            cout << mess << " :\n";
            cout << "sexe             : " << (sexe == 'F'? "feminin" : "masculin") << endl ;
            cout << "numero           : " << numero << endl ;
            cout << "sal. hebdo.      : " << salHebdo << " $\n\n";
    
    
       }
    
    };
    
       /* cette fonction est expliqu�e en classe :
          Elle permet de lire le fichier � partir de son nom,
          de remplir le tableau des employes et de transmettre via
          reference le nombre d'employes lus.
       */
    
    
        void lireRemplir(const char nomALire[], Employe emp[], int & n)
         {
            float nbHr, tauxHr;
            ifstream  aLire (nomALire, ios::in); // localiser et ouvrir pour la lecture
    
    	    n = 0; // initialiser le compteur
    
    		while (aLire >> emp[n].sexe >> emp[n].numero >> nbHr >> tauxHr)
                emp[n++].salHebdo = nbHr * tauxHr; // n++ lire puis incrementé
    
    		aLire.close();
         }
    
    	 void compter(Employe emp[], int nbEmp, int &nbF, int & nbH)
    	 {
             nbH = nbF = 0;
             for(int i = 0; i < nbEmp; i++)
                if (emp[i].sexe == 'F')
                     nbF++;
                else nbH++;
         }
    
         int indMax(char sexeVoulu, Employe emp[], int nbEmp)
         {
            int ind = -1 ;
            float salMax = - FLT_MAX;
    
            for(int i = 0; i < nbEmp; i++)
              if (emp[i].sexe == sexeVoulu && emp[i].salHebdo > salMax)
                {
                   salMax = emp[i].salHebdo;
                   ind = i;
                }
    
            return ind;
         }
    
         void creer(Employe emp[], int nbEmp, const char nomACreer[],
    	                   float borne)
    	 {
    
    	 	ofstream  aCreer (nomACreer, ios::out);
    	 	aCreer.setf(ios::fixed);
    	 	aCreer.setf(ios::showpoint);
    
    	 	for(int i = 0; i < nbEmp; i++)
    	 	  if (emp[i].salHebdo >= borne)
    	 	    aCreer << emp[i].sexe << setw(6) << emp[i].numero
    	 	           << setw(10) << setprecision(2)
    	 	           << emp[i].salHebdo << endl ;
    	 	aCreer.close()           ;
    	 }
    
    int main() {
    
    
     const int MAX_EMP = 100;
     Employe emp[MAX_EMP];
     int nbEmp ;
    
     lireRemplir("employe.txt", emp, nbEmp); // lire, remplir un tableau de structure, compter nbElem
     cout << "On vient de lire " << nbEmp << " employes\n";
    
    
     int nbFem, nbHom;
     compter(emp, nbEmp, nbFem, nbHom);
     cout << "On a lu " <<  nbFem << " femme(s) et "
          << nbHom << " homme(s)\n";
    
     if (nbFem > 0)
     {
         int k = indMax('F', emp, nbEmp);
         emp[k].afficher("Infos de la femme ayant le meilleur salaire hebdo");
     }
     else
         cout << "Pas de femmes traitees\n";
    
     creer(emp, nbEmp, "employe.res", 800.00);
     cout << "Fin de la creation du fichier\n";
    
     return 0;
    
    
    }
    /* Ex�cution:
    On a lu 43 femme(s) et 47 homme(s)
    Infos de la femme ayant le meilleur salaire hebdo :
    sexe             : feminin
    numero           : 272
    sal. hebdo.      : 1000 $
    
    
    fin de la creation du fichier
    
    --------------------------------
    Process exited after 14.53 seconds with return value 0
    Appuyez sur une touche pour continuer...
    */


    Et mon code inspiré de celui-ci :
    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 de compter le nombre d'hommes et de femmes.
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      */
    
      void compter(Personnes pers[], int nbElem, int &nbF, int &nbH)
      {
            nbH = nbF = 0;
            for(int i = 0; i < nbElem; i++)
               if (pers[i].sexe == 'F')
                    nbF++;
               else nbH++;
        }
    
    
    
    
      /*
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      Cette fonction permet de determiner une valeure maximum.
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      */
    
    
      int indMax(char sexeVoulu, Personnes pers[], int nbElem)
      {
         int ind = -1 ;
         float numeroMax = - FLT_MAX;
    
         for(int i = 0; i < nbElem; i++)
           if (pers[i].sexe == sexeVoulu && pers[i].numero > numeroMax)
             {
                numeroMax = pers[i].numero;
                ind = i;
             }
    
         return ind;
      }
    
    
    
    
         void creer(Personnes pers[], int nbElem, const char nomACreer[],
    	                   int borne)
    	 {
    
    	 	ofstream  aCreer (nomACreer, ios::out);
    	 	aCreer.setf(ios::fixed);
    	 	aCreer.setf(ios::showpoint);
    
    	 	for(int i = 0; i < nbElem; i++)
    	 	  if (pers[i].numero >= borne)
    	 	    aCreer << pers[i].sexe << setw(6) << pers[i].numero
    	 	           << setw(10) << setprecision(2) << pers[i].taille
    	 	           << setw(10) << setprecision(2) << pers[i].poids << endl ;
    	 	aCreer.close()           ;
    	 }
    
    
    
    
    
      /*
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      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" ;
    
    
     int nbF = 0, nbH = 0;
     compter(pers, nbPers, nbF, nbH);
     cout << "On a lu " <<  nbF << " femme(s) et "
          << nbH << " homme(s)\n";
    
    
    
      /*
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      Appel pour determiner une valeure maximum.
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      */
    
      if (nbF > 0)
      {
          int k = indMax('F', pers, nbPers);
          pers[k].afficher("Infos de la femme ayant le meilleur numero");
      }
      else
          cout << "Pas de femmes traitees\n";
    
    
     creer(pers, nbPers, "imp_h18.res", 7890);
     cout << "Fin de la creation du fichier\n";
    
     return 0;
    }
    
      /*
      Execution :
    
      On vient de lire les informations de 21 personnes
    
    On a lu 0 femme(s) et 21 homme(s)
    Pas de femmes traitees
    Fin de la creation du fichier
    
    --------------------------------
    Process exited after 15.44 seconds with return value 0
    Appuyez sur une touche pour continuer...
      */

    PS: Par contre je ne comprends pas à quoi sert la fonction "creer"
    Dernière modification par Slahwen ; 11/02/2018 à 17h47.

  6. #5
    Jack

    Re : Résultats farfelus en C++, besoin d'aide

    je ne comprends pas quand tu me dit que je n'ai pas initialisé le tableau, ce n'est pas ce que fait la fonction lireRemplir ?
    Si, mais pas dans le code que tu as donné dans ton premier message:
    Code:
     void lireRemplir(const char nomALire[], int numero[], char sexe[],                       float taille[], float poids[], int * p)
    je n'y vois pas de paramètre de type Personne. En revanche, le code de ton prof le fait bien, lui.
    Code:
     void lireRemplir(const char nomALire[], Employe emp[], int & n)
    Dernière modification par Jack ; 11/02/2018 à 18h01.

  7. #6
    Slahwen

    Re : Résultats farfelus en C++, besoin d'aide

    Oh merci ça fonctionne beaucoup mieux !
    C'est pas encore parfait mais au moins j'ai plus l'impression de pédaler dans la semoule !

    Par contre j'ai garder les 2 fonctions lireRemplir sinon à l'affichage du tableau ça donné des choses étranges...

    Mon nouveau lireRemplir :
    Fonction :
    Code:
        void lireRemplir(const char nomALire[], Personnes pers[], int &n)
         {
        	int nbPieds, nbPouces, nbLivres;
            const float PIED_EN_METRE = 0.3048,
                       LIVRE_EN_KG = 0.454;
    
            ifstream  aLire (nomALire, ios::in);
    
    	    n = 0;
    
    		while (aLire >> pers[n].sexe >> pers[n].numero >> nbPieds >> nbPouces >> nbLivres) 
    				pers[n++].taille = (nbPieds + nbPouces /12.0) * PIED_EN_METRE;
    				pers[n++].poids = nbLivres * LIVRE_EN_KG ;
    
    		aLire.close();
    
    	}
    Appel :
    Code:
     lireRemplir("imp_h18.txt", pers, nbPers);
     cout << "On vient de lire les informations de " << nbPers << " personnes\n\n" ;

  8. #7
    Jack

    Re : Résultats farfelus en C++, besoin d'aide

    Ca risque d'être long vu le nombre d'erreurs qu'il reste à corriger. Pourquoi ne te sers-tu pas d'un debugger comme je te l'ai déjà proposé? Les erreurs sautent aux yeux!

    1- l'affichage indique 22 personnes alors qu'il y en a que 21 => gestion de fin de fichier à revoir.
    2- il faut savoir qu'après un while, tu n'as droit qu'à UNE SEULE INSTRUCTION. Si tu en veux davantage, il faut les encadrer par des accollades. Du coup, ne poids n'est calculé qu'une seule fois.

Discussions similaires

  1. Besoin d'interpetation des resultats
    Par le-chat61 dans le forum Physique
    Réponses: 17
    Dernier message: 29/04/2012, 15h56
  2. svp besoin de confirmation de mes resultats
    Par TEPPAZ dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 25/01/2009, 10h44
  3. besoin de confirmation des resultats
    Par TEPPAZ dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 11/01/2009, 23h31
  4. Comprendre des résultats d'analyses sanguines ... besoin d'aide
    Par kataggenah dans le forum Santé et médecine générale
    Réponses: 2
    Dernier message: 06/06/2008, 18h34