aide calcule de moyenne

aide calcule de moyenne - C - Programmation

Marsh Posté le 18-04-2006 à 10:28:01    

Bonjour,
 
j'ai besoin d'aide pour un programme simple je voudrai pour l'intant affichez que la moyenne général sachant que l'objectif final est :
 
- Chaque élève (strictement moins de 10 élèves).
- De la classe en général.  
- Avoir le Nom, le Prénom et un N° d’élève.  
 
voila ce que j'ai fait :
 
 
EDIT:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5.     char nmmat[12];     // Nom de la matières
  6.     int nbelv;      // Nombres d'élève
  7.     int nuelv;      // Numéros d'élève
  8.     int moy;        // Moyenne de l'élève
  9.     int i =0;
  10.     int a = 0;
  11.     int somme = 0;
  12.    
  13.    
  14.    
  15.     printf("Bienvenue, Veuillez saisir le nom de votre matiere svp : " );
  16.     scanf ("%s",&nmmat);
  17.        
  18.    
  19.     do{
  20.          
  21.        printf ("\nCombien avez vous d'eleve, entrer moins de 10 eleves : " );
  22.        scanf("%i",&nbelv); 
  23.                                                    
  24.        }while( nbelv > 9 );   
  25.    
  26.    
  27.     for (i = 1 ; i <= nbelv ; i++)
  28.     {
  29.        
  30.              printf("quelle est sa note : " );
  31.              scanf("%d",&somme);
  32.              a = somme*1+a;
  33.              
  34.     }
  35.     printf("\n%d somme des notes \n",a);   
  36.     printf("%d nombre deleves \n",nbelv);
  37.    
  38.     moy = a / nbelv;
  39.     printf("Moyenne : %d\n\n",moy);
  40.  
  41.   system("PAUSE" );
  42.   return 0;
  43. }


 
premier:

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     char nm;        // Nom de l'élève
  4.     char pn;        // Prénom de l'élève
  5.     char nmmat;     // Nom de la matières
  6.     int nbelv;      // Nombres d'élève
  7.     int nuelv;      // Numéros d'élève
  8.     int moy;        // Moyenne de l'élève
  9.     int i;
  10.     int a;
  11.    
  12.    
  13.    
  14.    
  15.     printf ("Bienvenue, Veuillez saisir le nom de votre matiere svp : " );
  16.     scanf ("%s",&nmmat);
  17.     printf ("%s \n",&nmmat);
  18.     ede: //retour a l'erreur
  19.     printf ("\nCombien avez vous d'eleve  : " );
  20.     scanf("%i",&nbelv);
  21.    
  22.     if( nbelv > 9 )
  23.     {
  24.       printf("\nOperation impossible vous ne pouvez depasse 9 eleves\n" );
  25.       goto ede;
  26.     }
  27.    
  28.     for(i = 1 ; i <= nbelv;i++)
  29.     {
  30.        
  31.      }
  32.     printf("%d",&a);
  33.  
  34.   system("PAUSE" );
  35.   return 0;
  36. }

Message cité 1 fois
Message édité par icepiro le 19-04-2006 à 16:24:45
Reply

Marsh Posté le 18-04-2006 à 10:28:01   

Reply

Marsh Posté le 18-04-2006 à 11:25:55    

icepiro a écrit :

voila ce que j'ai fait :


Ce code semble incomplet...


Compiling: main.c
main.c: In function `main_':
main.c:15: error: implicit declaration of function `printf'
main.c:15: warning: nested extern declaration of `printf'
<internal>:0: warning: redundant redeclaration of 'printf'
main.c:16: error: implicit declaration of function `scanf'
main.c:16: warning: nested extern declaration of `scanf'
<internal>:0: warning: redundant redeclaration of 'scanf'
main.c:32: warning: int format, pointer arg (arg 2)
main.c:34: error: implicit declaration of function `system'
main.c:34: warning: nested extern declaration of `system'
main.c:3: warning: unused variable `nm'
main.c:4: warning: unused variable `pn'
main.c:7: warning: unused variable `nuelv'
main.c:8: warning: unused variable `moy'
Process terminated with status 1 (0 minutes, 0 seconds)
3 errors, 10 warnings


Citation :

Code :
  1. char nm;        // Nom de l'élève
  2.    char pn;        // Prénom de l'élève
  3.    char nmmat;     // Nom de la matières



Ces variables de 1 char sont insuffisantes pour stocker des chaines de caractères significatives. Il faut des tableaux de char de taille suffisante.

Citation :

Code :
  1. printf ("%s \n", &nmmat);
  2.     printf("%d",&a);



Pourquoi & ?
 
L'usage de goto est fortement déconseillé. Il faut trouver la structure de code qui répond au besoin.
 
Les saisies par scanf() sont difficiles à mettre en oeuvre de façon fiable. Préférer fgets() avec nettoyage et fonction de conversion si nécessaire..
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers


Message édité par Emmanuel Delahaye le 18-04-2006 à 11:48:54

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 11:33:50    

Oui je sais qu'il est incomplet sinon je ne demanderais pas d'aide ;)

Message cité 1 fois
Message édité par icepiro le 18-04-2006 à 11:34:47
Reply

Marsh Posté le 18-04-2006 à 11:39:51    

icepiro a écrit :

Oui je sais qu'il est incomplet sinon je ne demanderais pas d'aide ;)


Certes, mais tu n'a pas dit quels étaient les problèmes (compilation, exécution ?). Pour avoir de l'aide de qualité, il faut poser des questions précises...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 11:44:36    

je ne sais pas comment faire la moyenne des notes des élèves (i) en (de 0 a 20 avec virgule) et afficher la note de CHAQUE élèves + la moyenne général

Message cité 2 fois
Message édité par icepiro le 18-04-2006 à 12:04:10
Reply

Marsh Posté le 18-04-2006 à 11:52:22    

icepiro a écrit :

je ne sais pas comment faire la moyenne du nombres d'élèves (i) en (de 0 a 20 avec virgule) et afficher la note de CHAQUE élèves + la moyenne général


 
faire la moyenne du nombres d'élèves n'a aucun sens. Tu veux dire faire la moyenne des notes de la classe ?
 
Simple problème de math. Sais-tu calculer une moyenne ?
 
Rappel : moyenne = somme (valeurs) / nombre de valeurs.
 
A toi de jouer...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 11:53:28    

icepiro a écrit :

je ne sais pas comment faire la moyenne du nombres d'élèves (i) en (de 0 a 20 avec virgule) et afficher la note de CHAQUE élèves + la moyenne général


 
Une moyenne, c'est bêtement une somme des notes divisée par le nombre de notes.
 
EDIT : burned  [:benou_grilled]


Message édité par Elmoricq le 18-04-2006 à 11:53:57
Reply

Marsh Posté le 18-04-2006 à 12:03:03    

Merci mais je sais mathématiquement faire la moyenne des notes...  ce que je ne sais pas faire c'est comment l'intégrer en c je suis bloqué car quand je tente d'afficher une valeur il m'affiche un truc énorme
Comment faire un truc que récupèrent les notes des élèves sans donner de nombres énormes  (en les additionnant puis en divisant par i)


Message édité par icepiro le 18-04-2006 à 12:08:49
Reply

Marsh Posté le 18-04-2006 à 12:59:38    

A moins que tu ne rentres les notes une par une à la main, tu vas devoir utiliser des matrices pour contenir la liste des notes par matières, ou t'amuser à faire un tableau de notes par matières...
Ensuite tu parcours cette liste de notes et tu les additionnes au fur et à mesure, avec un tableau ça donnerait ca :

Code :
  1. int somme = 0
  2. for ( int i = 0 ; i < nbeleve ; i++)
  3. somme += note[i] ; // somme des notes ici, comme il n'y a qu'une seule instruction dans le for les accolades ne sont pas obligatoires
  4. moyenne = somme / nbeleve ;
  5. printf("Moyenne : %d\n",moyenne) ;


 
Dans ton code tu as un nombre très grand parce que tu fais afficher l'adresse de a ( le & fait afficher son adresse ) et pas son contenu, mais comme tu n'as pas initialisé a, même en faisant afficher son contenu, tu auras au mieux un plantage du programme, au pire un nombre sans aucune signification qui va s'afficher mais que tu pourrais considèrer comme bon résultat si tu ne vois pas ton erreur.

Reply

Marsh Posté le 18-04-2006 à 14:26:35    

merci pour cette ligne : somme += note[i] ;
j'ai l'erreur suivante :subscripted value is neither array nor pointer  
???

Reply

Marsh Posté le 18-04-2006 à 14:26:35   

Reply

Marsh Posté le 18-04-2006 à 14:57:29    

icepiro a écrit :

merci pour cette ligne : somme += note[i] ;
j'ai l'erreur suivante :subscripted value is neither array nor pointer  
???


Il faut tout lire :

Citation :

A moins que tu ne rentres les notes une par une à la main, tu vas devoir utiliser des matrices pour contenir la liste des notes par matières, ou t'amuser à faire un tableau de notes par matières...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 15:34:20    

Ne le prends pas mal, mais tu devrais allez voir quelques tutoriaux pour débutants en C, tableaux/matrices, chaines de caractères, pour cet exercice et si tu veux continuer à apprendre le C, pointeurs, structures, fichiers, listes chainées,...

Reply

Marsh Posté le 18-04-2006 à 16:19:31    

LePhasme a écrit :

Ne le prends pas mal, mais tu devrais allez voir quelques tutoriaux pour débutants en C, tableaux/matrices, chaines de caractères, pour cet exercice et si tu veux continuer à apprendre le C, pointeurs, structures, fichiers, listes chainées,...


 
Je ne le prends pas mal j’apprends et c'est bien mais la je suis un peu noyer il me faudrait un exemple avec un programme que j'ai fait car j'ai lu des tutoriaux cette aprèm et même si j'ai bien compris le principe je n’arrive pas a l'appliquer dans ce cas voici mon programme avec vos modifications :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5.     char nm[12];        // Nom de l'élève
  6.     char pn[12];        // Prénom de l'élève
  7.     char nmmat[12];     // Nom de la matières
  8.     int nbelv;      // Nombres d'élève
  9.     int nuelv;      // Numéros d'élève
  10.     int moy;        // Moyenne de l'élève
  11.     int i =0;
  12.     int a;
  13.     int somme = 0;
  14.     float note[i][a];
  15.    
  16.    
  17.    
  18.     printf ("Bienvenue, Veuillez saisir le nom de votre matiere svp : " );
  19.     scanf ("%s",nmmat);
  20.     printf ("%s \n",&nmmat);
  21.     ede: //retour a l'erreur
  22.     printf ("\nCombien avez vous d'eleve  : " );
  23.     scanf("%i",nbelv);
  24.    
  25.     if( nbelv > 9 )
  26.     {
  27.       printf("\nOperation impossible vous ne pouvez depasse 9 eleves\n" );
  28.       goto ede;
  29.     }
  30.    
  31.     for (  i = 0 ; i <= nbelv ; i++)
  32.     somme += note[i][a] ; // somme des notes  
  33.     moy = somme / nbelv;
  34.     printf("Moyenne : %d\n",moy);
  35.  
  36.   system("PAUSE" );
  37.   return 0;
  38. }

Message cité 1 fois
Message édité par icepiro le 18-04-2006 à 17:07:12
Reply

Marsh Posté le 18-04-2006 à 16:56:04    

icepiro a écrit :

voici mon programme avec vos modifications :


  • Manque les entêtes (<stdio.h> etc.)
  • Tu as défini float note[i], soit un tableau à une dimension, et tu lis note[i][a] (2 dimensions). C'est incohérent.
  • Je t'ai déjà dit que pour saisir une chaine, il fallait non pas un char tout seul, mais un tableau de char d'une taille suffisante. Si tu ne tiens pas compte des remarques, j'arrête de perdre mon temps...


Si tu ne comprends pas les modifications, ça ne sert à rien. Tu ne devrais écrire que du code que tu maitrises. Pour le reste, pose des questions précises.
 
Résout les problèmes un par un. Ca crash au premier scanf()... (Et tu sais pourquoi...)


Message édité par Emmanuel Delahaye le 18-04-2006 à 16:59:01

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 17:05:58    

jai edité le message au dessus du tien chef :)
ps: je suis en train de voir pour utiliser la fontion fgets..

Message cité 1 fois
Message édité par icepiro le 18-04-2006 à 17:16:11
Reply

Marsh Posté le 18-04-2006 à 17:37:27    

icepiro a écrit :

jai edité le message au dessus du tien


  • printf() avec "%s demande l'adresse du premier élément d'une chaine. C'est précidement ce qu'est maintenant 'nmmat'. Retirer le &.
  • scanf() avec "%i" demande l'adresse d'un int... Manque un &.


Message édité par Emmanuel Delahaye le 18-04-2006 à 17:40:25

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-04-2006 à 18:40:18    

euh...Quand tu declares ton tableau notes : tu lui donnes deux dimensions  
i et a.
Seulement pour le moment tu as initialise i a 0 donc ta premiere dimension vaudra 0 --> j'sais pas si c'est utile.
Ensuite ton a n'est pas initialise lorsque tu cree le tableau.
 
Ces deux choses font que lors de l'acces au tableau tu as toutes les chances que ca plante.
 
Deux solutions :  
Fixe toi meme les dimensions de ton tableau  
par exemple tu a 10 eleves et 5 notes par eleves --> float notes [10][5]
ou tu peux declarer ces deux valeurs comme des constantes (avec #define)
 
Sinon tu pourrais egalement voir du cote de l'allocation dynamique mais je pense qu'il y a d'autres notions plus basiques a saisir avant celle la ;)


Message édité par gocho le 18-04-2006 à 18:41:15

---------------
Mon feedback
Reply

Marsh Posté le 18-04-2006 à 20:11:12    

Note que tu n'as pas initialisé ta matrice de notes, donc elle contient des nombres indéterminés et la somme donnera un résultat erroné.
 
Ensuite comme te l'a déjà dit Emmanuel Delahaye retire ce goto et remplace le par une boucle, on n'utilise un goto que quand on a pas le choix, or ici tu peux aisément le remplacer par une boucle while.
 
Et enfin, ta matrice contient les notes pour chaque matières, donc si on dit qu'une matière est représentée par une ligne et les notes d'un élève par une colonne de la matrice, donc tu dois déterminer quelle matière correspond à quelle ligne, ensuite quand tu l'a fait tu assigne à une variable l'indice de la ligne (matière) voulue et ensuite tu parcours toute la ligne du tableau.
 
Si tu n'y arrives pas ou que je me suis mal expliqué je posterais un exemple de code après mais je voudrais simplement que tu essaies par toi-même avant.

Reply

Marsh Posté le 19-04-2006 à 10:57:20    

je me suis mal exprimé mon prog est plus simple (ou plus complexe) que sa il n'y a qu'une matière (rentrer le nom permet juste d'identifier pour l'utilisateur le nom de la matière) par contre il y a plusieurs élèves qui doit être clairement identifier (par un nom, prénom, et un ID) cela donnera en sortie un avec en titre le nom de la matière puis un tableau en colonne (nm,pn,id,note,) et en ligne (nombre d'élèves et moyenne) je suis en train de pencher sur le tableau en ce moment.
edit: j'ai viré le goto par un do while ca donne ca :
 

Code :
  1. printf ("\nCombien avez vous d'eleve  : " );
  2.     scanf("%i",&nbelv);
  3.    
  4.     do{
  5.        printf("\nOperation impossible vous ne pouvez depasse 9 eleves\n" );   
  6.        printf ("\nCombien avez vous d'eleve  : " );
  7.        scanf("%i",&nbelv);                                                 
  8.        }while( nbelv > 9 );

Message cité 1 fois
Message édité par icepiro le 19-04-2006 à 11:00:08
Reply

Marsh Posté le 19-04-2006 à 11:20:43    

icepiro a écrit :

edit: j'ai viré le goto par un do while ca donne ca :


C'est la bonne démarche. Reste à remplacer scanf() par fgets() + la fonction de conversion qui va bien...
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers


Message édité par Emmanuel Delahaye le 19-04-2006 à 11:22:47

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 19-04-2006 à 11:24:03    

Personnellement je n'utilise que des while mais bon c'est du chipotage.
Si tu n'as qu'une seule matière pas besoin de matrice un vecteur (tableau) suffit pour les notes.

Reply

Marsh Posté le 19-04-2006 à 12:26:37    

LePhasme a écrit :

Personnellement je n'utilise que des while <...>


Ca dépend des cas. La pré-condition n'est pas toujours établie... (mais on peut toujours la forcer, c'est vrai).
OK pour dire que while() (et même for()) couvre tous les cas. Mais do-while() a aussi son utilité dans certains cas.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 19-04-2006 à 15:29:50    

Voila j'ai enfin reussi a calculer la moyenne total a partir d'une note par eleve (oui je sais...) tu me pardonne emmanuel mais comme je ne connais pas la fontion fgets je me pencherai dessus quand les fonctions de base que doit faire mon programme seront finit(en sortie les noms prénoms et num d'id avec 2 moyennes : celle DES notes de l'élève plus celle de la classe).
Mon code actuelle est un edit de mon premier post.

Reply

Marsh Posté le 19-04-2006 à 15:36:43    

Vu ton avant dernière phrases tu dois faire la moyenne avec plusieurs matières maintenant ?

Reply

Marsh Posté le 19-04-2006 à 15:38:20    

LePhasme a écrit :

Vu ton avant dernière phrases tu dois faire la moyenne avec plusieurs matières maintenant ?


pas plusieurs matiere plusieur note par élève (plusieurs notes qui apartienne a la meme matiere)
 
emmanuel: j'ai ecrit le post avant d'éditer

Message cité 1 fois
Message édité par icepiro le 19-04-2006 à 15:40:52
Reply

Marsh Posté le 19-04-2006 à 15:59:23    

icepiro a écrit :

emmanuel: j'ai ecrit le post avant d'éditer


Ok, j'ai nettoyé mon clavier... Ca schlingue...
 
On pourrait avoir une version 'clean' ?


Compiling: main.c
main.c: In function `main_':
main.c:21: warning: char format, different type arg (arg 2)
main.c:7: warning: unused variable `nm'
main.c:8: warning: unused variable `pn'
main.c:11: warning: unused variable `nuelv'
main.c:16: warning: unused variable `note'
Linking console executable: D:\dev\ed02\cb\ed02.exe
Process terminated with status 0 (0 minutes, 8 seconds)
0 errors, 5 warnings


EDIT
 

  • Entre la matière "chimie amusante" : débordement de tableau (comportement indéfini...)
  • En réponse à la question "Combien avez vous d'eleve, entrer moins de 10 eleves", tape a<enter> pour voir...


Il ne faut pas utiliser scanf() si on ne sait pas s'en servir.
 
J'ai donné les alternatives...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 19-04-2006 à 16:17:13

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 19-04-2006 à 16:07:14    

Emmanuel Delahaye a écrit :


On purraiit avoir une version 'clean' ?


 
c'est fait toujours le même edit celui du premier post
 
edit: c'est refait

Message cité 1 fois
Message édité par icepiro le 19-04-2006 à 16:31:51
Reply

Marsh Posté le 19-04-2006 à 16:16:53    

icepiro a écrit :

c'est fait toujours le même edit celui du premier post

Code :
  1. char nmmat[12];     // Nom de la matières
  2. <...>
  3.    scanf ("%s",&nmmat[12]);




de pire en pire...


Message édité par Emmanuel Delahaye le 20-04-2006 à 13:37:35

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 20-04-2006 à 12:55:42    

Citation :

float note[i][a];


 :??:  :??:  :??:  
 
a est inconue  :??:  
 
 
 
 

Reply

Marsh Posté le 20-04-2006 à 13:19:00    

Mieux encore, a est potentiellement négatif :D

Reply

Marsh Posté le 20-04-2006 à 18:29:50    

La dernière version du code est dans le premier post...

Reply

Marsh Posté le 20-04-2006 à 19:30:07    

faut revoir les saisies utilisateurs et la moyenne est un entier contenant le resultat d'une division entiere, ca serait mieux en reel

Reply

Marsh Posté le 20-04-2006 à 21:30:23    

skelter a écrit :

faut revoir les saisies utilisateurs et la moyenne est un entier contenant le resultat d'une division entiere, ca serait mieux en reel

et encore mieux en double !


---------------
TriScale innov
Reply

Marsh Posté le 20-04-2006 à 22:26:39    

oui, j'ai jamais dit le contraire ;)

Reply

Marsh Posté le 21-04-2006 à 20:07:16    

En même temps pour une moyenne de notes de cours je doute qu'on ait besoin du 15ème nombre après la virgule...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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