Langage C, classement ordre croissant-decroi.

Résolu/Fermé
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 - 3 mai 2011 à 18:13
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 - 28 déc. 2011 à 14:33
Bonjour,

Je voudrais faire un programme qui remplit les notes d'une classe, affiche le maximum, le minimum, la moyenne des notes, puis classe les notes par ordre croissant puis décroissant. Mais je n'arrive pas à programmer la partie des classements par ordre croissant ou decroissant (ou c'est très long et je m'embrouille). voici mon programme:

#include<stdio.h>
int tab[20];
int note,a,b,c,max,min;
float moy;
main()
{
for(a=0;a<=19;a++)
{
printf("Entrez les notes: ");
scanf("%d", &tab[a]);
}
max=tab[0];
for(a=1;a<=19;a++)
{
if(max<tab[a])
max=tab[a];
}
min=tab[0];
for(a=1;a<=19;a++)
{
if(min>tab[a])
min=tab[a];
}
for(a=0;a<20;a++)
{
moy=(moy+tab[a]);
}
moy=moy/20;
printf("La moyenne est %.2f, le minimum %d et le maximum %d", moy,min,max);
}

Merci d'avance.


1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 3/05/2011 à 21:24
Bonjour,
Au plus simple, on a un tableau avec 5 notes : 1 5 3 4 2
on vérifie par paire en se décalant. Et si supérieur ou inférieur on échange les valeurs pour mettre dans l'ordre voulu au final.
En croissant si le nombre précédent est supérieur on échange sinon on ne fait rien.
En admetant qu'on commence à i=1 dans la boucle pour i<n
(if tab[i-1]>tab[i])
1 5 3 4 2 , (1>5) on ne change rien
1 5 3 4 2 , (5>3) on change
1 3 5 4 2 , (5>4) on change
1 3 4 5 2 , (5>2) on change
1 3 4 2 5
on boucle dessus autant de fois qu'il y a de valeurs dans le tableau, donc une seconde boucle pour répéter celle-ci. ça doit faire n*n en tout, mais pas sûr ahaha

Pour échanger vous pouvez utiliser une variable qui ne sert qu'à garder un instant la valeur :
int a=5, b=2, temp;
temp=a;
a=b;
b=temp;
3
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
4 mai 2011 à 01:11
Ok merci. On peut aussi le faire sans passer par variable intermédiaire en faisant:
a=a+b (cumule des valeurs dans b)
b=a-b=a+b-b=a (transfert de a dans b)
a=a-b=a+b-a=b (transfert de b dans a)

Mais imagine si tu as 20,40 ou 100 notes, ca serait vraiment long avec tout le risque de faire des erreurs
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
4 mai 2011 à 01:32
Voici le programme mais merci quand même pour ton aide Hxyp

#include<stdio.h>
int tab[5];
int note,a,b,c,x,max,min,g;
float moy;
main()
{
for(a=0;a<=4;a++)
{
printf("Entrez les notes: ");
scanf("%d", &tab[a]);
}
max=tab[0];
for(a=1;a<=4;a++)
{
if(max<tab[a])
max=tab[a];
}
min=tab[0];
for(a=1;a<=4;a++)
{
if(min>tab[a])
min=tab[a];
}
for(a=0;a<=4;a++)
{
moy=(moy+tab[a]);
}
moy=moy/5;
printf("La moyenne est %.2f, le minimum %d et le maximum %d\n", moy,min,max);
for(b=1;b<5;b++)
{
x=tab[b];
c=b-1;
while(c>=0&&tab[c]>x)
{
tab[c+1]=tab[c];
c=c-1;
tab[c+1]=x;
}
}
for(g=0;g<5;g++)
printf("%d\n", tab[g]);
}
1