Tri d'entier en C
Résolu/Fermé
A voir également:
- Tri d'entier en C
- Tri excel - Guide
- Logiciel tri photo gratuit - Guide
- En cours de traitement sur le site de tri local - Forum Consommation & Internet
- Peut on récupérer un colis au centre de tri chronopost - Forum Mobile
- Peut on aller chercher son colis au centre de tri - Forum Vos droits sur internet
4 réponses
sandul
Messages postés
3927
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
8 octobre 2010
723
31 oct. 2009 à 00:07
31 oct. 2009 à 00:07
Bonsoir,
Faudra changer tes "||" en "&&" dans les clauses "if"...
++
Faudra changer tes "||" en "&&" dans les clauses "if"...
++
godLike
Messages postés
259
Date d'inscription
mercredi 4 mars 2009
Statut
Membre
Dernière intervention
26 juillet 2011
26
31 oct. 2009 à 00:12
31 oct. 2009 à 00:12
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.
sandul
Messages postés
3927
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
8 octobre 2010
723
31 oct. 2009 à 00:24
31 oct. 2009 à 00:24
Oui, mais ceci chambule tout son code. Pourquoi ne pas le faire en Lisp, dans ces conditions...
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.
godLike
Messages postés
259
Date d'inscription
mercredi 4 mars 2009
Statut
Membre
Dernière intervention
26 juillet 2011
26
31 oct. 2009 à 00:30
31 oct. 2009 à 00:30
Comment ça cela chamboule son code ?
sandul
Messages postés
3927
Date d'inscription
jeudi 22 mai 2008
Statut
Membre
Dernière intervention
8 octobre 2010
723
31 oct. 2009 à 00:40
31 oct. 2009 à 00:40
Ben ses printf/scanf transformés en cout/cin. Et ses while transformés également en autre chose... Mais c'est vrai qu'il reste les mêmes ";" à la fin des instructions, lol
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...
godLike
Messages postés
259
Date d'inscription
mercredi 4 mars 2009
Statut
Membre
Dernière intervention
26 juillet 2011
26
31 oct. 2009 à 00:43
31 oct. 2009 à 00:43
Bah je le fais en C++ , c'est juste la "structure" et elle est fonctionnelle , après il peu s'en inspirer et l'adapter ou ne rien faire du tout , je ne l'oblige en rien ;)
N'oublions pas que nous ne sommes pas là non plus pour faire le boulot des autres :p
N'oublions pas que nous ne sommes pas là non plus pour faire le boulot des autres :p