Langage C: tri d'un tab à 2 dim

Fermé
leProgmer - 23 déc. 2010 à 07:47
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 24 déc. 2010 à 11:43
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
*/
}




A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
23 déc. 2010 à 08:52
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
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
24 déc. 2010 à 11:43
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