Langage C: tri d'un tab à 2 dim

leProgmer -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

je souhaite trier seulement la dernière colonne d'un tableau à 2 dimensions. Mon programme compile, mais ne me donne pas le résultat attendu: seule la première ligne du tableau est répétée. Pouvez vous me dire comment corriger l'erreur s'il vous plaît? Merci.

#include<stdio.h>
#include<math.h>

#define DIMLIG 6
#define DIMCOL 2

void sort(int tab[DIMLIG][DIMCOL]) //fonction de tri
{
    int i,j,n;
    for(i=0; i<DIMLIG; i++)
    {
        for(j=0; j<DIMCOL; j++)
        {
            n=j;
            while(n>0 && tab[0][n]<tab[0][n-1])
            {
                j = tab[0][n-1];
                tab[0][n-1] = tab[0][n];        
                tab[0][n]=j;
                --n;
            }
        }
    }
}

void affich(int tab[DIMLIG][DIMCOL]) //Affichage du contenu du tableau
{
    int i,j;
    for(i=0; i<DIMLIG; i++)
    {
        for(j=0; j<DIMCOL; j++)
        {
            printf("%5.0d", tab[0][j]);
        }
    printf("\n");
    }
}

main()
{
    int tab[DIMLIG][DIMCOL]={{1,84}, {2, 82}, {3, 87}, {4, 85}, {5, 81}, {6, 86}};
    sort(tab);
    affich(tab);
    getchar();
/* 
Voici le tableau que je veux obtenir à la fin
5    81
2    82
1    84
4    85
6    86
3    87
*/
}



1 réponse

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,

    J'ai pas tout regardé.
    Mais, ta fonction affichage est fausse. Tu affiches tab[0][j] au lieu de tab[i][j]. C'est pour ça que ta première ligne est répétée.

    Ensuite pour ta fonction sort, tu tries tab[0][n] c'est à dire la première ligne.
    Toi ce que tu veux faire, c'est trier le tableau par couple suivant la seconde colonne.
    Il faut donc que tu tries suivant tab[i][1] et que tu n'oublies pas de traiter les couples.
    Par exemple dans les :
    if (tab[i][1]>tab[i+1][1]) {
        echanger(tab[i][1],tab[i+1][1]);
        echanger(tab[i][0],tab[i+1][0]);
    }
    

    Cdlt,
    0
    1. leProgmer
       
      Merci Fiddy pour tes commentaires qui m'ont permis d'avancer; toutefois, le tri du tableau ne se fait toujours pas et à l'affichage final du tableau, les données du tableau sont interchangées, c'est à dire que les lignes ne correspondent plus aux colonnes. Pouvez vous me dire ce qui est erroné dans mon code? Merci.

      #include<stdio.h>
      #include<math.h>
      
      #define DIMLIG 6
      #define DIMCOL 2
      
      void sort(int tab[DIMLIG][DIMCOL]) //Sorting function
      {
      	int i,j,n;
      	for(i=0; i<DIMLIG; i++)
      	{
      		for(j=0; j<DIMCOL-i; j++)
      		{
      			if(tab[i+1][1]<tab[i][1])
      			{
      				j = tab[i][1];
      				tab[i][1] = tab[i+1][1];
      				tab[i+1][1] = j;
      			}
      		}
      	}
      }
      
      void affich(int tab[DIMLIG][DIMCOL]) //Display table content
      {
          int i,j;
          for(i=0; i<DIMLIG; i++)
          {
              for(j=0; j<DIMCOL; j++)
              {
                  printf("%5.0d", tab[i][j]); //
              }
          printf("\n");
          }
      }
      
      main()
      {
          int tab[DIMLIG][DIMCOL]={{1,84}, {2, 82}, {3, 87}, {4, 85}, {5, 81}, {6, 86}};
          sort(tab);
          affich(tab);
          getchar();
      }
      
      0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Comme dit dans le post précédent, il faut échanger les cases par pair :

      echanger(tab[i][1],tab[i+1][1]); /*tu l'as fait dans ton code*/
      echanger(tab[i][0],tab[i+1][0]); /*tu ne l'as pas fait*/

      Ensuite, l'algorithme de ta fonction sort() est à revoir.
      Tu peux t'inspirer du tri à bulle par exemple : http://fr.wikipedia.org/wiki/Tri_à_bulles

      Tu verras que ton algorithme est erroné.

      Cdlt,
      0