IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Programme Calcul de moyenne


Sujet :

C

  1. #21
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Le but du programme est :

    1- Demander le nombre d'étudiants
    2- Saisir nom étudiant
    3- Saisir note de l'étudiant
    4- Enregistré dans un fichier
    5- Lire le fichier
    6- Donner la moyenne des notes
    7- Afficher nom des élèves + notes dont la note est inférieur à 10

    J'utilise char car l'utilisation de atof est un pré-requis.
    Donc je vais convertir une note du format texte vers un float.

  2. #22
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Voici ma fonction moyenne pour l'instant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void moyenne(void){
     
    char chnote[5];
    FILE* f;
    f=fopen("c:\\eleves.txt","r");
      while(fgets(chnote,5,f)){
     
     
       printf("%s",chnote);}
    }
    Mais pour l'instant elle ne fait que afficher ce qu'il se trouve dans le fichier.
    Est-ce que je dois utilisé un tableau à deux dimensions pour stocké à la fois les noms et les notes ? et ainsi je pourrais faire ma moyenne et sortir le nom des élèves qui ont moins de 10.

  3. #23
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Utilise plutôt un tableau de structures.

  4. #24
    Membre habitué
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Points : 188
    Points
    188
    Par défaut
    Bonjour, tu aurais du faire tout ca en c++ cela aurait était plus simple

    L'idée du tableau de structure est bonne elle te simplifiera la tache (ca marche aussi pour la première partie).

    Tu dois justes enregistrer les noms et notes dans un tableau de structures (dans la même etape tu peux calculer le nombre d'éléve et la somme des notes pour faire la moyenne). Puis après tu parcours ton tableau pour afficher les élèves qui ne correspondent pas à tes critères.

    Bonne journée

  5. #25
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci pour vos réponses je pense utilisé vos conseils pour me faire une version optimisée après. En faite, j'ai certaines contraintes à respecter la à savoir l'utilisation uniquement du C et de certains bout de code.

    Voici mon programme actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
     
    void transform(char *nom)
    {
        int depart = strlen(nom);
        int i;
        for (i = depart; i < 12; i++)
        {
            nom[i] = ' ';
        }
        nom[i] = '\0';
    }
     
     
    void saisie (void)//la renommer en creation
    {
        int nbretudiant=0, i=0,testfich=0;// testfich permet de tester si il faut créer le fichier ou non;
        char **nom;
        char  **note;
        FILE *f;
        printf("Combien d'etudiants ? ");
        scanf("%d", &nbretudiant);
        nom = malloc(nbretudiant * sizeof(char**));
        note = malloc(nbretudiant * sizeof(char**));
        for ( i = 0; i < nbretudiant; i++)
        {
            nom[i] = malloc(sizeof(char *) * 100);
            note[i] = malloc(sizeof(char *) * 10);
     
            printf("Nom de l'eleve numero %d ? \n", i + 1);
            scanf("%s", &nom[i][0]);
            transform(&nom[i][0]);
     
            printf("Note de l'eleve numero %d ? \n",i + 1);
            scanf("%s", &note[i][0]);
     
         //----------------------------------------------------------------------
         // Gestion du fichier Note.txt
         //--------------------------------------------------------------------
         if (testfich == 0) { //Tester ouverture du fichier sinon on le crée
            f=fopen("Note.txt","w+");;//on crée le fichier
             fclose(f);//on ferme le fichier car sinon on pourra pas enregistré tous les noms saisie
             f=fopen("Note.txt","a");
            testfich = 1;
            }
            else
            { 
              f=fopen("Note.txt","a");//on ouvre en mode ajout pour ajouter les noms des personnes
         fprintf(f, "\n");//on se remet à la ligne
         }
            fprintf(f, "%s %s\n", nom[i], note[i]);
     
            fclose(f);
     
            free(nom[i]);
            free(note[i]);
        }
     
        relecture(nbretudiant);//appel de la fonction lecture
     
        free(nom);
        free(note);
    }
    //*******************************************************************
    // Troisième partie : Fonction relecture
    // Lire et afficher le contenu du fichier
    //*********************************************************************       
    int relecture(int n){
      FILE* f = NULL;
      char tnom[11];//tableau de nom
      char tnote[6];//tableau de note
      f = fopen("Note.txt", "r");  //ouverture du fichier en mode lecture
      float vnote;
      float vn;
      float vmoyenne;
      int k; //détermine si il faut afficher en tête pour note < a 10
      k = 0;
      vnote=0.0;
      vn=0.0;
      vmoyenne=0.0;
       printf("\n\n");//saut de ligne
      while (!feof(f))//tant qu'il n'est pas vide faire
         {
          fscanf(f, "%s\n", tnom);//on récupère le nom
          fscanf(f, "%s\n", tnote);//on récupère la note
          vnote = atof(tnote);//on convertie la valeur de la note
          if (vnote <10){
               //printf("\nNOM ET NOTE < A 10/20 \n\n");
               printf("NOM : %s | NOTE : %s  \n",tnom,tnote);
               k++;//compte le nbr de note < 10 un plus pr te démarquer des autres
           }
            vn = vn + vnote;//on additionne toute les notes
         }
         vmoyenne = vn/n;//on calcul la moyenne
         printf("\n\nIL Y A %d  NOTE < 10/20.\n\n",k);
         printf("\n\nLA MOYENNE DES NOTES EST : %0.02f (arrondie a 2 chiffres apres la virgule) \n\n",vmoyenne);//on arrondi a 2chiffre aprés la virgule
      fclose(f);//fermeture du fichier
         return 0;
    }
     
    //*******************************************************************
    // FONCTION PRINCIPAL DU programme
    //********************************************************************* 
    int main(int argc, char *argv[])
    {
    //on Affiche l'en tête
     printf("\n ******************************************\n"
               "* NOMELEVE                            *\n"
               "* CLASSE                                *\n"
               "******************************************\n\n");
        saisie();
          system("PAUSE");    
        return 0;
    }
    Il fonctionne mais mon seul soucis c'est je voudrais découper la fonction saisie en deux fonctions à savoir saisie (saisie des noms et notes des étudiants) et création (création du fichier).

    Seulement je n'y arrive pas j'ai des problèmes de variables non déclarées.
    Si l'un de vous arrive à m'aider la dessus

  6. #26
    Membre habitué
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Points : 188
    Points
    188
    Par défaut
    Quelque chose dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
     
    void transform(char *nom)
    {
        int depart = strlen(nom);
        int i;
        for (i = depart; i < 12; i++)
        {
            nom[i] = ' ';
        }
        nom[i] = '\0';
    }
     
     
    void saisie (void)//la renommer en creation
    {
        int nbretudiant=0, i=0,testfich=0;// testfich permet de tester si il faut créer le fichier ou non;
        char **nom;
        char  **note;
     
        printf("Combien d'etudiants ? ");
        scanf("%d", &nbretudiant);
        nom = malloc(nbretudiant * sizeof(char**));
        note = malloc(nbretudiant * sizeof(char**));
        for ( i = 0; i < nbretudiant; i++)
        {
            nom[i] = malloc(sizeof(char *) * 100);
            note[i] = malloc(sizeof(char *) * 10);
     
            printf("Nom de l'eleve numero %d ? \n", i + 1);
            scanf("%s", &nom[i][0]);
            transform(&nom[i][0]);
     
            printf("Note de l'eleve numero %d ? \n",i + 1);
            scanf("%s", &note[i][0]);
     
        }
     
        creationFichier(nom, note, nbretudiant);
        for (i=0; i < nbretudiant; i++){
            free(nom[i]);
            free(note[i]);
        }
     
        relecture(nbretudiant);//appel de la fonction lecture
     
        free(nom);
        free(note);
    }
     
    void creationFichier(char **nom, char** note, int nbrEtudiants){
        FILE *f = fopen("Note.txt","a");//on ouvre en mode ajout pour ajouter les noms des personnes
     
        int i = 0;
     
        for (i=0; i < nbrEtudiants; i++){
            fprintf(f, "%s %s\n", nom[i], note[i]);
        }
     
        fclose(f);
    }
     
    //*******************************************************************
    // Troisième partie : Fonction relecture
    // Lire et afficher le contenu du fichier
    //*********************************************************************
    int relecture(int n){
      FILE* f = NULL;
      char tnom[11];//tableau de nom
      char tnote[6];//tableau de note
      f = fopen("Note.txt", "r");  //ouverture du fichier en mode lecture
      float vnote;
      float vn;
      float vmoyenne;
      int k; //détermine si il faut afficher en tête pour note < a 10
      k = 0;
      vnote=0.0;
      vn=0.0;
      vmoyenne=0.0;
       printf("\n\n");//saut de ligne
      while (!feof(f))//tant qu'il n'est pas vide faire
         {
          fscanf(f, "%s\n", tnom);//on récupère le nom
          fscanf(f, "%s\n", tnote);//on récupère la note
          vnote = atof(tnote);//on convertie la valeur de la note
          if (vnote <10){
               //printf("\nNOM ET NOTE < A 10/20 \n\n");
               printf("NOM : %s | NOTE : %s  \n",tnom,tnote);
               k++;//compte le nbr de note < 10 un plus pr te démarquer des autres
           }
            vn = vn + vnote;//on additionne toute les notes
         }
         vmoyenne = vn/n;//on calcul la moyenne
         printf("\n\nIL Y A %d  NOTE < 10/20.\n\n",k);
         printf("\n\nLA MOYENNE DES NOTES EST : %0.02f (arrondie a 2 chiffres apres la virgule) \n\n",vmoyenne);//on arrondi a 2chiffre aprés la virgule
      fclose(f);//fermeture du fichier
         return 0;
    }
     
    //*******************************************************************
    // FONCTION PRINCIPAL DU programme
    //*********************************************************************
    int main(int argc, char *argv[])
    {
    //on Affiche l'en tête
     printf("\n ******************************************\n"
               "* NOMELEVE                            *\n"
               "* CLASSE                                *\n"
               "******************************************\n\n");
        saisie();
        system("PAUSE");
        return 0;
    }

    J'ai changé le fonction saisie et ajouté une fonction creationFichier dedans il y a juste une copie de l'ancien code mais placé dans une fonction.

  7. #27
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    - Il y a une étoile en trop dans chacun de tes sizeof à l'intérieur des malloc
    - Tes scanf()/fscanf() ne contrôlent pas la taille des données lues
    - while (!feof(f)) n'est pas la bonne façon de lire un fichier. feof() ne sert pas à détecter la fin d'un fichier.
    - atof() est à éviter puisqu'il ne permet pas de détecter les erreurs. Il faut plutôt utiliser strtod().
    - system("PAUSE")... Magnifique

  8. #28
    Membre habitué
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Points : 188
    Points
    188
    Par défaut
    Bonsoir,

    juste pour ma conaissance personnelle, que ce passe-t-il avec les * en trop ?

  9. #29
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    J'ai finis mon programme.
    La semaine prochaine je vais l'optimiser avec vos conseils.
    En tout cas, merci à vous deux.

    A bientôt.

Discussions similaires

  1. programme calculant les moyennes depuis un fichier
    Par mooshu dans le forum Général Python
    Réponses: 3
    Dernier message: 25/06/2013, 20h11
  2. Programme calcul de valeur moyenne
    Par PhyRen dans le forum Fortran
    Réponses: 4
    Dernier message: 20/08/2011, 18h40
  3. Programmation Shell avec Red Hat Calcul de moyenne
    Par jcpoulard dans le forum Linux
    Réponses: 3
    Dernier message: 22/02/2006, 22h08
  4. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo