Tri d'entier en C
Résolu
Juyn
-
pacorabanix -
pacorabanix -
Bonjour,
je dev une tite source censée trier des entiers entrées par l'user par ordre croissant.
Ma source pour le moment donne ceci
Le soucis étant que la valeur retournée est pour MIN MIDDLE et MAX la valeure la plus élévée...
j'arrive pas à comprendre POURQUOI ???
merci d'avance :)
je dev une tite source censée trier des entiers entrées par l'user par ordre croissant.
Ma source pour le moment donne ceci
#include <stdio.h> main () { int i = 0, input, input2, input3 , MIN = 0, MAX, MIDDLE; printf("Entrez une valeure 1\n"); scanf("%d", &input); printf("Entrez une valeure 2\n"); scanf("%d", &input2); printf("Entrez une valeure 3\n"); scanf("%d", &input3); while (i < input || i < input2 || i < input3) { i++; } MIN = i; printf("MIN = %d \n", MIN); while (i < input || i < input2 || i < input3) { i++; } MIDDLE = i; printf("Middle = %d \n", MIDDLE); while (i < input || i < input2 || i < input3) { i++; } MAX = i; printf("MAX = %d \n", MAX); }
Le soucis étant que la valeur retournée est pour MIN MIDDLE et MAX la valeure la plus élévée...
j'arrive pas à comprendre POURQUOI ???
merci d'avance :)
A voir également:
- Tri d'entier en C
- Comment faire un tri personnalisé sur excel - Guide
- Logiciel tri photo - Guide
- Comment imprimer un tableau excel en entier - Guide
- Tri turf - Télécharger - Sport
- Votre colis est retenu au centre de tri - Accueil - Arnaque
4 réponses
Bonsoir, je ferai comme ça :
#include "stdafx.h"
#include "iostream"
using namespace std;
int main()
{
int tab[8];
int i,j,t;
for(i=0;i<8;i++)
{
cout<<"entrez une valeur"<<endl;
cin>>tab[i];
}
for(i=0;i<8;i++)
{
for(j=7;j>=i;j--)
{
if(tab[j-1]>tab[j])
{
t=tab[j-1];
tab[j-1]=tab[j];
tab[j]=t;
}
}
}
cout<<endl;
for(j=0; j<8; j++)
{
cout<<tab[j]<<endl;
}
return 0;
}
j'ai prit 8 comme taille du tableau, à toi de modeler.
#include "stdafx.h"
#include "iostream"
using namespace std;
int main()
{
int tab[8];
int i,j,t;
for(i=0;i<8;i++)
{
cout<<"entrez une valeur"<<endl;
cin>>tab[i];
}
for(i=0;i<8;i++)
{
for(j=7;j>=i;j--)
{
if(tab[j-1]>tab[j])
{
t=tab[j-1];
tab[j-1]=tab[j];
tab[j]=t;
}
}
}
cout<<endl;
for(j=0; j<8; j++)
{
cout<<tab[j]<<endl;
}
return 0;
}
j'ai prit 8 comme taille du tableau, à toi de modeler.
for(i=0;i<8;i++) { for(j=7;j>=i;j--) { if(tab[j-1]>tab[j]) { t=tab[j-1]; tab[j-1]=tab[j]; tab[j]=t; } } }
oh mon dieu ! je n'avais pas remarqué : c'est un tri bubble :( une des pires choses que l'homme ait inventé !
GodLike je te conseille de vite apprendre un autre manière de trier, car ce n'est ni la plus simple à expliquer et à coder, et c'est une des plus lente possible et imaginables.
Comment ça cela chamboule son code ?
Et bien ta réponse est très bien, mais ça n'a plus rien à voir avec ça manière de faire... il n'utilise pas de tableau, il fait juste un exercice basique pour comprendre les choses, autant essayer de répondre à sa question déjà : pourquoi cela ne marche pas?
Je recopie la partie du code qui pose problème, par contre je vais la présenter un peu plus agréablement (pour moi en tout cas). J'ai enleé les printf et scanf car ils sont corrects.
1) inutile d'intialiser MIN à 0, tu ne t'en sers jamais avant de lui donner une autre valeur. (mais ce n'est pas le problème)
2) essaye toi même de faire ton code et de comprendre comment ça marche:
d'abord, i fait 0. Imaginons tu as entré 5, 12 et 15 comme nombres dans les input.
Première boucle : i (qui fait 0) est bien plus petit que input1, donc la condition fonctionne. La boucle tourne et i vaut 1 de plus à chaque fois, jusqu'à ce qu'il soit plus grand que TOUS les input (Car tu continues la boucle tant que i est plus petit que input OU i plus petit que input2 OU ...).
Comme l'a dit le premier à répondre, je pense plutot que tu voulais continuer la boucle seulement si i n'est pas au moins autant qu'un seul. Donc il faut continuer si i est plus petit que CHAQUE input, avec des ET dans tes conditions.
Bien. Donc d'après ce que tu as écris, la valeur de i est maintenant la PLUS GRANDE des 3., c'est donc le MAX, pas le min
Ensuite, je te rappelle que i vaut maintenant la plus grande des trois valeurs, tu recommences des boucles avec... exactement la même condition ! Donc comme le programme est sorti de la boucle avant, il ne va pas revenir dans la deuxième ni la première boucle, puisque tu as mis la même condition, et i, input input2, et input3 valent toujours la même chose. la condition ne peut être que fausse.
Tu comprends pourquoi ton algorithme ne marche pas maintenant?
Je recopie la partie du code qui pose problème, par contre je vais la présenter un peu plus agréablement (pour moi en tout cas). J'ai enleé les printf et scanf car ils sont corrects.
int i = 0, input, input2, input3 , MIN = 0, MAX, MIDDLE; ... while (i < input || i < input2 || i < input3) { i++; } MIN = i; while (i < input || i < input2 || i < input3) { i++; } MIDDLE = i; while (i < input || i < input2 || i < input3) { i++; } MAX = i;
1) inutile d'intialiser MIN à 0, tu ne t'en sers jamais avant de lui donner une autre valeur. (mais ce n'est pas le problème)
2) essaye toi même de faire ton code et de comprendre comment ça marche:
d'abord, i fait 0. Imaginons tu as entré 5, 12 et 15 comme nombres dans les input.
Première boucle : i (qui fait 0) est bien plus petit que input1, donc la condition fonctionne. La boucle tourne et i vaut 1 de plus à chaque fois, jusqu'à ce qu'il soit plus grand que TOUS les input (Car tu continues la boucle tant que i est plus petit que input OU i plus petit que input2 OU ...).
Comme l'a dit le premier à répondre, je pense plutot que tu voulais continuer la boucle seulement si i n'est pas au moins autant qu'un seul. Donc il faut continuer si i est plus petit que CHAQUE input, avec des ET dans tes conditions.
Bien. Donc d'après ce que tu as écris, la valeur de i est maintenant la PLUS GRANDE des 3., c'est donc le MAX, pas le min
Ensuite, je te rappelle que i vaut maintenant la plus grande des trois valeurs, tu recommences des boucles avec... exactement la même condition ! Donc comme le programme est sorti de la boucle avant, il ne va pas revenir dans la deuxième ni la première boucle, puisque tu as mis la même condition, et i, input input2, et input3 valent toujours la même chose. la condition ne peut être que fausse.
Tu comprends pourquoi ton algorithme ne marche pas maintenant?
OK je vois ce que tu veux dire, mais quand j'applique tout ça et que je compile :
la boucle :
la boucle
mais comment du coup récuperer la valeur qui se trouve entre les deux ?
une boucle qui verifie que i > MIN et i < MAX ( en ayant prit soin de réinitialiser i of course ), mais le soucis c'est que je ne peux pas faire un i = input || i = input2 donc comment retourner la valeur "MIDDLE" ?
la boucle :
while (i < input && i < input2 && i < input3)me retourne la valeur minimale, ce qui est logique.
la boucle
while (i < input || i < input2 || i < input3)la valeur maximale, ce qui est tout aussi logique.
mais comment du coup récuperer la valeur qui se trouve entre les deux ?
une boucle qui verifie que i > MIN et i < MAX ( en ayant prit soin de réinitialiser i of course ), mais le soucis c'est que je ne peux pas faire un i = input || i = input2 donc comment retourner la valeur "MIDDLE" ?
oui la valeur milieu pose vraiment un très gros problème comme cela!
C'est pour cela qu'il faudrait revoir à fond ton algorithme... le mieux est de faire un tableau avec les valeurs. Là je m'en vais, je n'ai pas le courage d'expliquer plus en détail :
Un tableau permettrait de garder une trace de l'indice de la valeur la plus grande, et donc de pouvoir, par exemple, l'effacer (la mettre à 0). Ensuite tu cherches la plus grandes valeurs parmi celles qui restent ce sera le mileu. tu la mets à zéro. La plus grande de celles qui restent sera le minimum. (ce principe peut s'appliquer à beaucoup plus que 3 valeurs ensuite :) ). Et en plus il y a une seule chose à saovir faire : seulement chercher la plus grande. Même pas besoin de code pour la plus petite :P.
PS : j'ai dit "0" en supposant que tu ne pouvais pas avoir de négatifs...
C'est pour cela qu'il faudrait revoir à fond ton algorithme... le mieux est de faire un tableau avec les valeurs. Là je m'en vais, je n'ai pas le courage d'expliquer plus en détail :
Un tableau permettrait de garder une trace de l'indice de la valeur la plus grande, et donc de pouvoir, par exemple, l'effacer (la mettre à 0). Ensuite tu cherches la plus grandes valeurs parmi celles qui restent ce sera le mileu. tu la mets à zéro. La plus grande de celles qui restent sera le minimum. (ce principe peut s'appliquer à beaucoup plus que 3 valeurs ensuite :) ). Et en plus il y a une seule chose à saovir faire : seulement chercher la plus grande. Même pas besoin de code pour la plus petite :P.
PS : j'ai dit "0" en supposant que tu ne pouvais pas avoir de négatifs...