Programme de tri

Programme de tri - C - Programmation

Marsh Posté le 27-10-2010 à 18:41:10    

Bonsoir à tous,
 
Comme dit dans le titre j'ai réalisé un programme de tri par ordre croissant et décroissant, j'ai testé ma fonction (tri à bulle) et elle fonctionne mais voilà le problème:
Lorsque que je crée un switch case pour donner le choix à l'utilisateur de faire tel ou tel tri cela ne fonctionne plus il me trie mes nombres dans l'ordre où je les ai taper:
 
1ère question : quel est le problème?
2ème question: comment faire dans ma fonction menu pour qu'il boucle au cas où la personne ne tape pas un nombre entre 1 et 4?
3ème question: comment faire pour re-proposer un choix ou stopper le programme après avoir effectué une action ? (avec un if??)
 
merci d'avance et voici le code :
 
Programme:
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. //Prototype des fonctions
  4. int menu();
  5. int maximum (int *,int );
  6. int minimum (int *,int );
  7. void croissant(int *,int );
  8. void decroissant(int *,int );
  9. // Programme principal
  10. int main(){
  11.    
  12.     int nbr_eleve;
  13.     int i,choix;
  14.           printf("introduisez le nombre d'eleves : " );
  15.           scanf("%d",&nbr_eleve);
  16.           printf ("\n\n" );
  17.     int tab_notes[nbr_eleve];
  18.    
  19.    
  20.         for (i=0;i<nbr_eleve ;i++ ){
  21.                                  
  22.                                    printf("Introduisez la note %d: ",i+1);
  23.                                    scanf("%d",&*(tab_notes+i));
  24.                                  
  25.         }
  26.         printf ("\n\n" );
  27.         choix=menu();
  28.         switch (choix){         
  29.        
  30.         case 1:
  31.              printf("\nTableau des valeurs tries par ordre croissant\n\n" );
  32.              croissant(tab_notes,nbr_eleve);
  33.              for (i=0;i<nbr_eleve;i++){
  34.    
  35.                                   printf("%d  ",*(tab_notes+i));
  36.              }
  37.              break;
  38.         case 2:     
  39.              printf("\n\nTableau des valeurs tries par ordre decroissant\n\n" );
  40.              decroissant(tab_notes,nbr_eleve);
  41.            
  42.              for (i=0;i<nbr_eleve;i++){
  43.            
  44.                                   printf("%d  ",*(tab_notes+i));
  45.              }
  46.              break;
  47.         case 3:
  48.              printf("Moins bonne note = %d \n",minimum(tab_notes,nbr_eleve));
  49.              break;
  50.            
  51.         case 4:
  52.              printf("\n\nMeilleur note = %d \n",maximum(tab_notes,nbr_eleve));
  53.              break;
  54.              
  55.         }           
  56.  
  57.     printf("\n\n" );
  58.     system("pause" );
  59.     return 0;
  60.    
  61. }
  62. // Définition des fonctions
  63. //Fonction Menu
  64. int menu(){
  65.     int choix_menu;
  66.     int numero_fonction;
  67.    
  68.         printf ("Quel est votre choix ? \n\nEntrez un nombre entre 1 et 4\n\n" );   
  69.         printf ("1. Tri croissant \n" );
  70.         printf ("2. Tri decroissant \n" );
  71.         printf ("3. Moins bonne note \n" );
  72.         printf ("4. Meilleur note  \n" );
  73.         scanf ("%d", &choix_menu);
  74.        
  75.     switch (choix_menu)
  76.     {
  77.       case 1:
  78.            numero_fonction = 1;
  79.            break;
  80.       case 2:
  81.            numero_fonction = 2;
  82.            break;
  83.       case 3:
  84.            numero_fonction = 3;
  85.            break;
  86.       case 4:
  87.            numero_fonction = 4;
  88.            break;
  89.       default:
  90.            printf ("Vous n'avez pas entre un numero valide\n\n\n veuillez entrer un nombre entre 1 et 4\n" );
  91.            break;         
  92.     }           
  93.    
  94.     return numero_fonction;         
  95. }
  96. // Fonction maximum
  97. int maximum (int *tab,int taille){
  98.    
  99.     int max=0;
  100.     int i;
  101.         for (i=0;i<taille;i++){
  102.            if(*(tab+i)>max){
  103.                            
  104.             max = *(tab+i);
  105.            }
  106.         }
  107.     return max;
  108. }
  109. // Fonction minimum
  110. int minimum (int *tab,int taille){
  111.    
  112.     int min= *tab;
  113.     int i;
  114.         for (i=0;i<taille;i++){
  115.    
  116.             if(*(tab+i)<min){
  117.        
  118.              min = *(tab+i);
  119.             }
  120.         }
  121.     return min;
  122. }
  123. // Fonction croissante
  124. void croissant(int *tab,int taille){
  125.    
  126.     int buffer;
  127.     int i,j;
  128.         for (j=0;j<taille;j++){
  129.            
  130.             for (i=0;i<taille-1;i++){
  131.                
  132.                 if(*(tab+i)>*(tab+i++)){
  133.                                        
  134.                 buffer = *(tab+i);
  135.                 *(tab+i)=*(tab+i++);
  136.                 *(tab+i++)=buffer;
  137.                 }
  138.            }
  139.        }
  140. }
  141. // Fonction décroissante
  142. void decroissant(int *tab,int taille){
  143.    
  144.     int buffer;
  145.     int i,j;
  146.         for (j=0;j<taille;j++){
  147.            
  148.              for (i=0;i<taille-1;i++){
  149.                
  150.                  if(*(tab+i)<*(tab+i++)){
  151.                                        
  152.                    buffer = *(tab+i);
  153.                    *(tab+i)=*(tab+i++);
  154.                    *(tab+i++)=buffer;
  155.                  }
  156.              }
  157.         }
  158. }

Message cité 2 fois
Message édité par gilou le 28-10-2010 à 10:14:01
Reply

Marsh Posté le 27-10-2010 à 18:41:10   

Reply

Marsh Posté le 27-10-2010 à 18:44:08    

neofly a écrit :

Bonsoir à tous,
 
Comme dit dans l titre j'ai réalisé un programme de tri par ordre croissa


félicitations [:dawa]


---------------
last.fm
Reply

Marsh Posté le 27-10-2010 à 18:55:09    

theshockwave a écrit :


félicitations [:dawa]


 
 
je sais j'ai craqué désolé j'avais validé trop tôt :-s

Reply

Marsh Posté le 27-10-2010 à 18:58:13    

neofly a écrit :


Code :
  1. if(*(tab+i)>*(tab+i++)){
  2.    buffer = *(tab+i);
  3.    *(tab+i)=*(tab+i++);
  4.    *(tab+i++)=buffer;
  5. }




 
Tu devrais aussi te renseigner sur ce que fait l'opérateur "++". Tu comprendras qu'il n'a rien à faire dans cette boucle.

Reply

Marsh Posté le 27-10-2010 à 19:01:24    

tpierron a écrit :


 
Tu devrais aussi te renseigner sur ce que fait l'opérateur "++". Tu comprendras qu'il n'a rien à faire dans cette boucle.


 
 
bhe si je le met pas il va pas me comparer ma case du tableau avec la suivante ca revient à mettre *tab(+i+1)
 
c'est la même chose non?
 
merci pour ta contribution mais pour ce qui est de mes 3 questions as-tu une idée?

Reply

Marsh Posté le 27-10-2010 à 19:15:25    

je confirme ce que dit tpierron, le contenu de tes boucles est complètement faux.
 
