Programme en C [ tri par extraction ]

Résolu/Fermé
kent87042 - 10 déc. 2008 à 20:42
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 11 déc. 2008 à 11:54
Bonjour,

Mon prof nous demande de faire une méthode de tri par extraction simple j'ai pris note mais je me demande si il reste pas des erreurs.. j'ai essayer avec un environnement de développement(Visual C++)
On me demande de trié par ordre croissant un vecteur et de l'afficher.Voilà ce que j'ai fait si vous aviez la solution ce serai génial merci !


#include <stdio.h>
#define MAX 100
void main()
{
int vec[MAX],i=-1,nbel,test,j,tempon;


while(nbel<0 || nbel>MAX)
{
printf("Combien d'elements voulez-vous dans le vecteur?: ");
fflush(stdin);
scanf("%d",&nbel);
}

i=0;
while(i<nbel)
{
printf(" Rentrez la valeur dans la case [%d]: ",i+1);
fflush(stdin);
test=scanf("%d",&vec[i]);

//Blindage de saisie
printf("\n");
while(test==0)
{
printf(" Mauvaise saisie, recommencer:[%d]",i+1);
fflush(stdin);
test=scanf("%d",&vec[i]);
}

i++;

}

//Affichage du vecteur
printf("\t\tVECTEUR\n\n");
i=0;
while(i<nbel)
{
printf("\t[%d]",vec[i]);
i++;
}
printf("\n\n");

//TRI QUI POSE PROBLEME


j=0;
while(j<nbel)
{
i=j;
while(i<nbel)
{
if(vec[j]>vec[i])
{
tempon=vec[i];
vec[j]=vec[i];
vec[i]=tempon;
}
i++;
}
j++;
}

printf("\n");

i=0;
while(i<nbel)
{
printf("\t %d",vec[i]);
i++;
}
}


Es-ce la bonne méthode déja...?

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 déc. 2008 à 20:57
Salut,
Déjà il y a plusieurs points à revoir :
void main(), main doit retourner un entier. Donc int main(void)
Ensuite premier while, tu fais une comparaison avec nbel qui n'est pas encore initialisé donc comportement instable.
Ensuite le fflush(stdin) est un comportement indéfini. Il vaut mieux utiliser while(getchar()!='\n'); mais encore faut-il être sur qu'il y a un retour chariot dans le buffer clavier.
A moins que tu voulais vider le buffer écran, mais dans ce cas-là, c'est fflush(stdout) et non stdin
Corrige ces petits points et profites en pour reposer le code en utilisant les balises de conservation de la forme du code (à droite du bouton souligner). Cela permettra de garder l'indentation. Donc plus lisible.
Cdlt
0
Ok j'avais pas remarquer le bouton pour garder l'indentation pour ce qui est fflush(stdin) mon prof nous a appris comme ça c'est pour vider le buffer d'entré pour pas qu'il me retourne une valeur rien a voir



#include <stdio.h>
#define MAX 100
void main()
{
	int vec[MAX],i=-1,nbel,test,j,tempon;


	while(nbel<0 || nbel>MAX)
	{
	printf("Combien d'elements voulez-vous dans le vecteur?: ");
	fflush(stdin);
	scanf("%d",&nbel);
	}

	i=0;
	while(i<nbel)
	{
	printf(" Rentrez la valeur dans la case [%d]: ",i+1);
	fflush(stdin);
	test=scanf("%d",&vec[i]);

	//Blindage de saisie
		printf("\n");
		while(test==0)
		{
			printf(" Mauvaise saisie, recommencer:[%d]",i+1);
			fflush(stdin);
			test=scanf("%d",&vec[i]);
		}

	i++;

	}

	//Affichage du vecteur
	printf("\t\tVECTEUR\n\n");
	i=0;
	while(i<nbel)
	{
		printf("\t[%d]",vec[i]);
		i++;
	}
	printf("\n\n");

//tri


	j=0;
	while(j<nbel)
	{
		i=j;
		while(i<nbel)
		{
			if(vec[j]>vec[i])
			{
				tempon=vec[i];
				vec[j]=vec[i];
				vec[i]=tempon;
			}
			i++;
		}
		j++;
	}


	
	 printf("\n");
	 
	 i=0;
	 while(i<nbel)
	 {
		 printf("\t %d",vec[i]);
		 i++;
	 }
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 déc. 2008 à 21:15
Re,
Oui, je sais bien. Beaucoup de personnes pensent que fflush(stdin) c'est joli et bien, mais ce n'est pas portable. La norme ne précise rien quant à l'utilisation du fflush sur stdin. Du coup sur certaines implémentations (la mienne en fait partie), le fflush(stdin) ne marche pas. Et tu auras une boucle infinie si l'utilisateur entre une lettre au lieu d'un chiffre.
C'est pour ça qu'il vaut mieux utiliser le while(getchar()!='\n'); qui est portable. Et le mettre lorsque le besoin se fait ressentir.
Cdlt
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 déc. 2008 à 21:08
Salut,
Voici le code un peu épuré.
J'ai pas regardé niveau algorithme. Mais cela donne un bon résultat. Vecteur trié.
Par contre, la façon dont tu testes le retour de scanf n'est pas conseillé. Dans le code, je te laisse mettre le while(getchar()!='\n'); après chaque scanf("%d"); pour vider le buffer clavier. Cela évitera des boucles infinies si l'utilisateur entre une lettre au lieu d'un chiffre.
Cdlt
#include <stdio.h>
#define MAX 100

int main(void)
{
    int vec[MAX],i,nbel,test,j,tempon;

    nbel=-1;
    while(nbel<0 || nbel>MAX)
    {
        printf("Combien d'elements voulez-vous dans le vecteur?: ");
        fflush(stdout);

        scanf("%d",&nbel);
    }

    i=0;
    while(i<nbel)
    {
        printf(" Rentrez la valeur dans la case [%d]: ",i+1);
        fflush(stdout);

        test=scanf("%d",&vec[i]);

        //Blindage de saisie
        printf("\n");
        while(test==0)
        {
            printf(" Mauvaise saisie, recommencer:[%d]",i+1);
            fflush(stdout);
            test=scanf("%d",&vec[i]);
        }

        i++;
    }

    //Affichage du vecteur
    printf("\t\tVECTEUR\n\n");
    i=0;
    while(i<nbel)
    {
        printf("\t[%d]",vec[i]);
        i++;
    }

    printf("\n\n");

    //TRI QUI POSE PROBLEME


    j=0;
    while(j<nbel)
    {
        i=j;
        while(i<nbel)
        {
            if(vec[j]>vec[i])
            {
                tempon=vec[i];
                vec[j]=vec[i];
                vec[i]=tempon;
            }
            i++;
        }
        j++;
    }

    printf("\n");

    i=0;
    while(i<nbel)
    {
        printf("\t %d",vec[i]);
        i++;
    }

    printf("\n");
    return 0;
} 

0
Le fflush(stdout) me fait une boucle infinié alors je préfere mon stdin si ça ne t'ennuie pas.
Le tri ne s'éffectue toujours pas ceci dis...
0
C'est vraiment l'algorythme qui m'interesse en fait
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 déc. 2008 à 21:31
Je n'ai pas dit de remplacer le fflush(stdin) par fflush(stdout), ce qui n'a rien à voir. Lorsque tu affiches quelque chose (sauf cas particulier comme le '\n'), il faut faire fflush(stdout). fflush(stdin) n'est pas standard et me fais des boucles infinies sur ma machine par exemple, c'est pour ça qu'il faut utiliser le while ....

Sinon pour l'algorithme ne marche pas très bien. Voici une implémentation qui marche.
https://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles

Cdlt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bon j'ai trouvé tous seul... si d'autre cherche voici l'algorithme a suivre
ou nbel est le nombre d'élément du vecteur

//TRIAGE PAR SELECTION

	i=0;
	while(i<nbel)
	{	
	
		j=i+1;
		while(j<nbel)
		{	
			min=j;
			if(vec[min]<vec[i])
			{
				
				temp=vec[i];
				vec[i]=vec[min];
				vec[min]=temp;
			}
			j++;
		}
		i++;
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
11 déc. 2008 à 11:54
Salut,
J'ai pas testé l'algorithme, mais j'ai l'impression qu'il y a une petite erreur encore.
tu fais min=j à l'intérieur de la deuxième boucle while. Donc le min sera redéfini à chaque itération.
Je te redonne un lien où ya le code C, donc t'as qu'à t'inspirer : https://fr.wikipedia.org/wiki/Tri_par_s%C3%A9lection
Cdlt
0