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
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
A voir également:
- Tri par extraction en c
- Extraction video youtube - Guide
- Excel trier par ordre croissant chiffre - Guide
- Logiciel tri photo gratuit - Guide
- Triez la liste comme sur cette illustration (attention, on ne voit que le début …). quel est le mot formé par les 6 dernières lettres de la colonne code ? - Forum Excel
- Excel trier par date ne fonctionne pas ✓ - Forum Excel
6 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
10 déc. 2008 à 20:57
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
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
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
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
10 déc. 2008 à 21:15
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
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
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
10 déc. 2008 à 21:08
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
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; }
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...
Le tri ne s'éffectue toujours pas ceci dis...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
10 déc. 2008 à 21:31
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
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
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
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++;
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
11 déc. 2008 à 11:54
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
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