Posez votre question Signaler

Programme en C [ tri par extraction ] [Résolu]

kent87042 - Dernière réponse le 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...?
Lire la suite 
Réponse
+0
moins plus
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
Ajouter un commentaire
Annonces
 
moins plus
Réponse
+0
moins plus
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++;
	 }
}
fiddy 10365Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 26 mai 2015Dernière intervention - 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
Répondre
Ajouter un commentaire
Annonces
 
moins plus
Réponse
+0
moins plus
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;
} 

Ajouter un commentaire
Réponse
+0
moins plus
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...
kent87042- 10 déc. 2008 à 21:22
C'est vraiment l'algorythme qui m'interesse en fait
Répondre
fiddy 10365Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 26 mai 2015Dernière intervention - 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.
http://fr.wikipedia.org/wiki/Tri_%C3%A0_bulles

Cdlt
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
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++;
Ajouter un commentaire
Réponse
+0
moins plus
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 : http://fr.wikipedia.org/wiki/Tri_par_s%C3%A9lection
Cdlt
Ajouter un commentaire
Ce document intitulé «  Programme en C [ tri par extraction ]  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.