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 :

Calcul d'une moyenne depuis un fichier


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Calcul d'une moyenne depuis un fichier
    Bonjour,

    J'ai un exo de langage C que je n'arrive pas à résoudre. En fait, supposant un fichier qui se présente comme ceci :


    1        vcxbvcxv     gfdsgfds    gtfrdegfd            12.50   13.00   17.25
    2       ddrtyghyu    ertyu        qrtyuvfgh            09.00   11.75   10.00
    3       GERTYUI ERTYUKG ZERTYUY                    14.50   15.75    14.00   

    je veux faire un programme qui parcourt ce fichier calcul la moyenne de chaque eleve dans un autre fichier resultat.txt qui se presente comme ceci

    N°      NOM ET PRENOMS                        NOTES           MOY                
    1        vcxbvcxv   gfdsgfds gtfrdeg  12.50 13.00   17.25  14.25
    2       ddrtyghyu    ertyu   qrtyuvf    09.00 11.75  10.00   10.25
    3       GERTYUI ERTYUKG ZEED         14.50  15.75  14.00 14.75
    J'ai essayé ce code qui, pour moi, devait marcher mais ça ne se passe comme je veux. Alors si quelqu'un peut m'aider, voici mon code :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    int main()
    {
        FILE *fichier=NULL;
        FILE *fichier1=NULL;
        char c,nomfichier[80];
        //float tableau[30];
        int s,j=0,i=0;
        double somme=0;
        char i_tableau[20];
        printf("entrer le nom du fichier avec l'extension .txt\n");
        scanf("%s",nomfichier);
        if(strcmp(nomfichier,"")!=0)
        fichier=fopen(nomfichier,"r");
         fichier1=fopen("resultat.txt","w+");
        if(((fichier==NULL)&&(fichier1==NULL))||(fichier==NULL)||(fichier1==NULL)){
        fprintf(stderr,"%s ne peut pas s'ouvir il se peut qu'il n'existe pas\n",nomfichier);
        exit(-1);}
        else
      // s=fscanf(fichier,"%s",&c);
        while( (c=fgetc(fichier))!=EOF)
        {
          fputc(c,fichier1);
        }
        fclose(fichier);
        fclose(fichier1);
         fichier1=fopen("resultat.txt","ab");
         if(fichier1==NULL)
         {
           printf("impossible d'ouvir resultat.txt");
           exit(-1);
         }
         else
         c=fgetc(fichier1);
         while( c!=EOF)
          printf("\t yes");
     
         {
           printf("bonsoir\n");
           if((s=fscanf(fichier1,"%s",&c))!='\0')    /*tanqu'on n'est pas a la fin de la ligne*/
           {
              printf("yes\n");
             if(isdigit(s)==1)                     /*si le caractere lu est un nombre decimal*/
             {
               printf("salut\n");
               while(isspace(s)!=1)              /*tanqu'on a pas trouvé un espace blanc*/
               {
                 printf("bonjour\n");
                 i_tableau[j]=s;
                 atof(&i_tableau[j]);
                 somme+=i_tableau[j];
                 j++;
                 i++;
               }
               for(j=0;j<=i;j++)
               {
                 printf("%.2d",i_tableau[j]);
               }
             }
           }
           c=fgetc(fichier1);
         }
      getchar();
        return 0;
    }

  2. #2
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Juste une remarque avant d'aller plus loin. le problème principal est de savoir (ou de décider arbitrairement) comment les infos sont codées dans chaque ligne. Dans l'exemple que tu donnes, je suppose qu'un espace ou une suite d'espaces signifie "fin de la donnée". Tu parles aussi de prénoms, comme si une personne en avait plusieurs... Si une personne n'en a qu'un, comment savoir si deux espaces consécutifs signifie "fin de donnée" ou "fin de donnée + donnée vide + fin de donnée"? Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1   Dupond    Marcel      12.0  13.0  14.0
    2   Dupont    Jean Louis  13.0  14.0  15.0
    Est-ce que les espace entre "Marcel" et "12.0" signifient "fin de donnée" ou "fin de donnée + donnée vide + fin de donnée"?

    L'espace est un mauvais séparateur, certes excellent pour séparer des mots dans une phrase mais pas pour séparer des données, car si une donnée est une phrase dont tu ne connais pas le nombre de mots... C'est pour ça qu'on utilise un séparateur que l'on ne trouve pas dans les données, généralement le point-virgule, la tabulation aussi parfois. Il faut éviter le point qui est présent dans toute représentation texte d'un flottant.

    A+

    Pfeuh

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Salut

    Est-ce que tu peux nous dire ce qui ne fonctionne pas comme tu le souhaites?

    Et aussi, à la ligne 30 tu ouvres ton fichier 'fichier1', qui si je l'ai bien compris stockera les résultats, mais tu l'ouvres avec l'option ab soit en ajout binaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier1=fopen("resultat.txt","ab");
    Ce qui n'est pas utile vu que tu souhaites seulement écrire du texte

    Mais comme l'a pfeuh juste avant, il n'est pas facile de manipuler ton format de fichier

    Salut,

    Neyort

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Il faut un début de parser qui puisse déterminer si la prochaine entrée est du texte ou des nombres.

    Ainsi ça donne :
    1. sauter espaces
    2. copier nom
    3. sauter espaces
    4. copier 1er prénom
    5. sauter espaces
    6. Texte ou Nombre ?
      - Texte : copier 2e prénom (boucle sur 5)
      - Nombre : voir 7
    7. Note 1
    8. sauter espaces
    9. Note 2
    10. Fin ?
      - Pas Fin : copier Note 3 (boucle sur 8)
      - Fin : Note2 est la moyenne -> fin du programme


    Et voilà...

    EDIT : whoops.... j'ai cru que la moyenne était déjà calculée... bon bah tu parses chaque note, puis tu fais la moyenne pour l'écrire !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

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. Insérer des données dans une BD depuis un fichier .bat
    Par kurkaine dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/11/2006, 08h31
  3. [Image] charger une image depuis un fichier xml.
    Par Invité dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 21/11/2006, 14h59
  4. [VB.Net] Comment lire une url depuis un fichier .ini ?
    Par lewebdalex dans le forum VB.NET
    Réponses: 7
    Dernier message: 06/05/2006, 20h32
  5. [Applet][JAR]Charger une applet depuis un fichier jar
    Par CappCorp dans le forum Applets
    Réponses: 8
    Dernier message: 23/11/2004, 13h08

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