Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec moyenneTableau

    3 décembre 2006 à 20:19:48

    Bonsoir à toutes et à tous,

    Je me suis mis au C/C++, enfin, au C pour le moment et je suis rendu aux exercices sur les tableaux. Je cogite depuis 3 ou 4 jours sur moyenneTableau et je n'arrive pas à comprendre mon erreur. Pire encore, je n'arrive pas à voir d'où vient le résultat affiché. Voici mon code:


    int main(int argc, char *argv[])
    {
        long tableau[4]={1,2,3,4};
        long somme = 0;
        double moyenne=0;
        affiche(tableau, 4);
        somme = sommeTableau(tableau, 4);
        printf("Le total vaut : %ld\n", somme);
        moyenne = moyenneTableau(tableau, 4, 4);
        printf("La moyenne vaut : %lf\n", moyenne);
    }
    long sommeTableau(long tableau[], long tailleTableau)
    {
        long i = 0, nombre = 0;
        for(i = 0 ; i < tailleTableau ; i++)
        {
            nombre+=tableau[i];
        }
        return nombre;
    }

    double moyenneTableau(long tableau[], long taille, double tailleTableau)
    {
        double moyenne;
        long somme;
        somme = sommeTableau(tableau, taille);
        moyenne = somme / tailleTableau;
        return moyenne;
    }

    La fonction sommeTableau fonctionne sans soucis mais la fonction moyenneTableau me renvoie:

    Citation

    La moyenne vaut : 10.000000


    Pourriez-vous m'éclairer sur ce qui cloche dans ce code somme toute très simple?
    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      3 décembre 2006 à 20:53:34

      Chez moi,ça marche sous Code::Blocks (en enlevant affichage,et en rajoutant les prototypes des fonctions et en mettant un return 0 à la fin).
      Pourquoi transmettre 2 tailles du tableau alors que c'est la même?
      • Partager sur Facebook
      • Partager sur Twitter
        3 décembre 2006 à 22:20:44

        Merci de cette réponse. Je précise que j'ai bien les prototypes des fonctions dans un fichier header et que la fonction affichage est bien présente dans mon fichier fonction. J'ai également un return 0 à la fin de la fonction mail et je suis également sous code::blocks.
        Si je transmets de taille de tableau, c'est de façon à avoir un résultat décimal pour ma valeur "moyenne". Soit une taille en long pour la fonction sommTableau et une taille en double pour la division. A noter qu'en utilisant qu'une seule taille de type long, j'obtiens comme résultat 0.000000.
        Je n'y comprend vraiment rien! :(
        • Partager sur Facebook
        • Partager sur Twitter
          4 décembre 2006 à 3:27:41

          Bonsoir , alors tu as deux solutions :) et toutes les deux n'ont aucunement besoin de definir deux tailles de tableaux !

          La premiere : Tu mets tout en double . Ta somme sera toujours entiere puisque ton tableau reste de type long lui , comme ton i :D

          #include <stdio.h>
          #include <iostream.h>

          double moyenneTableau(long tableau[], double tailleTableau);
          double sommeTableau(long tableau[], double tailleTableau);

          int main(int argc, char *argv[])
          {
              long tableau[4]={1,2,3,4};
              double somme = 0;
              double moyenne=0;
             
              somme = sommeTableau(tableau, 4);
              printf("Le total vaut : %ld\n", somme);
              moyenne = moyenneTableau(tableau, 4);
              printf("La moyenne vaut : %lf\n", moyenne);
             
              system("pause");
          }
          double sommeTableau(long tableau[], double tailleTableau)
          {
              long i = 0, nombre = 0;
              for(i = 0 ; i < tailleTableau ; i++)
              {
                  nombre+=tableau[i];
              }
              return nombre;
          }

          double moyenneTableau(long tableau[], double tailleTableau)
          {
              double moyenne;
              double somme;
              somme = sommeTableau(tableau, tailleTableau);
              moyenne = somme / tailleTableau;
              return moyenne;
          }



          La seconde : Plutot que de refaire le calcul de la somme dans la fonction moyenne , tu envois somme en parametre !

          #include <stdio.h>
          #include <iostream.h>

          long sommeTableau(long tableau[], long tailleTableau);
          double moyenneTableau(long somme, double taille);

          int main(int argc, char *argv[])
          {
              long tableau[4]={1,2,3,4};
              long somme = 0;
              double moyenne=0;
             
              somme = sommeTableau(tableau, 4);
              printf("Le total vaut : %ld\n", somme);
              moyenne = moyenneTableau(sommeTableau(tableau, 4), 4);
              printf("La moyenne vaut : %lf\n", moyenne);
              system("pause");
          }
          long sommeTableau(long tableau[], long tailleTableau)
          {
              long i = 0, nombre = 0;
              for(i = 0 ; i < tailleTableau ; i++)
              {
                  nombre+=tableau[i];
              }
              return nombre;
          }

          double moyenneTableau(long somme, double taille)
          {
              double moyenne;
              moyenne = somme / taille;
              return moyenne;
          }


          J'espere que tu comprends les deux :)

          • Partager sur Facebook
          • Partager sur Twitter
            4 décembre 2006 à 3:54:22

            Si il suit le cours alors normalement il devrait utiliser le prototype de la fonction donné par M@teo21.
            On a pas besoin de mettre en double car il me semble que lorsqu'il y a une division d'un long par un double alors le compilateur fait une conversion automatique.

            Kurapix
            • Partager sur Facebook
            • Partager sur Twitter
              4 décembre 2006 à 10:41:16

              J'ai bien entendu commencé par utilier le prototype du cours, si j'en suis arrivé à la fonction indiquée dans mon premier post, c'est parce que j'ai cherché par moi-même avant de venir demander des explications ici ;)

              Avec le prototype de M@teo21, j'obtenais comme résultat 2.00000; Logique, puisque j'utilisais deux long (le résultat de sommeTableau et tailleTableau). Je me suis alors demandé s'il était possible d'obtenir une variable double en utilisant une fonction qui renvoie un type long:

              long sommeTableau(....
              double somme=0;
              somme = sommeTableau(...

              Quelques printf au milieu m'ont vite indiqué que cela ne fonctionnait pas. J'ai alors décidé de modifier le prototype en mettant tailleTableau en double -> de nouveau des résultats farfelus que j'ai attribué au fait que je mettais en paramètre un double dans la fonction sommeTableau là où cette fonction attends un long. D'où l'apparition de ces deux variables identiques à l'exception près que l'une d'elle est de type long et l'autre de type double.

              Merci Ahmedzup pour ces fonctions, je les comprends sans soucis mais ma question est plutôt de comprendre pourquoi les miennes ne fonctionnent et surtout, pourquoi est-ce qu'elle fonctionne chez d'autres?
              • Partager sur Facebook
              • Partager sur Twitter
                4 décembre 2006 à 10:48:48

                Citation : Yoda54

                Voici mon code:


                Merci de poster du code qui compile...

                Compiling: main.c
                main.c: In function `main':
                main.c:6: warning: implicit declaration of function `affiche'
                main.c:7: warning: implicit declaration of function `sommeTableau'
                main.c:8: warning: implicit declaration of function `printf'
                main.c:9: warning: implicit declaration of function `moyenneTableau'
                main.c: At top level:
                main.c:13: error: conflicting types for 'sommeTableau'
                main.c:7: error: previous implicit declaration of 'sommeTableau' was here
                main.c:23: error: conflicting types for 'moyenneTableau'
                main.c:9: error: previous implicit declaration of 'moyenneTableau' was here
                main.c:29:2: warning: no newline at end of file
                main.c:1: warning: unused parameter 'argc'
                main.c:1: warning: unused parameter 'argv'
                Process terminated with status 1 (0 minutes, 2 seconds)
                4 errors, 7 warnings

                Si ton compilateur laisse passer ça, c'est qu'il est mal configuré :

                http://mapage.noos.fr/emdel/codage.htm#cfg_compilo

                Ton code commenté, complété et corrigé.

                /* -ed- ajoute */
                #include <stdio.h>

                /* -ed- ajoute */
                void affiche (long const tableau[], long tailleTableau)
                {
                   long i;
                   for (i = 0; i < tailleTableau; i++)
                   {
                      printf ("%ld ", tableau[i]);
                   }
                   printf ("\n");
                }

                /* -ed- deplace */
                long sommeTableau (long tableau[], long tailleTableau)
                {
                   long i = 0, nombre = 0;
                   for (i = 0; i < tailleTableau; i++)
                   {
                      nombre += tableau[i];
                   }
                   return nombre;
                }

                /* -ed- supprimme parametre inutile */
                double moyenneTableau (long tableau[],
                                       long taille /* , double tailleTableau */ )
                {
                   double moyenne;
                   long somme;
                   somme = sommeTableau (tableau, taille);
                   /* -ed- au moins un des operandes doit etre de type double,
                      sinon, le forcer avec un 'typecast' */

                   moyenne = somme / (double) taille /* Tableau */ ;
                   return moyenne;
                }

                int main (void)
                {
                   long tableau[4] = { 1, 2, 3, 4 };
                   long somme = 0;
                   double moyenne = 0;
                   affiche (tableau, 4);
                   somme = sommeTableau (tableau, 4);
                   printf ("Le total vaut : %ld\n", somme);
                   moyenne = moyenneTableau (tableau, 4 /*, 4 */ );
                   printf ("La moyenne vaut : %lf\n", moyenne);
                   return 0;
                }


                1 2 3 4
                Le total vaut : 10
                La moyenne vaut : 2.500000

                Press ENTER to continue.

                Pose des questions si tu ne comprends pas.
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  4 décembre 2006 à 10:52:29

                  Désolé, personnellement, je pense que cerner le code qui ne fonctionne pas est plus lisible que de balancer plusieurs dizaines de lignes dont la majeure partie ne concerne pas le problème exposé. Simple différence de point de vue.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 décembre 2006 à 11:01:58

                    Citation : Yoda54

                    Désolé, personnellement, je pense que cerner le code qui ne fonctionne pas est plus lisible que de balancer plusieurs dizaines de lignes dont la majeure partie ne concerne pas le problème exposé. Simple différence de point de vue.


                    Etant donné que le code n'est pas compilable, on ne peut rien dire de plus. On ne peut rien cerner du tout.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      4 décembre 2006 à 11:27:19

                      Si le code ne fonctionne pas,essaye un rebuild car chez moi,ça marche.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 décembre 2006 à 12:13:19

                        Citation : -ed-


                        Pose des questions si tu ne comprends pas.



                        Pourquoi est-ce que ce code ne fonctionne pas chez moi? C'est la question que j'ai déjà posé un peu plus haut vu que la première réponse à mon problème a été que mes fonctions marchaient.
                        J'ai tenté et re-tenté un rebuild, mais rien n'y fait.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 décembre 2006 à 16:08:09

                          Citation : Yoda54

                          Pourquoi est-ce que ce code ne fonctionne pas chez moi?

                          Quel code ? Celui que tu as posté ne compile pas. Je ne vois pas comment on pourrait savoir si il fonctionne.

                          Commence par poster un code qui compile, après on verra pourquoi il ne fonctionne pas.

                          Ou alors précise ce que tu veux dire par 'ne fonctionne pas', parce que c'est difficile de faire plus vague (mais en principe, ça concerne l'exécution et on la génération).

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                            4 décembre 2006 à 17:49:33

                            Pour la quatrième fois dans ce sujet, je sais bien que le morceau de code que j'ai posté au début ne compile pas! Mais je ne développerais pas plus mon explication puisqu'elle n'est vraisemblablement pas lu. A tout hasard, je m'auto-cite:

                            Citation : Yoda54

                            Désolé, personnellement, je pense que cerner le code qui ne fonctionne pas est plus lisible que de balancer plusieurs dizaines de lignes dont la majeure partie ne concerne pas le problème exposé. Simple différence de point de vue.



                            Je parle du code que tu m'as donné, il m'affiche 2.000000 pour la moyenne. Je repose donc à nouveau la question à laquelle je cherche une réponse: Pourquoi un code qui fonctionne chez quelqu'un d'autre ne fonctionne pas chez moi?
                            Accessoirement, je ne pense pas que ma fonction moyenneTableau donne un résultat différent de la tienne, elle est simplement moins optimisée ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 décembre 2006 à 17:57:12

                              Essaye de supprime le fichier .exe et si ça marche pas le main.c.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 décembre 2006 à 19:15:34

                                Pas de changement, la moyenne vaut toujours 2.000000
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 décembre 2006 à 20:41:13

                                  Tu as 2,10 ou 2.5?
                                  Si c'est 2,il faut que tu passes 4 comme argument à ta moyenne.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 décembre 2006 à 21:39:22

                                    Citation : Yoda54

                                    Je parle du code que tu m'as donné, il m'affiche 2.000000 pour la moyenne.


                                    o_Oo_Oo_O Celui qui affiche 2.500000 chez moi ?

                                    Ce n'est pas possible. Tu dois te tromper de projet ou de répertoire ou de fichier (erreur fréquente). Ou alors ton environnement de développement est gravement endommagé et mérite une réinstallation (beaucoup plus rare).

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !
                                      4 décembre 2006 à 23:09:28

                                      @ Pole, j'ai déjà 4 comme argument, c'est bien là qu'est le problème.

                                      @ -ed-, le projet est le bon. J'ai commencé par vérifier de ce côté-là puisqu'il m'arrive fréquemment de m'arracher les cheveux avec php lorsque je corrige le code dans un fichier et que je teste avec un autre. En l'occurence, je n'ai qu'un seul projet (d'ailleurs, quand je le modifie en ajoutant des printf pour voir l'évolution de mes variables, ces modifications sont bien prises en compte), difficile de se tromper donc. De plus, j'utilise la commande "Build & Run" de code::blocks qui compile le projet en cours, il n'y a donc pas d'erreur à ce niveau-là. C'est bien pour cela que je demande depuis la première réponse de Ple pourquoi ce qui marche chez les autres ne fonctionne pas chez moi. Je vais désinstaller et réinstaller l'IDE pour voir le résultat. Merci.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 décembre 2006 à 23:18:57

                                        Citation : Yoda54

                                        je n'ai qu'un seul projet (d'ailleurs, quand je le modifie en ajoutant des printf pour voir l'évolution de mes variables, ces modifications sont bien prises en compte)


                                        Je vois que tu as bricolé le code. Peux-tu, juste par acquit de conscience, et avant de réinstaller le bouzin, faire un copié-collé du fichier.c qui affiche 2.00000 au lieu de 2.50000.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Music only !
                                          5 décembre 2006 à 17:59:24

                                          Je n'ai bricolé le code qu'après avoir testé celui que tu as mis dans ce sujet. Et dès le départ, j'avais 2.000000 au lieu de 2.500000.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            5 décembre 2006 à 19:55:53

                                            Citation : Yoda54

                                            De plus, j'utilise la commande "Build & Run" de code::blocks qui compile le projet en cours, il n'y a donc pas d'erreur à ce niveau-là.


                                            Essaye rebuild.
                                            Si ça ne marche pas, poste ton code.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              5 décembre 2006 à 22:43:30

                                              Comme je le disais plus haut, j'ai tenté un rebuild mais cela ne change rien. Mon code, c'est un copier-coller de celui posté par -ed- dans ce sujet.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                5 décembre 2006 à 22:45:55

                                                Citation : Yoda54

                                                Comme je le disais plus haut, j'ai tenté un rebuild mais cela ne change rien. Mon code, c'est un copier-coller de celui posté par -ed- dans ce sujet.


                                                Tu peux faire un ctrl-f11 et poster un copié collé du build log ?
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Music only !

                                                Problème avec moyenneTableau

                                                × 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