Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
433 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programme de tri

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programme de tri

n°2032648
neofly
dans le caca profond
Posté le 27-10-2010 à 18:41:10  profilanswer
 

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
mood
Publicité
Posté le 27-10-2010 à 18:41:10  profilanswer
 

n°2032650
theshockwa​ve
I work at a firm named Koslow
Posté le 27-10-2010 à 18:44:08  profilanswer
 

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
n°2032653
neofly
dans le caca profond
Posté le 27-10-2010 à 18:55:09  profilanswer
 

theshockwave a écrit :


félicitations [:dawa]


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

n°2032654
tpierron
Posté le 27-10-2010 à 18:58:13  profilanswer
 

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.

n°2032655
neofly
dans le caca profond
Posté le 27-10-2010 à 19:01:24  profilanswer
 

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?

n°2032657
theshockwa​ve
I work at a firm named Koslow
Posté le 27-10-2010 à 19:15:25  profilanswer
 

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
n°2032658
neofly
dans le caca profond
Posté le 27-10-2010 à 19:19:47  profilanswer
 

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 ?!? :??: ?!?

n°2032662
tpierron
Posté le 27-10-2010 à 19:33:00  profilanswer
 

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

Code :
  1. tab[i]

n°2032666
neofly
dans le caca profond
Posté le 27-10-2010 à 19:40:42  profilanswer
 

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?

n°2032720
h3bus
Troll Inside
Posté le 27-10-2010 à 22:30:43  profilanswer
 

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++
mood
Publicité
Posté le 27-10-2010 à 22:30:43  profilanswer
 

n°2032793
Un Program​meur
Posté le 28-10-2010 à 12:09:30  profilanswer
 

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)
n°2032822
h3bus
Troll Inside
Posté le 28-10-2010 à 13:57:50  profilanswer
 

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++

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programme de tri

 

Sujets relatifs
[VBA]modifier point d'entrée du programme [Resolu]Editer un programme iphone
trouver un nom de programme qui existe pas déjàProgramme C++ / ecriture de fichier Access / 'ConflictTables'
Programme VB6 traductionun programme en python appelle une fonction C .. ?
création d un petit programmecrée un de programme pour envoyé des mails
programme pour créer organigramme 
Plus de sujets relatifs à : Programme de tri


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR