Problème avec mon code C

Résolu/Fermé
sonic1ne Messages postés 8 Date d'inscription dimanche 15 juin 2008 Statut Membre Dernière intervention 15 mars 2009 - 4 mars 2009 à 16:49
sonic1ne Messages postés 8 Date d'inscription dimanche 15 juin 2008 Statut Membre Dernière intervention 15 mars 2009 - 4 mars 2009 à 18:09
Bonjour, Je programme en C depuis peu de temp et j'essaie de coder un petit programme en c qui affiche le nom, prénom, l'âge des élèves d'une classe ainsi que leur notes scolaires et la moyenne de celles-ci. Mon problème et, que je ne trouve pas comment on fais la somme des notes de chaque élèves dans le champ notes d'un tableau de structure, et ensuite afficher la moyenne de cette somme.

Voici le code :

#include <stdio.h>
#include <string.h>

#define TAILLE_NOM 10
#define TAILLE_PRENOM 2*TAILLE_NOM
#define NB_NOTES 5
#define MAX_ETUDIANTS 50

main()
{
  int i,j, nbelements, nbeleves,finir_saisie ;
  
  
  /* declaration du type etudiant */
  struct etudiant {
                    char nom[TAILLE_NOM]       ;
                    char prenom[TAILLE_PRENOM] ;
                    float notes[NB_NOTES];
                    float somme[NB_NOTES];
                    int age;                  
                  } ;
  
  /* declaration du tableau des eleves */
  struct etudiant tab_eleves[MAX_ETUDIANTS];

  /* === DEBUT DU PROGRAMME === */
  i=0;
  finir_saisie=0;
  /* boucle de saisie */
  while (! finir_saisie)
  {
   printf("Entrez un nom ( nom=fin   pour terminer):");
   scanf("%s",tab_eleves[i].nom);
   
   finir_saisie=((strcmp(tab_eleves[i].nom,"fin"))==0);

   /* si la saisie n'est pas finie */
   /* on demande le reste des informations */
   if (! finir_saisie)
   {   
     printf("Entrez un prénom:");
     scanf("%s",tab_eleves[i].prenom);
  
     printf("Entrez un âge:");
     scanf("%d",&tab_eleves[i].age);
     
     /* --- saisie des notes --- */
     printf("Entrez les %d notes :", NB_NOTES);
     
     for (j=0; j<NB_NOTES; j++)
     {
      scanf("%f", &tab_eleves[i].notes[j]);
      tab_eleves[i].somme[j] += tab_eleves[i].notes[j];
      
      /* --- calcul de la moyenne --- */
     tab_eleves[i].somme[j] /=  NB_NOTES;
     }  
     i++ ;
   }
   printf("\n");
  } 

  
  /* on met a jour la variable de controle du tableau */ 
  nbeleves = i ;
  nbelements = j;
 
  /* boucle de verification */
  printf("\n----- Vérification saisie ------\n");
  
  for (i=0; i<nbeleves; i++)
  {
     printf("\neleve %2d : ",i);
     printf("%10s %10s ",tab_eleves[i].nom,tab_eleves[i].prenom);
     printf("%2d \n", tab_eleves[i].age);
     printf("Notes :");
     for (j=0; j<NB_NOTES; j++)
      printf("%6.2f", tab_eleves[i].notes[j]);
      printf("\nMoyenne :");
      for (j=0; j<nbelements; j++)
      {
       printf("%6.2f", tab_eleves[i].somme[j]);
      }
      printf("\n");
  }
  printf("\n");
}


et voici ce que j'obtient comme résultat :

Entrez un nom ( nom=fin   pour terminer):nom1
Entrez un prénom:prenom1
Entrez un âge:30
Entrez les 5 notes :10
12.5
15
15.5
20

Entrez un nom ( nom=fin   pour terminer):nom2
Entrez un prénom:prenom2
Entrez un âge:35
Entrez les 5 notes :12
15
10
16
9

Entrez un nom ( nom=fin   pour terminer):fin


----- Vérification saisie ------

eleve  0 :       nom1    prenom1 30 
Notes : 10.00 12.50 15.00 15.50 20.00
Moyenne :  2.00  2.50  3.00  3.10  4.00

eleve  1 :       nom2    prenom2 35 
Notes : 12.00 15.00 10.00 16.00  9.00
Moyenne :  2.40  3.00  2.00  3.20  1.80


Le résultat que j'aimerez obtenir et du genre : moyenne élève1 = 14,6 et moyenne1 élève2 = 12,4.

Quelqu'un pourrait-il m'indiqué ce qui foire dans mon code. Merci.
A voir également:

3 réponses

mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
4 mars 2009 à 17:10
jvois pas pourquoi tu utilises un tableau pour stocker la somme une variable float suffit
essaye ça
#include <stdio.h>
#include <string.h>

#define TAILLE_NOM 10
#define TAILLE_PRENOM 2*TAILLE_NOM
#define NB_NOTES 5
#define MAX_ETUDIANTS 50

main()
{
  int i,j, nbelements, nbeleves,finir_saisie ;


  /* declaration du type etudiant */
  struct etudiant {
                    char nom[TAILLE_NOM]       ;
                    char prenom[TAILLE_PRENOM] ;
                    float notes[NB_NOTES];
                    float somme;
                    int age;
                  } ;

  /* declaration du tableau des eleves */
  struct etudiant tab_eleves[MAX_ETUDIANTS];

  /* === DEBUT DU PROGRAMME === */
  i=0;
  finir_saisie=0;
  /* boucle de saisie */
  while (! finir_saisie)
  {
   printf("Entrez un nom ( nom=fin   pour terminer):");
   scanf("%s",tab_eleves[i].nom);

   finir_saisie=((strcmp(tab_eleves[i].nom,"fin"))==0);

   /* si la saisie n'est pas finie */
   /* on demande le reste des informations */
   if (! finir_saisie)
   {
     printf("Entrez un prénom:");
     scanf("%s",tab_eleves[i].prenom);

     printf("Entrez un âge:");
     scanf("%d",&tab_eleves[i].age);

     /* --- saisie des notes --- */
     printf("Entrez les %d notes :", NB_NOTES);

     for (j=0; j<NB_NOTES; j++)
     {
      scanf("%f", &tab_eleves[i].notes[j]);
      tab_eleves[i].somme += tab_eleves[i].notes[j];

    
     }
     i++ ;
   }
   printf("\n");
  }


  /* on met a jour la variable de controle du tableau */
  nbeleves = i ;
  nbelements = j;

  /* boucle de verification */
  printf("\n----- Vérification saisie ------\n");

  for (i=0; i<nbeleves; i++)
  {
     printf("\neleve %2d : ",i);
     printf("%10s %10s ",tab_eleves[i].nom,tab_eleves[i].prenom);
     printf("%2d \n", tab_eleves[i].age);
     printf("Notes :");
     for (j=0; j<NB_NOTES; j++)
      printf("%6.2f", tab_eleves[i].notes[j]);
      printf("\nMoyenne :");

       printf("%6.2f", tab_eleves[i].somme/NB_NOTES);

      printf("\n");
  }
  printf("\n");
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 mars 2009 à 17:17
Salut,
Tout d'abord, je te conseille plutôt de mettre ta structure en dehors de ton main. C'est plus lisible.
Ensuite main renvoie un int. Donc int main(void) et à la fin return 0;
Ensuite pour la moyenne, je commande de créer tout simplement un autre champ dans ta structure intitulée moyenne.
Une fois que tu as fait les sommes des notes, et que tu as divisé par le nombre de notes, tu stockes le résultat dans ce champ. Tu n'as pas besoin du champ somme. Ou alors pas en tableau.
Ce qui donnerait :
float somme=0;
for (int j=0; j<NB_NOTES; j++)
{
     somme+=tab_eleves[i].notes[j];
}
tab_eleves[i].moyenne =  somme/NB_NOTES;

Et après t'affiches le champ moyenne.
Cdlt
0
sonic1ne Messages postés 8 Date d'inscription dimanche 15 juin 2008 Statut Membre Dernière intervention 15 mars 2009
4 mars 2009 à 18:09
Merci pour ta réponse mype. J'avais déjà essayé d'utiliser somme sans tableau mais sans mettre le printf de vérification saisie de somme comme tu l'a fait à la fin du programme. Le résultat est ce que je voulais.
Merci aussi ta réponse fiddy. je suis en train de l'étudier.
0