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 :

erreur avec les floats


Sujet :

C

  1. #1
    Halobox
    Invité(e)
    Par défaut erreur avec les floats
    Re-bonjour,

    Je n'en peux plus, je ne comprends pas mon erreur....

    Je sais que tout ce qui concerne le nb d'eleve et le j sont inutile pour l'instant.

    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
     
    #include<stdlib.h>
    #include<stdio.h>
     
    int main(){
        int nbnotes,nbeleves, i=0, j=0; 
        float note=0;
        float temp=0;
     
        scanf("%d",&nbeleves);
        fflush(stdin);
     
        int tab_nbnotes[nbeleves];
        float tab_notes[nbeleves][100];
        float tab_moys[nbeleves];
     
        while (note != -1) {
              scanf("%f",&note);
              fflush(stdin);
              if (note < 0){
                 tab_notes[j][i] = note;
              }
              i++;
        }
     
     
        i=0;
        tab_nbnotes[j]=0;
        for(i=0;i<=100;i++){
     
                            if(tab_notes[j][i] > 0){
                                               tab_nbnotes[j]++;
                            }
        }
     
        for(i=0;i<=100;i++){
                            temp = temp + tab_notes[j][i];
        }
     
        tab_moys[j] = temp/tab_nbnotes[j];
     
        printf("La moyenne de l'eleve %d est %f",j,tab_moys[j]);
        system("PAUSE");
        return 0;
     
     
     
    }
    Si je rentre 1(nb d'eleve), 5, 5, 5, 5 (notes), et -1 par exemple, la moyenne affichée foire totalement ce n'est même pas des chiffres...


    Quelqu'un vois ou j'ai faux ? merci.


    PS : si quelqu'un est motivé et veux m'epliquer sur msn...

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        scanf("%d",&nbeleves); 
     ....
        int tab_nbnotes[nbeleves];
    Ceci est accepté par ton compilateur (C99) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      while (note != -1) { 
              scanf("%f",&note); 
              ....
              if (note < 0){ 
                 tab_notes[j][i] = note; 
              } 
              i++; 
        }
    Tu es un prof sympa, tu ne mets que des notes négatives!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i=0;i<=100;i++){ 
     
                            if(tab_notes[j][i] > 0){ 
                                               tab_nbnotes[j]++; 
                            }
    Des notes >0, du coup,il ne doit pas y avoir foule!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab_moys[j] = temp/tab_nbnotes[j];
    Ca doit ressembler à une division par zéro!

  3. #3
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Et je note une utilisation plus qu'hasardeuse de scanf dans une boucle, un innomable fflush(stdin), et une visible aversion d'Halobox pour les allocations dynamiques (cette façon de déclarer les tableaux... beurk)

  4. #4
    Halobox
    Invité(e)
    Par défaut
    Bah on m'a dit de mettre un fflush(stdin) apres chaque scanf

    et pour diogene :

    Oui ca fonctionne avec mon compilateur, enfaite dans l'idée, c'est quand je met la note -1 ca s'arrette de compter, par contre piur le 3eme truc :

    Des notes >0, du coup,il ne doit pas y avoir foule!
    bah si pourquoi ? des notes >0 c'est 1,2..... ?


    Je ne vois pas ou j'ai faux.

    Pouic : Tu les déclarerais comment mes tableaux ?, je ne te compends pas?

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    bah si pourquoi ? des notes >0 c'est 1,2..... ?
    Oui , même 20. Mais tu ne prends les notes QUE si elles sont négatives. Les autres tu les ignores!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              if (note < 0){ 
                 tab_notes[j][i] = note; 
              }

  6. #6
    Halobox
    Invité(e)
    Par défaut
    Ok j'a réctifié, mais ca ne change rien, j'ai toujours un résultat foireux, avec un # et des caractères bizarres.


  7. #7
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Halobox
    Bah on m'a dit de mettre un fflush(stdin) apres chaque scanf
    Bêtises.... Déjà, fflush(stdin) n'est pas un comportement normalisé. Certains compilo te font croire que ``ca marche'', mais bonjour les surprises...
    Quant à vider stdin suite à un scanf, il y a d'autres méthodes (avec les expressions rationnelles, par exemple, ou tout simplement avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int c;
    while ( (c=getchar()) != '\n' && c!= EOF)
    {
    }
    nettement plus standard...

    Pouic : Tu les déclarerais comment mes tableaux ?, je ne te compends pas?
    J'utiliserais malloc....

  8. #8
    Halobox
    Invité(e)
    Par défaut
    Waoh tu s'ais hje débute, et je dois me débrouiller avec ce que mon prof m'appris...


    Enfin merci qd même...

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: erreur avec les floats
    Citation Envoyé par Halobox
    Je n'en peux plus, je ne comprends pas mon erreur....
    Quelqu'un vois ou j'ai faux ?
    Pas mal d'erreurs. Remarques et correction. Attention, le calcul est faux, et je ne vois pas pas pourquoi...
    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
     
    #include<stdlib.h>
    #include<stdio.h>
     
    int main()
    {
       int nbnotes,nbeleves, i=0, j=0;
       float note=0;
       float temp=0;
     
       /* -ed- pas facile de taper 'en aveugle'... */
       puts("Nombre d'eleves");
       scanf("%d",&nbeleves);
     
       /* -ed-
       fflush(stdin);
     
       n'existe pas en C.
       fflush() n'est défini que pour les flux sortants...
       
       bidouille infame:
       */
       (void) getchar();
     
        /* -ed- Les VLA sont C99.
                Je ne connais pas d'implementation gratuite
                conforme sur ce point.
         */
        int tab_nbnotes[nbeleves];
        float tab_notes[nbeleves][100];
        float tab_moys[nbeleves];
     
        /* -ed-
       while (note != -1)
     
          Un float ne peut pas etre compare a un entier.
          Il faut faire la difference absolue et comparer a FLT_EPSILON
          (<float.h>) ou, ici, tout simplement >=0
     
       */
       puts("Notes (-1 pour terminer)");
     
       while (note >= 0)
       {
          /* -ed- ajout */
          printf("%2d : ", i + 1);
          fflush (stdout);
     
          scanf("%f",&note);
          (void) getchar();
     
    /* -ed-
          if (note < 0)
     
       Tu voulais sans doute dire
    */
          if (note >= 0)
          {
             tab_notes[j][i] = note;
          }
          i++;
       }
     
    /* -ed-
       J'ai pas compris a quoi servait ce bazar...
     
       i=0;
       tab_nbnotes[j]=0;
       
       for(i=0;i<=100;i++)
       {
          if(tab_notes[j][i] > 0)
          {
             tab_nbnotes[j]++;
          }
       }
    */
       tab_nbnotes[j] = i;
     
       /* -ed-
       for(i=0;i<=100;i++)
     
          Debordement du tableau (i<100)
          Le tableau n'etant pas initialise,
          le resultat est indertermine.
          Il faut donc se limiter au nombre de notes.
          */
       nbnotes = tab_nbnotes[j];
       for (i = 0; i < nbnotes; i++)
       {
          temp += tab_notes[j][i];
       }
     
       /* -ed-
       tab_moys[j] = temp/tab_nbnotes[j];
       
       Simplification. Le nombre de notes, c'est nbnotes...
       Il faut donc se proteger de nbnotes==0...
       */
       if (nbnotes != 0)
       {
          tab_moys[j] = temp/nbnotes;
     
          printf ("La moyenne de l'eleve %d est %f (%d notes)\n"
                 , j
                 , tab_moys[j]
                 , nbnotes
                 );
       }
       return 0;
    }

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Halobox
    Bah on m'a dit de mettre un fflush(stdin) apres chaque scanf
    Celui qui t'a dit ça mérite qu'on lui ouvre le ventre, qu'on y mette un rat affamé, et qu'on le recouse...

  11. #11
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Halobox
    Bah on m'a dit de mettre un fflush(stdin) apres chaque scanf
    Celui qui t'a dit ça mérite qu'on lui ouvre le ventre, qu'on y mette un rat affamé, et qu'on le recouse...
    Recoudre qui ? Le rat ?

  12. #12
    Halobox
    Invité(e)
    Par défaut
    Ok merci je vais essayer de dechiffer ton code (aucune critique), sinon pour ta remarque d'aveugle, je sais bien, j'ai simplifier a mort avant de le poster voila pourquoi il n'y a rien.

    A+ et merci

  13. #13
    Halobox
    Invité(e)
    Par défaut
    Enfaite, peux tu m'expliquer cela :

    Il faut faire la difference absolue et comparer a FLT_EPSILON (<float.h>)
    Merci

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Halobox
    Enfaite, peux tu m'expliquer cela :

    Il faut faire la difference absolue et comparer a FLT_EPSILON (<float.h>)
    Merci
    Et si tu lisais les réponse qu'on se troue le c*l à te poster ?

    http://www.developpez.net/forums/vie...287419#2287419


  15. #15
    Halobox
    Invité(e)
    Par défaut
    ok escuse dsl, j'ai plus les alertes mails sur l'autre sujet.

    A+

Discussions similaires

  1. une erreur avec les pointeur..
    Par lecyberax dans le forum C
    Réponses: 12
    Dernier message: 15/04/2006, 12h04
  2. [HTML][Bug] Avec les float/clear, c'est moi ou FF ?
    Par Séb. dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 02/01/2006, 14h56
  3. [XSL] Erreur avec les liens RSS
    Par tania dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 05/12/2005, 16h11
  4. [XHTML] problème avec les float:left
    Par glloq8 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/11/2005, 17h15
  5. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37

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