Partage
  • Partager sur Facebook
  • Partager sur Twitter

Langage C - Exercice s sur les tableaux

Sujet résolu
    27 mars 2017 à 15:55:59

    Bonjour tout le monde,

    Je suis coincé sur le premier exercice qui consiste à calculer la somme d'un tableau.

    J'aimerais mettre le printf dans la fonction "main" en utilisant un pointeur mais je n'y arrive pas..

    il est possible de faire sans mais j'aime les défis!

    voici mon code :

    #include <stdio.h>
    #include <stdlib.h>
    #include "essais.h"
    
    int main()
    {
        int somme = 0;
        int *pSomme = &somme;
        int tableau[5] = {1,2,3,4,5};
        sommeTableau(tableau,5);
        printf("La somme du tableau donne :%d\n", somme);
        return (0);
    }
    
    int sommeTableau(int tableau[], int tailleTableau)
    {
        int i = 0;
        for (i = 0; i < tailleTableau ; i++)
        {
            *pSomme = tableau[i] + *pSomme;
        }
        return (*pSomme);
    }

    J'ai une erreur de compilation à la ligne 20 me disant que pSomme n'est pas déclaré..

    Le prototype de la fonction se trouve dans le fichier essais.h (d'ailleurs si je déclare le pointeur dans ce fichier cela fonctionne mais je ne suis pas sûr que ce soit conseillé, cela revient à faire une déclaration globale, non?

    Pouvez-vous m'aider s'il vous plaît?

    Merci!

    • Partager sur Facebook
    • Partager sur Twitter
      27 mars 2017 à 16:12:26

      Tu n'envoie pas le pointeur dans ta fonction, la variable pSomme n'est accessible que dans ton main actuellement
      • Partager sur Facebook
      • Partager sur Twitter
        27 mars 2017 à 16:28:51

        Bonjour,

        Merci pour la réponse, j'ai bien compris mais si je mets :

            int somme = 0;
            int *pSomme = &somme;

        dans la fonction c'est dans le "main" qu'il ne connais plus "somme" alors comment faire pour appeler "somme" de n'importe où sans utiliser de variable globale?

        • Partager sur Facebook
        • Partager sur Twitter
          27 mars 2017 à 16:31:06

          Theverglades a écrit:

          Je suis coincé sur le premier exercice qui consiste à calculer la somme d'un tableau.

          J'aimerais mettre le printf dans la fonction "main" en utilisant un pointeur mais je n'y arrive pas..

          il est possible de faire sans mais j'aime les défis

          Mouais, il y a déjà un pointeur dans le prototype officiel de sommeTableau. Tu ferais probablement mieux de commencer par faire l'exercice simplement (et proprement):

          #include <stdio.h>
          
          
          int sommeTableau(int tableau[], int tailleTableau);
           
          int main()
          {
              int tableau[5] = { 1, 2, 3, 4, 5 };
              printf("La somme du tableau donne :%d\n", sommeTableau(tableau, 5));
              return 0;
          }
           
          int sommeTableau(int tableau[], int tailleTableau)
          {
              // compléter ici
          }

          -
          Edité par Marc Mongenet 27 mars 2017 à 16:32:11

          • Partager sur Facebook
          • Partager sur Twitter
            27 mars 2017 à 16:33:25

            Theverglades a écrit:

            Bonjour,

            Merci pour la réponse, j'ai bien compris mais si je mets :

                int somme = 0;
                int *pSomme = &somme;

            dans la fonction c'est dans le "main" qu'il ne connais plus "somme" alors comment faire pour appeler "somme" de n'importe où sans utiliser de variable globale?


            Il faut que tu la passe en paramètre de tafonction sommeTableau :

            int sommeTableau(int tableau[], int tailleTableau, int* pSomme)



            • Partager sur Facebook
            • Partager sur Twitter
              27 mars 2017 à 16:41:33

              Marc -> j'avais déjà réussi l'exo de la façon que tu décris, j'essayais juste d'aller plus loin dans ma compréhension des choses...

              Florent -> j'ai déjà essayé de la passer en paramètre mais ça ne fonctionne pas non plus.. (conflicting types for 'sommeTableau')

              Il y a un truc qui m'échappe mais je sens que ce n'est pas loin..

              • Partager sur Facebook
              • Partager sur Twitter
                27 mars 2017 à 16:48:24

                Ce code fonctionne pour moi:

                #include <stdio.h>
                #include <stdlib.h>
                
                
                 void sommeTableau(int tableau[], int tailleTableau,int* pSomme);
                
                int main()
                {
                    int somme = 0;
                    int *pSomme = &somme;
                    int tableau[5] = {1,2,3,4,5};
                    sommeTableau(tableau,5, pSomme);
                    printf("La somme du tableau donne :%d\n", somme);
                    return (0);
                }
                
                void sommeTableau(int tableau[], int tailleTableau,int* pSomme)
                {
                    int i = 0;
                    for (i = 0; i < tailleTableau ; i++)
                    {
                        *pSomme = tableau[i] + *pSomme;
                    }
                   
                }
                



                -
                Edité par florent m 27 mars 2017 à 16:48:46

                • Partager sur Facebook
                • Partager sur Twitter
                  27 mars 2017 à 17:04:40

                  Merci Florent, j'avais oublié de rajouter le paramètre aussi dans le prototype..

                  Bon en tout cas à force de retourner le code dans tous les sens j'ai quand même appris deux trois trucs..

                  maintenant je vais pouvoir utiliser ma variable "somme" dans la fonction "moyenne" de l'exercice 2..

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 mars 2017 à 17:07:46

                    Theverglades a écrit:

                    Merci Florent, j'avais oublié de rajouter le paramètre aussi dans le prototype..

                    Bon en tout cas à force de retourner le code dans tous les sens j'ai quand même appris deux trois trucs..

                    maintenant je vais pouvoir utiliser ma variable "somme" dans la fonction "moyenne" de l'exercice 2..


                    Très mauvaise piste, c'est la fonction sommeTableau qu'il faut utiliser dans le calcul de la moyenne...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 mars 2017 à 17:12:28

                      Encore merci, je viens de me heurter au problème : ça devient vite l'usine à gaz!

                      En tout cas tu me fais bien progresser!

                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 mars 2017 à 0:55:50

                        Theverglades a écrit:

                        Encore merci, je viens de me heurter au problème : ça devient vite l'usine à gaz!

                        La moyenne étant la somme divisée par la taille, la formule est toute trouvée: sommeTableau(tableau, taille) / taille.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 mars 2017 à 11:57:14

                          Bonjour tout le monde,

                          J'ai fini par venir à bout des exercices! \o/

                          Voici mes solutions :

                          #include <stdio.h>
                          #include <stdlib.h>
                          int sommeTableau(int tableau[], int tailleTableau);
                          double moyenneTableau(int tableau[], int tailleTableau);
                          
                          int main()
                          {
                              int tableau[5] = {1,2,3,4,5};
                              printf("La somme du tableau donne :%d\n",sommeTableau(tableau,5));
                              printf("La moyenne du tableau donne :%f\n",moyenneTableau(tableau,5));
                              return (0);
                          }
                          
                          // Exercice 1
                          int sommeTableau(int tableau[], int tailleTableau)
                          {
                              int somme = 0;
                              int i = 0;
                              for (i = 0; i < tailleTableau ; i++)
                              {
                                  somme += tableau[i];
                              }
                              return (somme);
                          }
                          
                          // Exercice 2
                          double moyenneTableau(int tableau[], int tailleTableau)
                          {
                              double moyenne = 0;
                              moyenne = sommeTableau(tableau,5) / tailleTableau;
                              return (moyenne);
                          }
                          
                          
                          
                          #include <stdio.h>
                          #include <stdlib.h>
                          // Exercice 3
                          void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau);
                          int main()
                          {
                              int tableauOriginal[5] = {1,2,3,4,5};
                              int tableauCopie[5] = {0};
                              int i=0;
                              copie(tableauOriginal,tableauCopie,5);
                              for (i=0;i<5;i++)
                              {
                                 printf ("Original : %d - Copie : %d\n", tableauOriginal[i], tableauCopie[i]);
                              }
                          
                              return(0);
                          }
                          
                          void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau)
                          {
                              int i =0;
                              for (i=0;i<tailleTableau;i++)
                              {
                                  tableauCopie[i]=tableauOriginal[i];
                              }
                          }
                          



                          #include <stdio.h>
                          #include <stdlib.h>
                          //Exercice 4
                          void maximumTableau(int tableau[], int tailleTableau, int valeurMax);
                          int main()
                          {
                              int tableau[10] = {6,4,15,21,10,1,25,13,11,18};
                              int i=0;
                              maximumTableau(tableau,10,12);
                              for (i=0; i<10; i++)
                              {
                                  printf("%d\n", tableau[i]);
                              }
                          
                              return 0;
                          }
                          
                          void maximumTableau(int tableau[], int tailleTableau, int valeurMax)
                          {
                              int i;
                              for (i=0; i<tailleTableau; i++)
                              {
                                  if(valeurMax<tableau[i])
                                  {
                                      tableau[i]=0;
                                  }
                              }
                          }
                          



                          #include <stdio.h>
                          #include <stdlib.h>
                          
                          //Exercice 5
                          void ordonnerTableau(int tableau[], int tailleTableau);
                          int main()
                          {
                              int tableau[5]={2,5,4,1,3};
                              int i=0;
                              ordonnerTableau(tableau,5);
                              for (i=0;i<5;i++)
                              {
                                  printf("%d ",tableau[i]);
                              }
                              return 0;
                          }
                          
                          void ordonnerTableau(int tableau[], int tailleTableau)
                          {
                              int i=0,j=0;
                              int varTemp=0;
                              for (j=0;j<tailleTableau-1;j++)
                              {
                                  for (i=0;i<tailleTableau-1;i++)
                                  {
                                      if (tableau[i]>tableau[i+1])
                                      {
                                          varTemp=tableau[i];
                                          tableau[i]=tableau[i+1];
                                          tableau[i+1]=varTemp;
                                      }
                                  }
                              }
                          
                          }
                          


                          Du coup je me dis que ça doit exister un site avec des challenges didactiques de programmation en C où l'on partirait du niveau débutant jusqu'à la maîtrise d'une fonction ciblée (comme par exemple les pointeurs ou les tableaux). Je me pose cette question car à mon avis il est possible d'aller très loin avec les tableaux mais ici on est limité à 5 exos.. J'ai compris, je vais voir google..

                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 mars 2017 à 13:51:12

                            Theverglades a écrit:

                            J'ai fini par venir à bout des exercices! \o/

                            Très bien.
                            Il y a une erreur d'inattention dans moyenneTableau, et une autre erreur normale en sachant que le tutoriel n'explique pas les conversions de type.
                            Les deux erreurs auraient dû être aisément détectées par des tests.

                            -
                            Edité par Marc Mongenet 28 mars 2017 à 13:51:55

                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 mars 2017 à 8:19:20

                              Bonjour Marc,

                              J'ai beau chercher je ne voie pas les erreurs, la compilation se passe bien et ne m'indique rien de spécial. Le seul truc qui m'a paru étrange c'est de pouvoir faire du calcul décimal avec des entiers..

                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 mars 2017 à 9:28:42

                                Theverglades a écrit:

                                Bonjour Marc,

                                J'ai beau chercher je ne voie pas les erreurs, la compilation se passe bien et ne m'indique rien de spécial. Le seul truc qui m'a paru étrange c'est de pouvoir faire du calcul décimal avec des entiers..


                                Fais donc des tests, tu verras tout de suite des problèmes en changeant la taille et les éléments.

                                -
                                Edité par Marc Mongenet 29 mars 2017 à 9:28:54

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  29 mars 2017 à 11:47:14

                                  Je pense avoir compris :

                                  // Exercice 2
                                  double moyenneTableau(int tableau[], int tailleTableau)
                                  {
                                      double moyenne = 0;
                                      moyenne = sommeTableau(tableau,tailleTableau) / tailleTableau;
                                      return (moyenne);
                                  }

                                  à la ligne 5, j'ai remplacé le "5" par "tailleTableau" ce qui est plus judicieux. C'est pour ce genre de choses que j'essayais d'utiliser les pointeurs afin que le changement d'un paramètre se répercute sur l'ensemble du programme (notamment dans les printf de la fonction main).



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    29 mars 2017 à 14:04:26

                                    Theverglades a écrit:

                                    à la ligne 5, j'ai remplacé le "5" par "tailleTableau" ce qui est plus judicieux.

                                    C'est bien. Il reste à faire en sorte que la division se fasse en virgule flottante plutôt qu'en entier.
                                    Pour cela, il faut qu'au moins une des deux opérandes de la division soit de type double.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      2 avril 2017 à 16:48:32

                                      1
                                      2
                                      3
                                      4
                                      5
                                      6
                                      7
                                      // Exercice 2
                                      double moyenneTableau(int tableau[], int tailleTableau)
                                      {
                                      double moyenne = 0;
                                      moyenne = (double)sommeTableau(tableau,tailleTableau) / tailleTableau;
                                      return (moyenne);
                                      }
                                      je pense qu il sagissait de cette precision sur la quelle  Marc Mongenet voulait aussi attire ton attention
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        2 avril 2017 à 22:06:25

                                        LilPatson a écrit:

                                        1
                                        2
                                        3
                                        4
                                        5
                                        6
                                        7
                                        // Exercice 2
                                        double moyenneTableau(int tableau[], int tailleTableau)
                                        {
                                        double moyenne = 0;
                                        moyenne = (double)sommeTableau(tableau,tailleTableau) / tailleTableau;
                                        return (moyenne);
                                        }

                                        je pense qu il sagissait de cette precision sur la quelle  Marc Mongenet voulait aussi attire ton attention

                                        Tout à fait. Mais l'opérateur de conversion n'étant pas présenté par le tutoriel, il faut s'y prendre autrement.

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




                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Langage C - Exercice s 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