Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Probleme calcul

Pourtant ca devrait marcher ...

    1 mars 2006 à 18:10:53

    Je suis en train de faire un programme qui fait office de "classeur" scolaires, ou l'on met les notes que l'on a eu dans chaque matière. Au début il y a l'option entre Charger une sauvegarde et Faire un nouveau classeur, eh bien il faut que vous mettez 1 = Charger une sauvegarde.
    Bon voilà je vous pose le code et après j'explique mon problème ;)

    Calculateur de moyenne.c
    /*
    Auteur : -MeteZ- (sanco95@hotmail.com)
    Description: Pour calculer vos moyennes dans tous les sens

    Dans la version 1.1 (celle ci), il est possible de charger et d'enregistrer ses données
    */


    #include <stdio.h>
    #include <stdlib.h>
    #include "Calculateur de moyenne.h"

    int main(int argc, char *argv[])
    {
      int nombreMatieres, choixCharger;
     
      printf("\tCalculateur de moyenne scolaire 1.1\n(Le prog. n'accepte que les nombres entiers)");
        /* On stock le nombre de moyennes qu'à l'utilisateur */
     
      printf("\n1. Charger une sauvegarde");
      printf("\n2. Faire un nouveau classeur");
      printf("\nTapez votre choix : ");
      scanf("%d",&choixCharger);
     

         FILE* fichierCharger = NULL;
         fichierCharger = fopen("sauvegarder.txt", "r");
         if(choixCharger == 1) {
         printf("-----Chargement-----");
         }
         if (fichierCharger == NULL){
              printf("Le fichier sauvegarder.txt est inexistant !");
              }
             
              int boucle, boucle2;
              fscanf(fichierCharger, "%d", &nombreMatieres);
              if(choixCharger == 1) {
              printf("\n%d Matieres au total\n",nombreMatieres)
              }
              Moyenne moyennes[nombreMatieres];
              Notes notes[nombreMatieres];       
              char nomMatieres[MAX_TABLEAU] = "";
              int nombreNotesMatiere = 0;
             
              if(choixCharger == 1) {
              for(boucle=0; boucle<nombreMatieres; boucle++) {
                fscanf(fichierCharger, "\n%s %d", moyennes[boucle].nom,
                                                                   &moyennes[boucle].nombreNotes);
                printf("%s a %d notes\n", moyennes[boucle].nom, moyennes[boucle].nombreNotes);
                long notes_ = 0;
                int coefficient_ = 0;
                for(boucle2=0; boucle2<moyennes[boucle].nombreNotes; boucle2++) {
                  fscanf(fichierCharger, " %ld %d", &notes[boucle].notes[boucle2],
                                                            &notes[boucle].coefficient[boucle2]);
                  printf("Notes : %ld coef.%d\n", notes[boucle].notes[boucle2], notes[boucle].coefficient[boucle2]);
                }
              }
              }
         if(choixCharger == 1) {
         printf("-----Fin de chargement----");
         }
     
      if(choixCharger == 2) {
      printf("\nCombien avez vous de matiere au total : ");
      scanf("%d",&nombreMatieres);
     
      int boucle, boucleNotes;
     
        for(boucle=0; boucle<nombreMatieres; boucle++) {
          /* Pour chaque matières, on demande un nom */
          printf("\nNom de la matiere %ld : ",(boucle+1));
          scanf("%s",moyennes[boucle].nom);
          /* Au nom de la matière est associé un nombre de notes */
          printf("Combien avez-vous eu de notes en %s : ", moyennes[boucle].nom);
          scanf("%d",&moyennes[boucle].nombreNotes);
           
            /* On connaît le nombre de notes dans la matière, on peut demander leurs notation et
                                                                                   coefficient */

            for(boucleNotes=0; boucleNotes<moyennes[boucle].nombreNotes; boucleNotes++) {
              printf("En %s, votre note %ld est de (sur 20): ",moyennes[boucle].nom,
                                                                                 (boucleNotes+1));
              scanf("%ld",&notes[boucle].notes[boucleNotes]);
              printf("Quel est son coefficient : ");
              scanf("%d",&notes[boucle].coefficient[boucleNotes]);
            }
        }
        }
        printf("\nVoila, toutes vos notes ont ete charge !");
       
        /* Si quitterMenu != 0, alors la boucle est terminé, l'utilisateur quitte */
    int quitterMenu = 0;
    while(!quitterMenu) {
    int choixMenu = 0;
       
        /* Menu : l'utilisateur choisi sa fonction */
        printf("\n\n1. Voir toutes mes notes dans une matiere");
        printf("\n2. Calculer une moyenne dans une matiere");
        printf("\n3. Calculer la moyenne generale");
        printf("\n4. Voir toutes mes notes");
        printf("\n5. Sauvegarder mes notes");
        printf("\n6. Quitter le programme");
        printf("\nTapez votre choix : ");
       
        scanf("%d",&choixMenu);
       
            if(choixMenu == 1) {
                     voirNotesMatiere(&moyennes, &notes, nombreMatieres);
                     }
                     
            if(choixMenu == 2) {
                     char matiereVoulu[MAX_TABLEAU];
                     printf("Tapez le nom de la matiere dont vous voulez avoir la moyenne : ");
                     scanf("%s",&matiereVoulu);
                     printf("Vous avez %lf",calculerMoyenne(&moyennes, &notes, matiereVoulu));
                     }
                     
            if(choixMenu == 3) {
                     int boucle;
                     double moyenneGeneral = 0;
                     
                       for(boucle=0; boucle<nombreMatieres; boucle++) {
                       printf("\n%lf, %s",(calculerMoyenne(&moyennes, &notes, moyennes[boucle].nom)), moyennes[boucle].nom);       
                       }
                       
                     moyenneGeneral /= nombreMatieres;
                     printf("\nVotre moyenne general est de %lf",moyenneGeneral);
                     }
                     
            if(choixMenu == 4) {
                     voirNotes(&moyennes, &notes, nombreMatieres);
                     }
                     
            if(choixMenu == 5) {
                     FILE* fichierSauv = NULL;
                     fichierSauv = fopen("sauvegarder.txt", "w+");
                       if (fichierSauv != NULL)
                       {
                         fprintf(fichierSauv, "%d",nombreMatieres);
                         int boucle, boucle2;
                           for(boucle=0; boucle<nombreMatieres; boucle++) {
                           fprintf(fichierSauv, "\n%s %d",moyennes[boucle].nom
                                                         ,moyennes[boucle].nombreNotes);
                           
                             for(boucle2=0; boucle2<moyennes[boucle].nombreNotes; boucle2++) {
                               fprintf(fichierSauv, " %ld %d",notes[boucle].notes[boucle2],
                                                            notes[boucle].coefficient[boucle2])
                             }
                           }
                         printf("\nMoyenne sauvegarder !");
                         fclose(fichierSauv);
                       }
                       else{
                         printf("Le fichier sauvegarder.txt est introuvable");     
                       }
                     }
                     
            if(choixMenu == 6) {
                     quitterMenu = 1;
                     }
                     
    }

      return 0;
    }


    Calculateur de moyenne.h
    #ifndef DEF_CAL_D_M_H
    #define DEF_CAL_D_M_H

    #define MAX_TABLEAU 10000

    typedef struct Moyenne Moyenne;
    struct Moyenne{
           char nom[MAX_TABLEAU];
           int nombreNotes;
    };

    typedef struct Notes Notes;
    struct Notes{
           long notes[MAX_TABLEAU];
           int coefficient[MAX_TABLEAU];
    };

    void voirNotesMatiere(Moyenne moyennes[], Notes notes[], int nombreMatieres);
    double calculerMoyenne(Moyenne moyennes[], Notes notes[], char const matiereVoulu[]);
    void voirNotes(Moyenne moyennes[], Notes notes[], int nombreMatieres);

    void voirNotesMatiere(Moyenne moyennes[], Notes notes[], int nombreMatieres)
    {
         char matiereVoulu[MAX_TABLEAU];
         printf("Tapez le nom de la matiere dont vous voulez voir les notes : ");
         scanf("%s",&matiereVoulu);
         int boucle, boucle2;
           for(boucle=0; boucle<nombreMatieres; boucle++) {
             if((strcmp(moyennes[boucle].nom, matiereVoulu)) == 0) {
             for(boucle2=0; boucle2<moyennes[boucle].nombreNotes; boucle2++) {
                printf("\nVous avez eu un %ld coef.%d en %s",notes[boucle].notes[boucle2],
                                                               notes[boucle].coefficient[boucle2],
                                                                moyennes[boucle].nom);
             }
             }
           }
    }

    void voirNotes(Moyenne moyennes[], Notes notes[], int nombreMatieres)
    {
         int boucle, boucle2;
           for(boucle=0; boucle<nombreMatieres; boucle++) {
             for(boucle2=0; boucle2<moyennes[boucle].nombreNotes; boucle2++) {
                printf("\nVous avez eu un %ld coef.%d en %s",notes[boucle].notes[boucle2],
                                                               notes[boucle].coefficient[boucle2],
                                                                moyennes[boucle].nom);
             }
           }
    }

    double calculerMoyenne(Moyenne moyennes[], Notes notes[], char const matiereVoulu[])
    {
           /* Calculer une moyenne choisi par l'utilisateur, pas besoin d'identé le code, non ? */
           double moyenneProvisoire = 0;
           double coefficientProvisoire = 0;
           int boucle, boucle2;
             for(boucle=0; boucle<moyennes[boucle].nombreNotes; boucle++) {
               if((strcmp(moyennes[boucle].nom, matiereVoulu)) == 0) {
                 for(boucle2=0; boucle2<moyennes[boucle].nombreNotes; boucle2++) {
                   moyenneProvisoire += (notes[boucle].notes[boucle2]
                                                         * notes[boucle].coefficient[boucle2]);
                   coefficientProvisoire += notes[boucle].coefficient[boucle2];
                 }
               }
             }
             moyenneProvisoire /= coefficientProvisoire;
             double moyenne = moyenneProvisoire;
             return moyenne;
    }

    #endif


    sauvegarder.txt
    6
    PhysiqueChimie 2 19 1 18 2
    Francais 1 08 2
    SVT 2 10 1 15 1
    Histoire 2 10 2 15 1
    MPI 2 18 2 16 1
    Mathematique 3 20 1 15 2 17 1

    Par exemple.

    Compilez, lancez, Charger une sauvegarde. Là tout se passe bien.
    Mais il y a un problème pour certains moyennes lorsqu'on veut calculer la moyenne générale (des valeurs comme #IN00).
    Lorsqu'on change de place les lignes dans le fichier sauvegarder.txt, on voie qu'à l'execution du programme ce ne sont plus les mêmes calculs qui ont des problèmes mais d'autres :s

    Voilà j'espère que certains pourront m'aider :(
    • Partager sur Facebook
    • Partager sur Twitter
      2 mars 2006 à 17:32:22

      Personne ? :(

      Apparement c'est un problème d'allocation dynamique mais j'y arrive pas avec les structures, tableaux de structures, tableaux de valeurs de structures ...
      • Partager sur Facebook
      • Partager sur Twitter

      [C] Probleme calcul

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown