Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/02/2013, 07h27   #1
krolle666
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2012
Messages : 13
Points : 0
Points : 0
Par défaut Fonctions et tableaux

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 #define définissant la taille de deux tableaux tabnotes et distribution.
Soit tabnotes un tableau de N valeurs flottantes représentant des notes d’examen :
Code :
float tabnotes[N]= {14.5,17.9,6.4,9.2,12.0,13.1,11.4,10.9}
Soit distribution 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <cini.h>
#define N 8
#define M 5
 
void fourchette_notes ( float tabnotes[N], int taille, int distribution[M] ) {
 
int i;
int echec = 0;
int passable = 0;
int AB = 0;
int B = 0;
int TB = 0;
 
	for (i = 0; i <= taille; i++) {
		if (tabnotes[i] < 10) {
			echec = echec + 1 ;
			}
			if (tabnotes[i] >= 10 && tabnotes[i] < 12) {
			passable = passable + 1 ;
			}
			if (tabnotes[i] >= 12 && tabnotes[i] < 14) {
			AB = AB + 1 ;
			}
			if (tabnotes[i] >= 14 && tabnotes[i] < 16) {
			B = B + 1 ;
			}
			if (tabnotes[i] >= 16) {
			TB = TB + 1 ;
			}
			distribution[0]=echec;
		distribution[1]=passable;
		distribution[2]=AB;
		distribution[3]=B;
		distribution[4]=TB;
		}
 
}
 
void afficheTab(float tabnotes[N], int taille) {
	int i;
 
	for (i = 0; i < taille; i++) {
		printf("%f ", tabnotes[i]);
	}
	printf("\n");
}
 
int main() {
	float tabnotes[N]= {14.5, 17.9, 6.4, 9.2, 12.0, 13.1, 11.4, 10.9} ;
	int distribution[M]={0,0,0,0,0};
    int i;
 
    fourchette_notes(tabnotes, distribution);
 
    for (i = 0; i < N; i++) {
 
		printf("Note %d : ", (i+1));
        printf("%.2f \n", tabnotes[i]);
	}
 
 
 
	   for (i = 0; i < 1; i++) {
		   printf("Echec: %d \n ", distribution[0]);
		   printf("Passable: %d \n ", distribution[1]);
		   printf("Assez bien: %d \n ", distribution[2]);
		   printf("Bien: %d \n ", distribution[3]);
		   printf("Très bien: %d \n ", distribution[4]);
	}
 
 
	return 0;
}
J'espère que vous pourrez m'aider.
Merci d'avance,
krolle666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 10h00   #2
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 434
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 434
Points : 12 955
Points : 12 955
Quelques remarques :

1- void fourchette_notes ( float tabnotes[N], int taille, int distribution[M] )... Ce n'est pas faux, mais il faut savoir que spécifier ici la taille des tableaux ( N et M) est ignoré par le compilateur et que ceci est équivalent à void fourchette_notes ( float tabnotes[], int taille, int distribution[] )... et à void fourchette_notes ( float *tabnotes, int taille, int *distribution )....
(C'est le seul cas, paramètre de fonction, où la syntaxe considère équivalentes des notations tableau et pointeur)

2- for (i = 0; i <= taille; i++) si taille est le nombre d'éléments de tabnotes[], alors on doit avoir for (i = 0; i < taille; i++).

3- Il est possible de simplifier les tests :
Code :
1
2
3
4
5
6
7
if (tabnotes[i] < 10) {
   echec = echec + 1 ;
}
else if (tabnotes[i] < 12) {
         passable = passable + 1 ;
     }
     else if...
4- ERREUR : Dans main(), on a l'appel fourchette_notes(tabnotes, distribution); alors que la déclaration de la fonction est void fourchette_notes ( float tabnotes[N], int taille, int distribution[M] ) . Il manque un paramètre

5- Dans main() :
Code :
1
2
3
4
	   for (i = 0; i < 1; i++) {
		   printf("Echec: %d \n ", distribution[0]);
...
	  }
A quoi sert la boucle for ?
__________________
Publication : Concepts en C

Mon avatar : Glenn Gould

--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/02/2013, 10h40   #3
krolle666
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2012
Messages : 13
Points : 0
Points : 0
Tout d'abord merci pour cette réponse rapide. J'ai corrigé ce que vous avez remarqué (et oui c'est vrai que la boucle for elle est un peu sortie de mon chapeau) cependant il me reste toujours des questions:

4- Il faut donc que je mette:
Code :
fourchette_notes(tabnotes, taille, distribution);
?

Car si oui, j'ai une erreur de compilation comme quoi il n'est pas déclaré, et lorsque je le déclare ça me met qu'il n'est pas initialisé ...

Ensuite désolé d'abuser de votre gentillesse mais j'ai vraiment l'impression que même si mon programme compilait ma fonction soit ne fonctionne pas, soit n'est pas utilisée car dans mon tableau distribution mes valeurs sont toujours à 0 alors qu'elle devraient s'additionner.
krolle666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 12h06   #4
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 434
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 434
Points : 12 955
Points : 12 955
Il faut mettre le nombre d'éléments du tableau à traiter. Si le tableau est complètement rempli, ça donne :
Code :
fourchette_notes(tabnotes, N, distribution);
__________________
Publication : Concepts en C

Mon avatar : Glenn Gould

--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 12h31   #5
krolle666
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2012
Messages : 13
Points : 0
Points : 0
Génial ça fonctionne! je vais me pencher sur l'histogramme et je vous tiens au courant. Merci beaucoup en tout cas je m'arrachais les cheveux!
krolle666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 20h59   #6
krolle666
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2012
Messages : 13
Points : 0
Points : 0
petit up: l'histogramme est fait également. Je n'ai pas vraiment eu de soucis avec. cependant j'ai une dernière question et je ne vois 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 élèves pour d’ éventuelles notes plus basses à 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.

Donc pour le tableau etc je vois bien, cependant je ne vois pas du tout comment m'y prendre pour choisir les notes qui se compensent le mieux.
Merci d'avance,
krolle666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h27.


 
 
 
 
Partenaires

Hébergement Web