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

  FORUM HardWare.fr
  Programmation
  C

  ma fonction ne trie pas le tableau

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ma fonction ne trie pas le tableau

n°2047506
razuki
Posté le 08-01-2011 à 00:03:58  profilanswer
 

Bonjour,  
 
j'ai fait un petit programme censé trier un tableau, écrit en langage C.  
 
Le problème est que il y a des nombres redondant et d'autres ne sont plus dans le tableau après le tri... Voici le code :
 

Code :
  1. void
  2. sort_tab(int* tab){
  3.   //int taille = sizeof(tab)/sizeof(int);
  4.   int taille = 10;
  5.   int i, ind_min, courant;
  6.   int min;
  7.  
  8.   for(courant=0; courant<taille; courant++){
  9.     min = tab[courant];
  10.     for(i=courant+1; i<taille; i++){
  11.       if(tab[i]<min){
  12.         min = tab[i];
  13.         ind_min = i;
  14.       }
  15.     }
  16.     tab[ind_min] = tab[courant];
  17.     tab[courant] = min;
  18.   }
  19. }
  20. void
  21. print_tab(int* tab){
  22.   int j;
  23.   for(j=0; j<10; j++)
  24.     printf("%d |", tab[j]);
  25.   printf("\n" );
  26. }
  27. int main(){
  28.   int i, j, taille;
  29.   //int toto[10] = {9, 1, 7, 2, 5, 3, 4, 6, 8, 0}; //TAB1
  30.   int toto[10] = {2, 3, 4, 5, 6, 7, 8, 9, 0, 1}; //TAB2
  31.   sort_tab(toto);
  32.   print_tab(toto);
  33.   return 0;
  34. }


 
voici le resultat avec TAB2 :
0 |1 |2 |3 |4 |5 |6 |7 |8 |8 |
 
voici le resultat avec TAB1
0 |1 |1 |2 |2 |3 |3 |4 |6 |8 |
 
J'aimerais savoir déjà d'ou vient ces redondances et pourquoi des nombres ont disparus ... ?
 
Merci d'avance pour votre aide.


Message édité par gilou le 08-01-2011 à 00:54:28
mood
Publicité
Posté le 08-01-2011 à 00:03:58  profilanswer
 

n°2047507
mikala
Souviens toi du 5 Novembre...
Posté le 08-01-2011 à 00:08:27  profilanswer
 

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par Mikala


---------------
Intermittent du GNU
n°2047511
gilou
Modérateur
Modzilla
Posté le 08-01-2011 à 01:29:48  profilanswer
 

Voici la cause du pb IMHO

Code :
  1. void
  2. sort_tab(int* tab){
  3.   //int taille = sizeof(tab)/sizeof(int);
  4.   int taille = 10;
  5.   int i, ind_min, courant;
  6.   int min;
  7.  
  8.   for(courant=0; courant<taille; courant++){
  9.     ind_min = courant; // pas initialisé si courant contenait déja la valeur min
  10.     min = tab[courant];
  11.     for(i=courant+1; i<taille; i++){
  12.       if(tab[i]<min){
  13.         min = tab[i];
  14.         ind_min = i;
  15.       }
  16.     }
  17.     tab[ind_min] = tab[courant];  // et c'était problématique ici
  18.     tab[courant] = min;
  19.   }
  20. }


 
ce code peut s'améliorer (c'est un tri bulle, si j'ai bien lu):
 

Code :
  1. void  sort_tab(int* tab){
  2.   int taille = 10;
  3.   int courant;
  4.  
  5.   for (courant = 0; courant < taille; courant++) {
  6.     int ind_min = courant;                            // autant déclarer seulement quand c'est necessaire
  7.     int min = tab[courant];                           // idem
  8.     int i;                                            // idem
  9.     for (i = courant+1; i < taille; i++) {
  10.       if (tab[i] < min) {
  11.          min = tab[i];
  12.          ind_min = i;
  13.        }
  14.      }
  15.     if (min != tab[courant]) {  // pas la peine de faire l'assignation si courant contenait déjà le min
  16.       tab[ind_min] = tab[courant];
  17.       tab[courant] = min;
  18.     }
  19.   }
  20. }


On peut aussi se débarrasser de min et n'utiliser que ind_min:

Code :
  1. void  sort_tab(int* tab){
  2.   int taille = 10;
  3.   int courant;
  4.  
  5.   for (courant = 0; courant < taille; courant++) {
  6.     int ind_min = courant;
  7.     int i;
  8.     for (i = courant+1; i < taille; i++) {
  9.       if (tab[i] < tab[ind_min]) {
  10.          ind_min = i;
  11.        }
  12.      }
  13.     if (ind_min != courant) {
  14.       int temp = tab[ind_min];
  15.       tab[ind_min] = tab[courant];
  16.       tab[courant] = temp;
  17.     }
  18.   }
  19. }


A+,


Message édité par gilou le 08-01-2011 à 01:42:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2047512
mr simon
Posté le 08-01-2011 à 01:36:04  profilanswer
 

Quand tu as ce genre de probleme (blocage sur un algo), l'utilisation d'un debugger (genre gdb) peut s'avérer extrement pratique. Dans tout les cas, tu pourras tres difficilement t'en passer si tu continues a programmer (notamment des programmes plus long) - c'est toujours utile d'apprendre a s'en servir!
 
Sinon, sans te donner la solution, regarde du cote de la variable "ind_min" (il te manque une seul instruction).
 
 
Edit: bon bah griller pas gillou !


Message édité par mr simon le 08-01-2011 à 01:36:58
n°2047513
gilou
Modérateur
Modzilla
Posté le 08-01-2011 à 01:48:53  profilanswer
 

Et moi, depuis que je suis sur une becane de secours poussive, j'ai plus ni compilo, ni debugger :p
 
 ;)  
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2047541
razuki
Posté le 08-01-2011 à 12:13:22  profilanswer
 

Merci pour ta réponse mr simon, effectivement j'ai oublié d'initialiser ind_min ... j'ai réparé l'erreur et là ca fonctionne bien. J'ai pas l'habitude d'utiliser un dbg mais je vais m'y mettre.


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

  ma fonction ne trie pas le tableau

 

Sujets relatifs
Fonction mktime et strftimeProblème avec la fonction update pour modifié une table d'un BDD [réso
supprimer une valeur d'un tableau (algorithme)Probleme : Tableau perd ses valeurs une fois sortie de la boucle
Convertir un tableau en liste de données VBA sous Excel[C++] tableau de classe dans une autre classe ?
tableau d'associationprobleme avec tableau
Programmer en C une fonction d'interruption pour dspEspacement cellules tableau
Plus de sujets relatifs à : ma fonction ne trie pas le tableau


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