Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème algorithme

Saisie, tri, sauvegarde et suppression

Sujet résolu
    2 septembre 2007 à 23:05:36

    Je rencontre ces problèmes dans les algorithmes suivants:

    1. void saisie, je ne peut introduire de nom avec un ESPACE (ex: Jean Jacques ;-))
    2. void tri, ne s'effectue que par code et non par ordre alphabétique.
    3. void supp fonctionne une fois, ensuite bug.
    4. void save, la question du prof est "On demande à l'utilisateur d'introduire un seuil(int) (>0 && <100) (avec test). Pour chaque 'element", si la somme de ses cotes est supérieure au seuil, on l'enregistrera dans un fichier "Fich.txt".



    1. #include <iostream>
    2. #include <string>
    3. #include <fstream>
    4. using namespace std;
    5. const int NE_MAX=20;
    6. const int NC_MAX=5;
    7. const int MAX=30;
    8. struct element{
    9.         char nom[MAX];
    10.         char code;
    11.         int cotes[NC_MAX];
    12. };
    13. void menu(int &choix){
    14.         cout<<"\n1. Saisie et Affichage du tableau"<<endl;
    15.         cout<<"2. Tri par ordre alphabetique par nom et code"<<endl;
    16.         cout<<"3. Suppression d'un element apres localisation"<<endl;
    17.         cout<<"4. Sauvergarde"<<endl;
    18.         cout<<"5. Arret du programme"<<endl<<endl;
    19.         cout<<"Entrez votre CHOIX : ";
    20.         cin>>choix;
    21. }
    22. void saisie (element t[], int &NE, int &NC){
    23.         int i,j;
    24.         do{
    25.                 cout<<"\nEntrez le nombre d'etudiants : "<<endl;
    26.                 cin>>NE;
    27.         }while(NE<1||NE>NE_MAX);
    28.         do{
    29.                 cout<<"\nEntrer le nombre de cotes : "<<endl;
    30.                 cin>>NC;
    31.         }while(NC<1||NC>NC_MAX);
    32.         for(i=0; i<NE; i++){
    33.                 cout<<"\nEntrer le nom de l'etudiant "<<i+1<<" : ";
    34.                 cin>>t[i].nom;
    35.                 cout<<"\nEntrer son code : ";
    36.                 cin>>t[i].code;
    37.                         for(j=0; j<NC; j++){
    38.                                 cout<<"\nEntrer la cote "<<j+1<<" : ";
    39.                                 cin>>t[i].cotes[j];
    40.                         }
    41.         }
    42. }
    43. void affiche (element t[], int NE, int NC){
    44.         int i,j;
    45.         cout<<"\nLe tableau est le suivant : "<<endl;
    46.         for(i=0;i<NE;i++){
    47.                 cout<<"Nom "<<i+1<<" : "<<t[i].nom<<endl;
    48.                 cout<<"Code : "<<t[i].code<<endl;
    49.                 for(j=0;j<NC;j++){
    50.                         cout<<"Cote "<<j+1<<" : "<<t[i].cotes[j]<<endl;
    51.                 }
    52.         }
    53. }
    54. void tri(element t[], int NE){
    55.         bool fin, fini;
    56.         int i;
    57.         element temp, tmp;
    58.         do{
    59.                 fin=true;
    60.                 for(i=0;i<NE-1;i++){
    61.                         if(t[i].nom>t[i+1].nom){
    62.                                 tmp=t[i];
    63.                                 t[i]=t[i+1];
    64.                                 t[i+1]=tmp;
    65.                                 fin=false;
    66.                         }
    67.                 }
    68.         }while(fin==false);
    69.         do{
    70.                 fini=true;
    71.                 for(i=0;i<NE-1;i++){
    72.                         if(t[i].code>t[i+1].code){
    73.                                 tmp=t[i];
    74.                                 t[i]=t[i+1];
    75.                                 t[i+1]=tmp;
    76.                                 fini=false;
    77.                         }
    78.                 }
    79.         }while(fini==false);
    80. }
    81. void dico(element t[], int NE, string delnom, int&pos, bool &trouve){
    82.         int fin=NE-1, deb=0, mil;
    83.         trouve=false;
    84.         while(deb<=fin && trouve==false){
    85.                 mil=(fin + deb)/2;
    86.                 if(delnom==t[mil].nom){
    87.                         trouve=true;
    88.                 }
    89.                 else if(t[mil].nom<delnom){
    90.                         deb=mil+1;
    91.                 }
    92.                 else{
    93.                         fin=mil-1;
    94.                 }
    95.         }
    96.         pos=mil;
    97. }
    98. void supp(element t[], int&NE, int pos){
    99.         int i;
    100.         for(i=pos; i<NE; i++){
    101.                 t[i]=t[i+1];
    102.         }
    103.         NE=NE-1;
    104. }
    105. void save(element t[], int NE, int NC){
    106.         ofstream save;
    107.         save.open("fichier.txt");
    108.         if(save){
    109.                 cout<<"No error!"<<endl;
    110.                 int i,j;
    111.                 save<<NE<<endl;
    112.                 save<<NC<<endl;
    113.                 for(i=0;i<NE;i++){
    114.                         save<<t[i].nom<<endl;
    115.                         save<<t[i].code<<endl;
    116.                         for(j=0;j<NC;j++){
    117.                                 save<<t[i].cotes[j]<<endl;
    118.                         }
    119.                 }
    120.                 save.close();
    121.         }
    122.         else{
    123.                 cout<<"Error!"<<endl;
    124.         }
    125. }
    126. void main(){
    127.         element t[NE_MAX];
    128.         int choix=0;
    129.         int NE, NC;
    130.         int a=0;
    131.         bool trouve=false;
    132.         int pos=0;
    133.         string delnom;
    134.         while(a==0){
    135.                 do{
    136.                         menu(choix);
    137.                 }while(choix<1||choix>5);
    138.                 switch (choix){
    139.                         case 1:
    140.                                 saisie (t,NE,NC);
    141.                                 affiche (t,NE,NC);
    142.                                 break;
    143.                         case 2:
    144.                                 tri(t,NE);
    145.                                 affiche (t,NE,NC);
    146.                                 break;
    147.                         case 3:
    148.                                 cout<<"Entrer le nom a supprimer : ";
    149.                                 cin>>delnom;
    150.                                 dico(t,NE,delnom,pos,trouve);
    151.                                 if(trouve==true){
    152.                                         supp(t,NE,pos);
    153.                                 }
    154.                                 affiche(t,NE,NC);
    155.                                 break;
    156.                         case 4:
    157.                                 save(t,NE,NC);
    158.                                 break;
    159.                         case 5:
    160.                                 a=a+1;
    161.                                 break;
    162.                 }
    163.         };
    164. }
    • Partager sur Facebook
    • Partager sur Twitter
      2 septembre 2007 à 23:30:55

      Citation : Valoute

      Je rencontre ces problèmes dans les algorithmes suivants:

      1. void saisie, je ne peut introduire de nom avec un ESPACE (ex: Jean Jacques ;-))
      2. void tri, ne s'effectue que par code et non par ordre alphabétique.
      3. void supp fonctionne une fois, ensuite bug.
      4. void save, la question du prof est "On demande à l'utilisateur d'introduire un seuil(int) (>0 && <100) (avec test). Pour chaque 'element", si la somme de ses cotes est supérieure au seuil, on l'enregistrera dans un fichier "Fich.txt".



      1. #include <iostream>

      Pas du C. Le C++, c'est forum d'à-coté...
      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        3 septembre 2007 à 0:04:07

        Bonjour,
        Un prénom à espace n'existe pas à ma connaissance, on met un trait d'union... Mais bon, à mon avis, un cin ne suffit pas, tu devrais peut-être utiliser une fonction comme getchar pour boucler jusqu'à ce que l'utilisateur tape entrée...
        Pour le tri, j'ai pas regardé en détail, mais j'ai l'impression que tu tries d'abord alphabétiquement, puis selon le code, ce qui annule le premier tri...
        Pour supp, je ne vois pas d'où ca vient... Surveille pendant l'exécution les valeurs de NE et pos, vérifie qu'elles ne sont jamais supérieures (ou égales) au nombre de cases total de ton tableau d'élément.
        Pour la dernière, j'ai pas bien compris le problème...

        en espérant t'avoir aidé
        à+
        • Partager sur Facebook
        • Partager sur Twitter
          3 septembre 2007 à 0:11:39

          1- std::getline
          2- Deux problèmes : tu tri deux fois selon deux critère différents. Définis-toi un critère de comparaison. De plus tu ne peux pas comparer des buffers de caractères avec '<'. S tu utilisais des std::string, tu pourrais.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            3 septembre 2007 à 7:58:56

            void saisie
            En fait, ce sont des noms (ex: van cool), et dans le cours apparemment, le prof désire l'utilisation d'un "getline", j'avais donc essayé en faisant :
            1. for(i=0; i<NE; i++){
            2.                 cout<<"\nEntrer le nom de l'etudiant "<<i+1<<" : ";
            3.                 cin>>t[i].nom;
            4.                 cin.getline(t[i].nom,MAX)


            (J'ai essayé en supprimant le "cin>>t[i].nom;" mais là ça ne fonctionne pas.)
            De la façon ci-dessus, ça fonctionne SAUF que dans l'affichage il ne me met que ce qui se trouve après le premier nom (ex: cool)

            void tri

            En fait, l'algorithme, écrit de cette phaçon fonctionne en théorie (j'ai identiquement la même chose dans un autre programme) mais le nom est sous forme de "string" tandis qu'ici c'est un "char"(je ne peux pas modifier ça).
            • Partager sur Facebook
            • Partager sur Twitter
              3 septembre 2007 à 8:16:10

              1- faut purger le buffer d'entrée entre un >> et un getline ; déjà répondu hier à quelqu'un d'autre

              2- je doute fort que cet algo fonctionne.
              Sinon, si tu dois utiliser des structures C pour tes chaines, alors utilises des focntions C pour les comparaisons -> strcmp
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                3 septembre 2007 à 9:11:32

                Si ça intéresse quelqu'un, j'ai trouvé la solution pour le void saisie:

                Comme je travaille dans une boucle for( ; ; ) avec des char:

                On remplace le "cin>>" par :
                1. cin.ignore();
                2. getline(t[i].nom,MAX);


                voila merci pour mon aide:-p
                • Partager sur Facebook
                • Partager sur Twitter
                  3 septembre 2007 à 22:34:56

                  Ce n'est pas la bonne utilisation de ignore. De nouveau regarde les messages d'hier. Cette exacte même question a été posée et on y a répondu.

                  (Potentiellement, c'est dans la FAQ C++ de developpez)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                    4 septembre 2007 à 5:27:23

                    Si c'est pour remettre à ton prof : s.v.p met des espaces...

                    De plus un "while( fin == false );" mon prof m'aurait coulé

                    Voici ce qui théoriquement fonctionne pour le tri
                    1. #
                    2. void tri( element t[], int NE )
                    3. {
                    4.     bool fin;
                    5.     int i;
                    6.     element temp, tmp;
                    7.     do
                    8.     {
                    9.         fin = true;
                    10.         for( i = 0; i < NE - 1; i++ )
                    11.         {
                    12.             if( strcmp( t[ i ].nom, t[ i + 1 ].nom ) > 0 || ( strcmp( t[ i ].nom, t[ i + 1 ].nom ) == 0 && t[ i ].code > t[ i + 1 ].code ) )
                    13.             {
                    14.                 tmp = t[ i ];
                    15.                 t[ i ] = t[ i + 1 ];
                    16.                 t[ i + 1 ] = tmp;
                    17.                 fin = false;
                    18.             }
                    19.         }
                    20.     }
                    21.     while( !fin );
                    22. }


                    Ce que j'ai modifié : la condition dans le while ;) et la vérification des 2 conditions en même temps. Ton algorithme triait une fois les valeur de nom et ensuite retriait les valeurs de code. Utilise ton débuggeur pour ce genre d'erreurs.

                    NOTE : l'utilisation de strcmp est peut-être inexacte. Je l'ai mît d'après le commentaire de Imghs.

                    supp : fait attention à ne pas déborder de ton tableau... qu'arrivera-t-il si tu as NE_MAX éléments?
                    de plus selon ta méthode le dernier existe 2 fois après ton premier passage. Réinitialise ton NE - 1 élément avec un élément vide. Solution simple :
                    Créer un element e
                    Décrémenter NE
                    Utiliser la même boucle : de i = pos à i < NE
                    affecter e à t[ NE ]

                    encore une fois optionnellement "NE = NE - 1;" devient facilement "NE--;"
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 septembre 2007 à 11:37:48

                      Merci à toi MatteX pour cet fonction qui s'exécute très bien:-)
                      Merci aussi à Imghs, même si j'ai pas son niveau:-p
                      Mon examen est dans une heure, on verra ce que ça donne!
                      • Partager sur Facebook
                      • Partager sur Twitter

                      problème algorithme

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown