Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème exercices sur les tableaux

    21 juillet 2006 à 15:48:10

    Bonjour à tous :)

    Voilà j'ai un problème dans l'exercice 2 du chapitre sur les tableaux.

    L'énoncé :

    Citation : M@teo21

    Exercice 2 : créer une fonction moyenneTableau qui calcule et renvoie la moyenne des valeurs.




    Je vous met mon code source :


    #include <stdio.h>
    #include <stdlib.h>

    double moyenneTableau(long tableau[], long tailleTableau);
    void affiche (long tableau [], long tailleTableau);

    int main(int argc, char *argv[])
    {
        long tableau [4] = {23, 34, 75, 89};
       
        affiche (tableau, 4);
        moyenneTableau (tableau, 4);
       
       
        printf ("La moyenne du tableau est %ld\n", moyenneTableau);
       
        system ("PAUSE");
        return 0;
       
       
       
    }   


    double moyenneTableau(long tableau[], long tailleTableau)

    {
        double moyenneTableau = (*tableau+*(tableau+1)+*(tableau+2)+*(tableau+3))/tailleTableau;
       
        return moyenneTableau;
       
    }   


    void affiche (long tableau [], long tailleTableau)

    {
        int i;
       
        for (i=0; i<4; i++)
       
        {
            printf ("Valeur %ld : %ld\n",i, tableau [i]);
           
        }
       
    }       


    Et ca me donne ça :
    Image utilisateur


    Je vous explique ma logique (illogique donc puisque ça marche pas o_O ) : j'additionne les 4 valeurs du tableau que je divise par la taille du tableau (4) pour avoir la moyenne que je place dans moyenneTableau.

    Ma question : pourquoi ça marche pas ? :-° Et comment faire pour que ça marche ?

    Merci d'avance pour votre aide :)
    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2006 à 15:54:37

      Citation : carrieres


      double moyenneTableau = (*tableau+*(tableau+1)+*(tableau+2)+*(tableau+3))/tailleTableau;



      *tableau pointe bien sur la première case du tableau, mais pas *(tableau+1)...
      pourquoi pas simplement tableau[1]??

      En plus la ta moyenne ne fonctionne que pour 4 cases, fait une boucle ;)
      • Partager sur Facebook
      • Partager sur Twitter
        21 juillet 2006 à 16:02:47

        Tu veux dire comme ça ?

        double moyenneTableau = (*tableau+tableau[1]+tableau[2]+tableau[3])/4;



        Ca me donne le même résultat ...
        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2006 à 16:15:29

          for(i=0; i<tailleTableau; i++)
          {
          somme += tableau[i];
          }
          moyenne = somme/tailleTableau;

          Ca devrait marcher non?

          EDIT: euh ton code marche pas parce que tu affiches pas le résultat... mais l'adresse de la fonction! (enfin je crois)
          Il te faut une variable résultat = moyenneTableau(tableau, longueur) dans ton main!
          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2006 à 17:05:21

            #include <stdio.h>
            #include <stdlib.h>

            double moyenneTableau(long tableau[], long tailleTableau);
            void affiche (long tableau [], long tailleTableau);

            int main(int argc, char *argv[])
            {
                long tableau [4] = {23, 34, 75, 89};
                double moyenne;
               
                affiche (tableau, 4);
               
                moyenne = moyenneTableau(tableau, 4);
               
                printf ("La moyenne du tableau est %ld\n", moyenne);
               
                system ("PAUSE");
                return 0;
               
               
            }   


            double moyenneTableau(long tableau[], long tailleTableau)

            {
                int i;
                double somme, moyenne;
               
                for(i=0; i<tailleTableau; i++)
                {
                      somme += tableau[i];
                }
                 
            moyenne = somme/tailleTableau;

            return moyenne;

               
            }   


            void affiche (long tableau [], long tailleTableau)

            {
                int i;
               
                for (i=0; i<4; i++)
               
                {
                    printf ("Valeur %ld : %ld\n",i, tableau [i]);
                   
                }
               
            }       


            Le programme me met que la moyenne = 0 :o
            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2006 à 17:23:30

              printf ("La moyenne du tableau est %ld\n", moyenne);

              o_O
              Rappel : un %ld va avec un long int, tandis qu'un %lf va avec un long float (double) :
              printf ("La moyenne du tableau est %lf\n", moyenne);
              • Partager sur Facebook
              • Partager sur Twitter
                21 juillet 2006 à 17:45:13

                Si je remplace le %ld par %lf, j'obtiens "-1.#QNANO" comme résultat o_O
                • Partager sur Facebook
                • Partager sur Twitter
                  22 juillet 2006 à 10:41:34

                  Ne faut-il pas également caster chaque valeur du tableau en tant que flottant pour le calcul de la moyenne ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 juillet 2006 à 11:12:36

                    Citation : carrieres

                    #include <stdio.h>
                    #include <stdlib.h>

                    double moyenneTableau(long tableau[], long tailleTableau)

                    {
                        int i;
                        double somme, moyenne;
                       
                        for(i=0; i<tailleTableau; i++)
                        {
                              somme += tableau[i];
                        }
                         
                    moyenne = somme/tailleTableau;

                    return moyenne;

                       
                    }   
                         




                    Bonjour :-)
                    Premièrement quand tu initialises somme je te conseille de le mettre à 0 avec:
                    double somme = 0;
                    Sinon il me semble que "somme" contiendra la valeur actuelle de ce qu'il y a dans la pile à l'endroit ou est créé la variable. Et donc il peut contenir quelque chose de différent de 0. Ce qui fait que dans ces cas la somme sera faussée vu que tu prends "somme" et tu lui additionnes tous les éléments. Au lieu d'avoir tableau[0] + tableau[1]... Tu as "valeur initiale de somme" + tableau[0] + tableau[1]...
                    Si quelqu'un peut confirmer ?

                    Et ensuite comme il a été dit plus haut, float semble plus approprié pour une moyenne, vu qu'elle peut contenir des virgules :-)

                    (Ah, aussi, tu utilises stdlib.h en include alors que tu n'en as pas besoin)

                    Et j'ai remplacé la nombre d'élement dans ton tableau qui était en dur par: sizeof(tableau)/sizeof(long) Je sais pas si c'est recommandé ou non, mais comme ca tu peux modifier les éléments de ton tableau (en ajouter, en supprimer...) sans avoir a toucher au reste du code :-)

                    Voila ce que j'ai fait:

                    #include <stdio.h>

                    float moyenneTableau(long *, long);
                    void affiche (long *, long);

                    int
                    main(int argc, char *argv[]) {
                            long tableau [4] = {23, 34, 75, 89};

                            affiche(tableau, sizeof(tableau)/sizeof(long));

                            printf ("La moyenne du tableau est %lf\n",
                                    moyenneTableau(tableau, sizeof(tableau)/sizeof(long)));

                            return 0;
                    }


                    float
                    moyenneTableau(long *tableau, long tailleTableau) {
                            int i;
                            float somme=0.0;

                            for(i=0; i<tailleTableau; i++)
                                    somme += tableau[i];

                            return somme/tailleTableau;
                    }


                    void
                    affiche (long *tableau, long tailleTableau) {
                            int i;

                            for (i=0; i<4; i++)
                                    printf ("Valeur %ld : %ld\n",i, tableau[i]);
                    }



                    et ca donne:
                    $ gcc -ansi -std=c99 -pedantic test.c
                    $ ./a.out
                    Valeur 0 : 23
                    Valeur 1 : 34
                    Valeur 2 : 75
                    Valeur 3 : 89
                    La moyenne du tableau est 55.250000
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 juillet 2006 à 11:16:17

                      Citation : RiftAndChips

                      Sinon il me semble que "somme" contiendra la valeur actuelle de ce qu'il y a dans la pile à l'endroit ou est créé la variable. Et donc il peut contenir quelque chose de différent de 0. Ce qui fait que dans ces cas la somme sera faussée vu que tu prends "somme" et tu lui additionnes tous les éléments. Au lieu d'avoir tableau[0] + tableau[1]... Tu as "valeur initiale de somme" + tableau[0] + tableau[1]...
                      Si quelqu'un peut confirmer ?


                      Je confirme.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Problème exercices sur les tableaux

                      × 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