Tri à bulles - Problème

Fermé
Les Galériennes de l'Info - Modifié par jipicy le 21/05/2016 à 15:24
 Les Galériennes de l'Info - 21 mai 2016 à 15:10
Bonjour à tous, :)
On doit faire un programme de tri à bulles. Le programme n'a pas d'erreur mais le résultat n'est pas bon et nous ne savons pas pourquoi. Le programme a été écrit sur Visual Studio en C++. Pouvez-vous nous aider ? Merci d'avance :)

#include <stdio.h>
#define MAX 100
void tri_bulle(float tabi[MAX], int nb) {
int fin_tri;
float nb_swap=0;
int i=0;
do {
fin_tri = 1;
for (i = 0; i < (nb+1) ; i++) {
if (tabi[i] > tabi[i + 1]) {
nb_swap = tabi[i];
tabi[i] = tabi[i + 1];
tabi[i + 1] = nb_swap;
fin_tri = 0;
}
}
} while (fin_tri == 0);
 
}
void main(void) {
float tabi[MAX];
int nb;
int i=0;
do {
printf("Combien de prix, entre 0 et 100, voulez-vous rentrer dans le tableau ?");
scanf("%d", &nb);
} while (nb < 0 || nb>100);
for (i = 0; i < nb; i++) {
printf("Rentrez le %d prix :\n", i + 1);
scanf("%f", &tabi[i]);
} 
tri_bulle(tabi,nb);
printf("Le tableau trié par ordre croissant est donc \n");
for (i = 0; i < nb; i++) {
printf(" %f | ", tabi[i]);
}
}

2 réponses

Salut,

Tu n as que la moitié dans ton code: tu regarde n par rapport à n+1, mais après il est ignoré (quand n=n+1, le check se limite entre n+1 et n+2 => pas de check sur le n initial).

tu pourrai rajouter, par exemple:



if (tabi[i] > tabi[i + 1]) {
for(j=i+1;j>0 ; j++)
{
if( tab[j]<tab[j-1) {
nb_swap = tabi[j];
tabi[j] = tabi[j - 1];
tabi[j - 1] = nb_swap;

}
}
}



si qui ordonnera le tout (je me rapel plus des codes exactes qui definissent les tri mais bref). C est juste un exempe que j ai tappé vite fait, donc a checker, mais ca te donnera une bonne idée de pourquoi ton code est insuffisant.

naga

EDIT: ah et tu auras un soucis avec
i < (nb+1) 
dans le for de la fonction, mais je te laisse découvrir ^^(comme piste : penses au dernier indice du tableau et des indices utilisés pour les tests)
0
Les Galériennes de l'Info
19 mai 2016 à 19:03
Bonjour et merci pour ta réponse,
si je comprends bien le programme ne lit qu'une seule fois le tableau c'est ça ?

Et pour la boucle for, on a mis nb+1 car quand on compare la valeur nb il va y avoir un problème si on a pas de valeur au rang nb+1....
0
Salut,
En l occurrance tu fais un passage qui fait "remonter" le plus grand mais c est tout, le reste est oublié.

pour le "+1", je dis pas juste que la manière dont tu as codé tu vas aller lire dans de la mémoire non alloué (ou qui n a rien a voir), car si tu as n éléments, le dernier indice est n-1
0
Les Galériennes de l'Info
21 mai 2016 à 15:10
ok merci beaucoup pour ton aide !! :)
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
19 mai 2016 à 17:57
Bonjour,

seule erreur dans la boucle for qui va plus qu'un peu trop loin dans ses indices.
0
Les Galériennes de l'Info
19 mai 2016 à 19:06
Pour la boucle for, on a mis nb+1 car quand on compare la valeur i= nb il va y avoir un problème si on a pas de valeur au rang nb+1....
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > Les Galériennes de l'Info
19 mai 2016 à 20:23
et quand on prend l'indice i + 1, il doit être aussi inférieur à n, d'où le test i + 1 < n au lieu de i < n + 1 !!
0
Les Galériennes de l'Info
19 mai 2016 à 20:28
ah oui !!! Merci beaucoup !!!!! :)
0