ton system("pause" ); mérite la peine de mort dans beaucoup de pays (si tu veux lire ce qui s'est passé, tu peux lancer ton programme depuis une console dos ou faire un coup de CTRL+F5 si tu es sous visual studio)
 
pour ce qui est de ton menu, tu donnes toi-même la réponse à ton problème : pour qu'il boucle tant que ce n'est pas entre 1 et 4, et bien utilise une boucle et mets la condition de sortie sur la validité de la saisie


---------------
last.fm
Reply

Marsh Posté le 27-10-2010 à 19:19:47    

theshockwave a écrit :

je confirme ce que dit tpierron, le contenu de tes boucles est complètement faux.
 
ton system("pause" ); mérite la peine de mort dans beaucoup de pays (si tu veux lire ce qui s'est passé, tu peux lancer ton programme depuis une console dos ou faire un coup de CTRL+F5 si tu es sous visual studio)
 
pour ce qui est de ton menu, tu donnes toi-même la réponse à ton problème : pour qu'il boucle tant que ce n'est pas entre 1 et 4, et bien utilise une boucle et mets la condition de sortie sur la validité de la saisie


 
peux tu me dire pourquoi le contenu de mes boucles est faux??
Je débute dans le C, pourtant lorsque je retire le switch tout fonctionne ?!? :??: ?!?

Reply

Marsh Posté le 27-10-2010 à 19:33:00    

Arf, et accessoirement, *(tab+i) peut s'écrire plus lisiblement de cette manière :

Code :
  1. tab[i]

Reply

Marsh Posté le 27-10-2010 à 19:40:42    

tpierron a écrit :

Arf, et accessoirement, *(tab+i) peut s'écrire plus lisiblement de cette manière :

Code :
  1. tab[i]



 
je sais mais pour l'exercice je devais changer les tableaux en pointeurs peux tu me dire comment (selon toi ) je dois faire ca?

Reply

Marsh Posté le 27-10-2010 à 22:30:43    

Au début de ton main

Code :
  1. int nbr_eleve;
  2. int i,choix;
  3.           printf("introduisez le nombre d'eleves : " );
  4.           scanf("%d",&nbr_eleve);
  5.           printf ("\n\n" );
  6. int tab_notes[nbr_eleve];
 

Ne fais surtout pas ça, tab_note est statique et nbr_eleve aussi, pour moi le compilateur devrait te jeter.
En tout cas, il y a de forte chance pour que tu écrases des données lorsque tu écris dans ton tableau vu que le compilateur n'a aucune moyen d'allouer la taille qui va bien. Utilise un malloc.

Message cité 1 fois
Message édité par h3bus le 27-10-2010 à 22:31:45

---------------
sheep++
Reply

Marsh Posté le 27-10-2010 à 22:30:43   

Reply

Marsh Posté le 28-10-2010 à 12:09:30    

h3bus a écrit :

Au début de ton main

Code :
  1. int nbr_eleve;
  2. int i,choix;
  3.           printf("introduisez le nombre d'eleves : " );
  4.           scanf("%d",&nbr_eleve);
  5.           printf ("\n\n" );
  6. int tab_notes[nbr_eleve];


 
Ne fais surtout pas ça, tab_note est statique et nbr_eleve aussi, pour moi le compilateur devrait te jeter.


 
Extension de gcc depuis bien longtemps, normalisée en C99. (Je ne me souviens pas de différences entre la version normalisée et ce que fait gcc, mais c'est pas impossible qu'il y en ait).  Quelque chose d'approchant (alloca() est aussi bien répandu).
 

Citation :

En tout cas, il y a de forte chance pour que tu écrases des données lorsque tu écris dans ton tableau


 
Pourtant allouer nbr_eleve entiers et les libérer à la sortie du bloc est bien le comportement spécifié.
 

Citation :

vu que le compilateur n'a aucune moyen d'allouer la taille qui va bien.


 
Et pourquoi donc?


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 28-10-2010 à 13:57:50    

Un Programmeur a écrit :


 
Extension de gcc depuis bien longtemps, normalisée en C99. (Je ne me souviens pas de différences entre la version normalisée et ce que fait gcc, mais c'est pas impossible qu'il y en ait).  Quelque chose d'approchant (alloca() est aussi bien répandu).
 

Citation :

En tout cas, il y a de forte chance pour que tu écrases des données lorsque tu écris dans ton tableau


 
Pourtant allouer nbr_eleve entiers et les libérer à la sortie du bloc est bien le comportement spécifié.
 

Citation :

vu que le compilateur n'a aucune moyen d'allouer la taille qui va bien.


 
Et pourquoi donc?


 
Je ne connaissais pas cette extension de C99 méa culpa!!
Cependant je trouve que ça pue pas mal de mélanger code et déclaration...


---------------
sheep++
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed