Programme en C [ tri par extraction ]

Résolu
kent87042 -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
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...?
Configuration: Windows XP
Firefox 3.0.4

6 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  2. kent87042
     
    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
  3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  4. kent87042
     
    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
    1. kent87042
       
      C'est vraiment l'algorythme qui m'interesse en fait
      0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kent87042
     
    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
  7. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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