fonctions et tableaux

fonctions et tableaux - C - Programmation

Marsh Posté le 16-02-2013 à 07:34:15    

Bonjour,
 
Cela fait des heures que je suis sur un exercice et j'aurais vraiment besoin d'un petit coup de main car on dirait que je suis vraiment sur la mauvaise piste. Voici l'énoncé:
 
"Soient N et M des constantes données par [B]#define[/B] définissant la taille de deux tableaux [B]tabnotes[/B] et [B]distribution[/B].
Soit[B] tabnotes[/B] un tableau de N valeurs flottantes représentant des notes d’examen :

Code :
  1. float tabnotes[N]= {14.5,17.9,6.4,9.2,12.0,13.1,11.4,10.9}


Soit [B]distribution [/B]un tableau de M = 5 valeurs entières représentant le nombre de notes correspondant à chacune des cinq mentions possibles (échec, passable, assez bien, bien, très bien). Par exemple, distribution [2] doit représenter le nombre de notes donnant droit à la mention assez bien. Ce tableau sera initialisé avec des zéros au début du programme.
 
1. On souhaite déterminer le nombre de notes dans tabnotes qui sont comprises entre 0 et 10.0 (échec), entre 10.0 et 12.0 (passable), entre 12.0 et 14.0 (assez bien), entre 14.0 et 16.0 (bien), et celles comprises entre 16.0 et 20.0 (très bien).
Donnez une fonction fourchette_notes qui remplit le tableau distribution.
 
2. Donnez le programme principal pour tester votre fonction.
 
3. On souhaite afficher un histogramme des notes triées par mention :
échec, passable, assez bien, bien, très bien. Un histogramme est une graphique qui contient une barre verticale pour chacune des cinq mentions, dont la hauteur dépend du nombre de notes qui entrent dans cette fourchette.
Une barre peut être représenté par un rectangle de largeur 10 pixels. Pour chaque note, le rectangle aura 10 pixels de hauteur supplémentaire. Pour mieux distinguer les barres, on laissera un espace de 5 pixels entre deux barres.
 
La fonction s’appelera dessin_histogramme. Déterminez ses paramètres et son type de retour, puis écrivez le corps de la fonction.
Ajoutez l’appel à cette fonction au programme principal. "
 
Je vous montre ce que j'ai fait, c'est à dire que je n'ai pas rajouté l'histogramme (et qui ne marche pas du tout mais je pense que vous pourrez plus m'aider en voyant mes erreurs):
 

Code :
  1. #include <cini.h>
  2. #define N 8
  3. #define M 5
  4. void fourchette_notes ( float tabnotes[N], int taille, int distribution[M] ) {
  5. int i;
  6. int echec = 0;
  7. int passable = 0;
  8. int AB = 0;
  9. int B = 0;
  10. int TB = 0;
  11. for (i = 0; i <= taille; i++) {
  12.  if (tabnotes[i] < 10) {
  13.   echec = echec + 1 ;
  14.   }
  15.   if (tabnotes[i] >= 10 && tabnotes[i] < 12) {
  16.   passable = passable + 1 ;
  17.   }
  18.   if (tabnotes[i] >= 12 && tabnotes[i] < 14) {
  19.   AB = AB + 1 ;
  20.   }
  21.   if (tabnotes[i] >= 14 && tabnotes[i] < 16) {
  22.   B = B + 1 ;
  23.   }
  24.   if (tabnotes[i] >= 16) {
  25.   TB = TB + 1 ;
  26.   }
  27.   distribution[0]=echec;
  28.  distribution[1]=passable;
  29.  distribution[2]=AB;
  30.  distribution[3]=B;
  31.  distribution[4]=TB;
  32.  }
  33. }
  34. void afficheTab(float tabnotes[N], int taille) {
  35. int i;
  36. for (i = 0; i < taille; i++) {
  37.  printf("%f ", tabnotes[i]);
  38. }
  39. printf("\n" );
  40. }
  41. int main() {
  42. float tabnotes[N]= {14.5, 17.9, 6.4, 9.2, 12.0, 13.1, 11.4, 10.9} ;
  43. int distribution[M]={0,0,0,0,0};
  44.     int i;
  45.    
  46.     fourchette_notes(tabnotes, distribution);
  47.    
  48.     for (i = 0; i < N; i++) {
  49.  printf("Note %d : ", (i+1));
  50.         printf("%.2f \n", tabnotes[i]);
  51. }
  52.    for (i = 0; i < 1; i++) {
  53.     printf("Echec: %d \n ", distribution[0]);
  54.     printf("Passable: %d \n ", distribution[1]);
  55.     printf("Assez bien: %d \n ", distribution[2]);
  56.     printf("Bien: %d \n ", distribution[3]);
  57.     printf("Très bien: %d \n ", distribution[4]);
  58. }
  59. return 0;
  60. }


 
J'espère que vous pourrez m'aider.  
Merci d'avance,

Reply

Marsh Posté le 16-02-2013 à 07:34:15   

Reply

Marsh Posté le 16-02-2013 à 16:58:59    

Pas grand chose à corriger, simplement être cohérent dans votre gestion de la fonction "fourchette_notes" :  
 
Si vous connaissez déjà la taille des tableaux, pas besoin de la passer à fourchette_notes  
 
Soit vous déclarez la fonction comme ci :  

Code :
  1. void fourchette_notes ( float tabnotes[N], int distribution[M] )


 
Soit comme ça :
 

Code :
  1. void fourchette_notes ( float tabnotes[], int taille, int distribution[M] )


 
Ensuite, vous modifiez éventuellement l'appel en ligne 53 en fonction du prototype que vous avez choisi (l'erreur vient de là, vous avez déclaré 3 paramètres mais vous n'en passez que 2)
De plus, dans votre for de la ligne 14, vous débordez du tableau en testant "i <= taille" au lieu de "i < taille"
 
Logiquement, le reste est bon ...

Reply

Marsh Posté le 16-02-2013 à 20:56:04    

Merci j'ai corrigé mon code et il fonctionne parfaitement, l'histogramme est fait également. cependant j'ai une dernière question et je ne vis pas du tout l'approche à avoir:
 
4) L’établissement définit sa règle de compensation : il faudra compenser chaque module où l’ étudiant(e) a obtenu une note au-dessous de 10.0 avec un module où il a dépassé 10.0 d’au moins la différence.
Chaque module au-dessus de 10.0 ne peut compenser qu’un seul autre module. Ecrivez une fonction  compensation(float tabnotes[]). Elle renvoie une valeur booléenne indiquant si oui ou non l’ étudiant a obtenu sa compensation.
Aide : On crée un nouveau tableau tabnotes_diff de taille égale à celle de tabnotes et initialement vide. Pour chaque note, on calcule d’abord la différence (positive ou négative) par rapport à 10.0 et l’inscrit dans tabnotes_diff[i].
On mettra à jour ces variables si on trouve une autre qui compense plus juste, c’est à dire la somme plus proche de 10.0, afin de préserver les notes plus élevèes pour d’ éventuelles notes plus basses `a compenser.
L’affichage final souhaité est le suivant :
L’étudiant a obtenu son semestre.
ou bien
L’étudiant n’a pas obtenu son semestre.
Ajoutez l’appel à cette fonction au programme principal.
 
Le tableau etc je vois bien, cependant je ne vois pas comment m'y prendre pour choisir les notes qui se compensent le mieux.
Merci.

Reply

Marsh Posté le 16-02-2013 à 21:10:22    

Comme ça, à froid, je dirais de prendre pour une note inférieure à la moyenne la note la plus basse qui permet de la compenser, ce qui permet de se garder les "grosses" notes pour compenser celles qui en ont le plus besoin.
 
PS : Après avoir lu l'énoncé de façon plus attentive, c'est exactement ce qui est marqué :)

Reply

Marsh Posté le 17-02-2013 à 01:20:29    

Merci beaucoup, pour l'instant je suis sur un exercice beaucoup plus gros qui me pose une colle monstrueuse donc je ne me suis pas vraiment penché sur cette dernière je vous l'avoue. mais avoir été mis sur la bonne piste.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed