Partage
  • Partager sur Facebook
  • Partager sur Twitter

somme des valeurs d'un tableau

est-ce bien orthodoxe ?

    21 mai 2018 à 15:07:52

    bonjour,

    voici donc le résultat de mes recherches sur le premier exercice du chapitre sur les tableaux du cours sur la programmation en C.

    Le code a été accepté par IDE codeblock, mais je ne suis pas sûr qu'on s'attendait à ce code là.

    Bref, tous mes remerciements à toute l'équipe et à celles et ceux qui me répondront.

    bon courage à tous

    @ bientôt

    pascal

    Créez une fonction « sommeTableau » qui renvoie la somme des valeurs contenues dans le tableau.

    #include <stdio.h>

    #include <stdlib.h>

    //prototype :

    int sommeTableau (int tableau[], int tailleTableau);

    int main(int argc, char*argv[])

    {

        int resultat;

        //somme des valeurs du contenu du tableau

        int tableau[4] = {20 + 35 + 108 + 32};

        //je réduis à "1" la taille du tableau vu que c'est le résultat qui m'intéresse...

        sommeTableau(tableau,1);

        return resultat;

    }

    int sommeTableau (int tableau[], int tailleTableau)

    {

        int i;

        for (i = 0; i <tailleTableau; i++)

        {

            printf("%d\n", tableau[i]);

        }

    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2018 à 15:23:03

      Hello,

      • Pour poster du code, utilise le bouton </> de l'éditeur du site, et choisis c++ comme langage. Merci.
      • J'ai un tableau de 18564 nombres. Tu vas aussi réduire la taille à 1 ?

      -
      Edité par edgarjacobs 21 mai 2018 à 15:24:35

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        21 mai 2018 à 17:35:29

        Bonjour PascalKlein,

        Il y a certaines choses à revoir concernant ton code.

        Tout d'abord, lorsque tu crées un tableau, pour séparer chaque élément, tu dois utiliser une virgule ",".

        int tableau[4] = {4, 20, 10, 4};

        Puis, ta fonction sommeTableau ne calcule absolument pas la somme des éléments du tableau. Il se contente seulement d'afficher le premier élément du tableau. Et une fonction de type int (int sommeTableau) renvoie un entier alors que dans ton code la fonction ne renvoie rien. Une fonction qui ne renvoie rien est de type void.

        Voici un pseudo-code qui pourra peut-être te permettre de calculer la somme d'un tableau :

        i = 0;
        somme = 0;
        
        Pour i allant de 0 à tailleTableau:
        	somme = somme + tableau[i];
        	
        retourne somme;

        En espérant t'avoir aidé.

        Cordialement.

        --

        PANCHALINGAMOORTHY Gajenthran

        -
        Edité par Gajenthran 21 mai 2018 à 17:36:50

        • Partager sur Facebook
        • Partager sur Twitter
          22 mai 2018 à 10:29:31

          Pour préciser ce que dit Gajenthran, tu crées dès le début un tableau avec une seule case. Enfin tu crées un tableau de quatre cases mais tu remplis seulement la première avec une expression arithmétique du type a + b + c + d. Donc ta fonction somme se contente d'afficher la première case du tableau qui contient déjà la somme de a, b, c et d.
          • Partager sur Facebook
          • Partager sur Twitter
            22 mai 2018 à 12:35:43

            PascalKlein2 a écrit:

            bonjour,

            voici donc le résultat de mes recherches sur le premier exercice du chapitre sur les tableaux du cours sur la programmation en C.

            int sommeTableau (int tableau[], int tailleTableau)

            {

                int i;

                for (i = 0; i <tailleTableau; i++)

                {

                    printf("%d\n", tableau[i]);

                }

            Bonjour,

            Tu as dû faire une erreur de copier-coller, car ici c'est le corps de la fonction affiche du tutoriel.

            -
            Edité par Marc Mongenet 22 mai 2018 à 12:36:08

            • Partager sur Facebook
            • Partager sur Twitter
              27 mai 2018 à 10:01:06

              Un grand merci à tous pour vos réponses éclairantes. 

              edgarjacobs : ok, je suivrai les consignes.

              Gajenthran : je savais pour la virgule entre les cases du tableau mais je me croyais malin en trouvant cette solution. J'en déduis que, si l'IDE donne une bonne réponse, elle n'est pas forcément juste.

              Thetui : oui, je comprends. La première réponse que l'IDE m'a donné quand j'ai laissé les 4 cases : 195 0 0 0, d'où la réduction à une seule case. 

              Marc : je ne sais pas comment ce tutoriel est arrivé là...o_O

              J'en conclue donc qu'il FAUT ABSOLUMENT comprendre dans les moindres détails ce que je fais et pourquoi je le fais...;)

              -
              Edité par PascalKlein2 27 mai 2018 à 10:04:22

              • Partager sur Facebook
              • Partager sur Twitter
                27 mai 2018 à 12:26:31

                Gajenthran a écrit:

                Voici un pseudo-code qui pourra peut-être te permettre de calculer la somme d'un tableau :

                i = 0;
                somme = 0;
                
                Pour i allant de 0 à tailleTableau:
                	somme = somme + tableau[i];
                	
                retourne somme;

                En espérant t'avoir aidé.

                Ca l'aide en lui montrant un exemple typique de débordement d'indices :-) situation que le débutant devra affronter un nombre incalculable de fois.

                En C (et C++ et pas mal d'autres langages), les cases d'un tableau sont indicées (numérotées) à partir de zero.  Donc un tableau de N cases a des indices qui vont de 0 à N-1.

                Et donc au dernier tour de la boucle, quand i est égal à tailleTableau, paf, l'expression  tableau[i] a un résultat indéfini (elle peut aussi faire planter). Et comme on l'ajoute dans somme, ça va faire vilain.

                En fait, le code se construit par une suite d'étapes, qu'on marque sur le papier ou qu'on fait dans sa tête

                Etape 1
                
                retourner la somme des éléments du tableau
                
                
                -----------
                
                Etape 2
                
                additionner entre eux tous les éléments du tableau
                retourner le resultat
                
                ----------
                
                Etape 3
                
                mettre 0 dans somme
                ajouter à somme chaque élement du tableau
                retourner somme
                
                ----------
                
                Etape 4
                
                mettre 0 dans somme
                pour chaque élement du tableau
                faire
                    ajouter element à somme
                retourner somme
                
                --------
                
                Etape 5
                
                mettre 0 dans somme
                pour chaque indice i du tableau
                faire
                     ajouter t[i] à somme
                retourner somme
                
                ---------
                
                Etape 5
                
                mettre 0 dans somme
                pour chaque entier i de 0 à taille-1
                faire
                     ajouter tableau[i] à somme
                retourner somme
                
                ---------
                
                Etape 6
                
                int sommeTable(int tableau[], int taille) {
                  somme = 0;
                  for (int i=0; i < taille; i++) {
                     somme += tableau[i];
                  }
                return somme;
                }
                ---------
                
                
                Etape 7
                
                Création d'une startup qui vend la fonction qui fait la somme des éléments d'un tableau, en gros et semi-gros.
                
                



                ---

                L'IDE n'est pas là pour comprendre ce que tu fais. Du moment que tu lui donnes du code qui est conforme à la syntaxe du langage, tout va bien pour lui, il le traduit, il en fait un exécutable, et cet exécutable fait quelque chose. Eventuellement, il plante. En tout cas il faut ce qu'on lui dit de faire, pas ce qu'on voudrait qu'il fasse.



                -
                Edité par michelbillaud 27 mai 2018 à 12:31:01

                • Partager sur Facebook
                • Partager sur Twitter
                  30 mai 2018 à 19:24:57

                  Bonjour, 

                  J'en suis au même stade que PascalKlein et malgré ma lecture approfondi des explications et une refonte intégrale de ma 1ére ébauche, j'avance pas d'un caractére.

                  en gros pour moi ça fait ça :

                  pour un résultat :

                  ce que j'arrive pas a saisir, c'est que mon "printf (sommeTableau)" m'affiche 66813, c'est pas l'adresse de la valeur j'ai vérifié. 

                  en vous remerciant pour vos réponses. 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 mai 2018 à 19:32:59

                    Tu squattes un peu.

                    Il faut printf une varible, la c'est un fonction. Ta somme marche pas, relis le sujet.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 mai 2018 à 6:56:51

                      Je crois qu'il est nécessaire que tu relises encore une fois les explications.

                      Les points à revoir :

                      - comment écrire une fonction qui retourne une valeur (retourner, ce n'est pas afficher)

                      - comment utiliser la valeur retournée par une telle fonction

                      Sans hésiter à consulter de meilleurs cours.

                      -
                      Edité par michelbillaud 31 mai 2018 à 6:57:13

                      • Partager sur Facebook
                      • Partager sur Twitter
                        31 mai 2018 à 10:02:54

                        ok, super merci thetui pour ton explication, j'ai réussi du coup :) 

                        mais je ne pense pas remplir exactement les conditions. j'effectue le printf(somme) dans ma fonction sommeTableau. 

                        j'utilise pas le "return", a ce que je peu comprendre de l'énoncé c'est qu'il faut afficher "somme" dans "main". 

                        Michelbillau, déjà merci pour t'a réponse, j'ai l'impression que la communauté et active, ça fais plaisir

                        oui je l'ai bien compris la nuance entre retourner et afficher, mais la mon souci c'est que la variable "somme" n'a de valeur que dans la fonction "sommeTableau", c'est pour cette raison que j'ai voulu afficher la valeur de la fonction dans mon 1er message. 

                        Est ce que la variable "somme", je dois la positionner en entrée de code? 

                        De meilleurs cours? c'est à dire? 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          31 mai 2018 à 10:14:15

                          A la fin de ta fonction sommeTab() tu peut renvoyer la variable somme.

                          Et quand tu apelles ta fonction tu l'affectes a une variable.

                          int f(int g);
                          
                          int main(void){
                              int a = 0;
                              int b = f(a);
                              printf("%d", b);
                              return EXIT_SUCCESS;
                          }
                          
                          int f(int g){
                              return g+1;
                          }



                          • Partager sur Facebook
                          • Partager sur Twitter
                            31 mai 2018 à 10:16:19

                            Je reformule. Tu as déclaré la fonction sommeTableau

                            int sommeTableau(.....)
                            {
                              int somme;
                              .... // corps
                            }

                            avec un type de retour int.  Dans le corps de la fonction il devrait donc  y avoir une instruction return dont le rôle est de retourner un int, justement.

                            C'est quelque chose que le compilateur signale, normalement. Il faut tenir compte de ses messages, même si ce ne sont que des avertissements. A 99,9%, les avertissements dans les programmes de débutants révèlent des erreurs de programmation.


                            Tu as parfaitement raison de dire que la variable somme, qui est locale, n'est visible que depuis la fonction.  Mais ce n'est pas elle qui nous intéresse, mais plutot la valeur qu'elle contient. Voyons, comment pourrait-on faire pour récupérer cet int  ?  :-)

                            PS : tu déclares un tableau de 4 entiers, et tu l'initialises avec 3 valeurs. C'est fait exprès ?

                            -
                            Edité par michelbillaud 31 mai 2018 à 10:20:17

                            • Partager sur Facebook
                            • Partager sur Twitter
                              31 mai 2018 à 12:23:45

                              Yeppa, ça y est j'y suis : 

                              int sommeTableau(int tableau[], int tailleTableau);
                              
                              int main()
                              {
                                  int tableau[4] = {80, 30, 22};
                                  int resultat = 0;
                              
                                  resultat = sommeTableau(tableau, 4);
                              
                                  printf("%d", resultat);
                              }
                              
                              int sommeTableau(int tableau[], int tailleTableau)
                              {
                                  int i;
                                  int somme = 0;
                              
                                  for (i = 0 ; i < tailleTableau; i++)
                                  {
                                      printf("%d\n", tableau[i]);
                                      somme = somme + tableau[i];
                                  }
                                  return somme;
                              }
                              

                              Merci pour vos conseils clairs et avisés, thetui et michelbillau, il est vrais que j'avais oublié de créer une variable pour le return de la fonction, petit détail qui a tout son importance. Il me manque encore une certaine logique et d'incertains automatises, mais j'dois dire que C sur la bonne voix.

                              Et je remarque en faite, qu'un code juste a une certaine esthétique, ça "a plus de gueule" comme on dit, c'est peut être un 1er levier de vérification. 

                              Pour répondre a ta question michelbillau, non c'est voulu, les 3 valeurs, il me semble si je ne me trompe pas, que si on initialise qu'une partie du tableau, le reste est automatiquement mis à zéro. 

                              • Partager sur Facebook
                              • Partager sur Twitter
                                31 mai 2018 à 13:26:49

                                BailQuentin a écrit:

                                Pour répondre a ta question michelbillau, non c'est voulu, les 3 valeurs, il me semble si je ne me trompe pas, que si on initialise qu'une partie du tableau, le reste est automatiquement mis à zéro. 


                                C'est justement ce qui en fait une mauvaise idée :

                                ton test, qui retourne 132, ne te permet pas de savoir si la dernière case a été prise en compte.  Parce qu'une erreur extrêmement fréquente pour les débutants en programmation (en C/C++/etc) est justement de se gourrer dans la condition du for(;...;). Exemple

                                for( i=0; i<tailleTableau-1; i++)  {  // bug
                                ..
                                }
                                



                                Avec un zero dans une somme, ça passe totalement inaperçu.

                                Un meilleur test serait

                                int tableau[4] = {1000, 200, 30, 4};   // si tout va bien : 1234



                                -
                                Edité par michelbillaud 31 mai 2018 à 13:33:51

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  31 mai 2018 à 14:01:28

                                  c'est exacte, j'comprend ce que tu veux dire, mais j'ai échappé à l'erreur du for ce coups-ci.

                                  Je le garde pour plus tard, faut pas tout cramé dés le début, mais si besoin, je sais à qui demander :)  

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    31 mai 2018 à 15:45:37

                                    BailQuentin a écrit:

                                    il est vrais que j'avais oublié de créer une variable pour le return de la fonction, petit détail qui a tout son importance.

                                    Non, tu n'es aucunement obligé de créé une variable. On t'as proposé cette solution uniquement parce que ça parraissait plus claire pour que tu ai le déclic ;)

                                    Mais ce que tu avais oublié c'était :

                                    1 - De return la valeur somme

                                    2 - D'appeller la fonction sommeTableau dans ton printf

                                    Ton code peut très bien s'ecrire comme ça :

                                    printf("%d", sommeTableau(tableau, 4));
                                    

                                    Ce qui au final est assez proche de ce que tu pensais faire lorsque tu as écris :

                                    printf("%d", sommeTableau);

                                    Pour info, dans le cas 1 tu demande à printf d'afficher sous forme de "int" (flag %d) la valeur retourné par l'appel à la fonction sommeTableau avec pour argument tableau et 4.

                                    Dans le cas 2, tu demande à printf d'afficher sous forme d'int l'adresse de la fonction sommeTableau. Elle n'est jamais executé et printf va juste t'afficher ou elle se trouve en mémoire (ce qui est assez inutile pour toi).

                                    D'ailleurs ton compilateur a du t'informer que tu passais une valeur de type "adresse" ou "pointeur" alors que printf attendais une valeur de type "int".

                                    De la même façon qu'il a du t'indiquer que tu ne retournais rien dans une fonction ayant pour prototype "int sommeTableau".

                                    Comme disais michelbillaud 99,9% des warnings sont enfait des erreurs de programations pour les débutants (et même pour les non débutant). D'une manière général il t'informe que tu ne fais pas ce que le compilateur attend, et donc que ton programme va potentiellement se comporter différement de ce que tu penses.

                                    Dernière petite chose, penses à ajouter des "\n" à la fin de tes printf. printf a un système de buffer, c'est à dire qu'il enregistre les chaines et ne les affiche que lorsqu'on lui passe un "\n". Tu risque de te faire avoir en voyant des chaine s'afficher bien après qu'elle ai effectivement été transmise à printf.

                                    Bonne continuation dans ton apprentissage du C.

                                    Ah et aufaite :

                                    michelbillaud a écrit:

                                    Sans hésiter à consulter de meilleurs cours.

                                    Par ici ;)

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter - Edsger Dijkstra
                                      2 juin 2018 à 14:46:43

                                      Damjuve, 

                                      Ok, merci beaucoup pour tes explications et le petit site qui m'a l'air fort sympathique, ce forum me plait de plus en plus.

                                       à bientôt sur d'autres topics. 

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        3 juin 2018 à 9:50:02

                                        Et puis on ne "crée" pas une variable.

                                        On la déclare, on la définit, on l'initialise, on l'affecte et on l'utilise..

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        somme des valeurs d'un tableau

                                        × 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