Tri d'entier en C

Résolu/Fermé
Juyn - 30 oct. 2009 à 22:42
 pacorabanix - 31 oct. 2009 à 01:56
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
#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 :)

4 réponses

sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
31 oct. 2009 à 00:07
Bonsoir,

Faudra changer tes "||" en "&&" dans les clauses "if"...

++
0
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
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.
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
31 oct. 2009 à 00:24
Oui, mais ceci chambule tout son code. Pourquoi ne pas le faire en Lisp, dans ces conditions...
0
Desolé mais je ne trouve pas tes libraires avec Code::Blocks oO
0
pacorabanix
31 oct. 2009 à 01:56
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.
0
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
Comment ça cela chamboule son code ?
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
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
0
pacorabanix
31 oct. 2009 à 00:49
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.

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?
0
Juyn > pacorabanix
31 oct. 2009 à 01:40
OK je vois ce que tu veux dire, mais quand j'applique tout ça et que je compile :


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" ?
0
pacorabanix > Juyn
31 oct. 2009 à 01:48
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...
0
Juyn > pacorabanix
31 oct. 2009 à 01:50
OK merci beaucoup, je vais donc chercher du coté des tableaux, mais 'verrais ca demain !!!



Cool en tout cas pour l'aide merci et bonne nuit

(je pense je vais re avoir besoin d'aide pour les tableaux .... on verra en tout voulu lol :( ) ;)
0
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
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
0
pacorabanix
31 oct. 2009 à 00:51
ben vu ce qu'il essaye de faire, il est tout débutant, je pense qu'il aura encore plus de mal à lire ton code qu'à comprendre l'algorithme que tu lui présentes ;) et il ne vois toujours pas pourquoi son code est faux.
0