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;
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.
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à...
J'en conclue donc qu'il FAUT ABSOLUMENT comprendre dans les moindres détails ce que je fais et pourquoi je le fais...
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.
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é.
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?
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 ?
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.
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
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.
On la déclare, on la définit, on l'initialise, on l'affecte et on l'utilise..
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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent