Petite erreur à trouver
Résolu
Maxcocatrix
Messages postés
88
Date d'inscription
Statut
Membre
Dernière intervention
-
Maxcocatrix Messages postés 88 Date d'inscription Statut Membre Dernière intervention -
Maxcocatrix Messages postés 88 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je ne trouve pas mon erreur dans ce code (je suis débutant en programmation en C) :

Ce qui est étonnant, c'est que je l'appelle après dans main..

et qu'elle semble marcher à la compilation : (!)

Voilà si quelqu'un trouve, c'est gentil :)
Mes seuls doutes sont sur le double moyenne = (somme/tailleTab) puisque tailleTab n'est pas de type double, cependant avant de renvoyer le résultat, j'ai mis un printf et le bon résultat est stocké dans moyenne.
Merci bonne journée
je ne trouve pas mon erreur dans ce code (je suis débutant en programmation en C) :

Ce qui est étonnant, c'est que je l'appelle après dans main..

et qu'elle semble marcher à la compilation : (!)

Voilà si quelqu'un trouve, c'est gentil :)
Mes seuls doutes sont sur le double moyenne = (somme/tailleTab) puisque tailleTab n'est pas de type double, cependant avant de renvoyer le résultat, j'ai mis un printf et le bon résultat est stocké dans moyenne.
Merci bonne journée
A voir également:
- Petite erreur à trouver
- Trouver adresse mac - Guide
- Comment trouver le mot de passe wifi sur son téléphone - Guide
- Ou trouver l'adresse ip - Guide
- Trouver un film sans le titre - Télécharger - Divers TV & Vidéo
- Petite amie virtuelle en français gratuit - Accueil - Intelligence artificielle
6 réponses
Bonjour,
J'ai testé votre code, je n'ai pas de problèmes :
https://www.cjoint.com/?DFAniBpTiiH
Cela vient peut-être du fait que vous avez mis le printf sur la même ligne que l'appel de fonction.
Sinon pour tailleTab, il suffit que vous mettiez :
double moyenne = (somme/(double)tailleTab)
A ce moment-là, tailleTab sera considéré comme un double.
"Moi je dis que le plus fort entre l'hippopotame et l'éléphant, c'est encore le rhinocéros !"
J'ai testé votre code, je n'ai pas de problèmes :
https://www.cjoint.com/?DFAniBpTiiH
Cela vient peut-être du fait que vous avez mis le printf sur la même ligne que l'appel de fonction.
Sinon pour tailleTab, il suffit que vous mettiez :
double moyenne = (somme/(double)tailleTab)
A ce moment-là, tailleTab sera considéré comme un double.
"Moi je dis que le plus fort entre l'hippopotame et l'éléphant, c'est encore le rhinocéros !"
Cela pourrait-il venir d'un CodeBlocks défectueux.. ? même si j'en doute.
Je ne mets pas le sujet en résolu pour l'instant ; mais comme je l'ai dit, ma priorité n'est pas que ça fonctionne, mais que j'apprenne .. cependant si quelqu'un trouve, merci.
Je ne mets pas le sujet en résolu pour l'instant ; mais comme je l'ai dit, ma priorité n'est pas que ça fonctionne, mais que j'apprenne .. cependant si quelqu'un trouve, merci.
Je ne vois pas ce qui te fait penser qu'il y a une erreur ?
tab1[7]={4,5,1,3,7,1};
Cela veut dire que ton tableau contient 7 éléments dont les 1er sont 4,5,1,3,7,1 ; les autres sont mis à 0. Autrement dit, tab1[0]=4, tab1[1]=5, ..., tab1[5]=1, tab1[6]=0.
Ensuite, tu fais une boucle sur 7.
Donc, 4, 9, 10, 13, 20, 21, 21 (21+0).
21/7 te donne 3. A quoi t'attendais-tu ?
Pourquoi indiquer la taille du tableau ? Autant faire :
Ton tableau sera automatiquement alloué en 6 int (c'est la bonne taille).
Ensuite pour appeler ta fonction :
sizeof tab1/ sizeof *tab1; te renverra le nombre d'éléments dans ton tableau (ici 6).
Et enfin, n'oublie pas de mettre un '\n' à la fin de ton printf() pour forcer l'affichage avant le return 0; final.
Cdlt,
tab1[7]={4,5,1,3,7,1};
Cela veut dire que ton tableau contient 7 éléments dont les 1er sont 4,5,1,3,7,1 ; les autres sont mis à 0. Autrement dit, tab1[0]=4, tab1[1]=5, ..., tab1[5]=1, tab1[6]=0.
Ensuite, tu fais une boucle sur 7.
Donc, 4, 9, 10, 13, 20, 21, 21 (21+0).
21/7 te donne 3. A quoi t'attendais-tu ?
Pourquoi indiquer la taille du tableau ? Autant faire :
int tab1[] = {4, 5, 1, 3, 7, 1};
Ton tableau sera automatiquement alloué en 6 int (c'est la bonne taille).
Ensuite pour appeler ta fonction :
moy1=moyenneTableau( tab1, sizeof tab1 / sizeof *tab1 );
sizeof tab1/ sizeof *tab1; te renverra le nombre d'éléments dans ton tableau (ici 6).
Et enfin, n'oublie pas de mettre un '\n' à la fin de ton printf() pour forcer l'affichage avant le return 0; final.
Cdlt,
Bien que je pense avoir compris la majorité, merci pour tes explications.
Mon problème est visible sur la 3e image que j'ai postée au départ.
Quand je compile, j'ai mis un printf dans ma fonction moyenneTableau, qui affiche 3 comme voulu.
Mais quand elle appelée par main, et que je réaffiche la valeur dans main, il affiche 0 (on le voit sur l'image), ce qui laisse présager que moy1 contient la valeur 0.0 dans la fonction main..
Merci pour size of
Mon problème est visible sur la 3e image que j'ai postée au départ.
Quand je compile, j'ai mis un printf dans ma fonction moyenneTableau, qui affiche 3 comme voulu.
Mais quand elle appelée par main, et que je réaffiche la valeur dans main, il affiche 0 (on le voit sur l'image), ce qui laisse présager que moy1 contient la valeur 0.0 dans la fonction main..
Merci pour size of
Cela fait longtemps que je n'ai pas utilisé code::blocks, mais il me semble qu'il y a un mode pas à pas où l'on peut visionner le contenu des variables.
Il serait intéressant d'essayer.
Il serait intéressant d'essayer.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ben, pour moi il n'y a pas d'autres erreurs.
Un autre truc qui n'est pas ISO C89/90 est le mélange déclaration / code.
Mets : double moyenne; juste après double somme = 0;
Et du coup, tu mets simplement : moyenne=somme/tailleTab;
Sinon, recolle ton code dans un autre fichier, puis recompile.
Etrange...
Un autre truc qui n'est pas ISO C89/90 est le mélange déclaration / code.
Mets : double moyenne; juste après double somme = 0;
Et du coup, tu mets simplement : moyenne=somme/tailleTab;
Sinon, recolle ton code dans un autre fichier, puis recompile.
Etrange...
Bonjour
Je suis d'accord avec @fiddy ce pendant au lieu de faire
il est préférable d'utiliser les pointeurs donc
à bientôt
Toute connaissance est une réponse à une question.
Je suis d'accord avec @fiddy ce pendant au lieu de faire
double moyenneTab(int tab[], int tailletabbleau);
il est préférable d'utiliser les pointeurs donc
double moyenne(int *tab, int tailletableau);et ce qui donnerait comme code en général ceci
#include <stdio.h> #include <stdlib.h> #define Size_Tab(arg)(sizeof(arg)/sizeof(*arg)) int f_MoyenTab(int *ptrTab,int const size){ int i = 0; int ret = 0; /* Vérification * de la taille du tableau */ if(size <=0) return (0); while(i++ < size) ret += (*ptrTab++); return ( (ret/size) ); } int main(void){ int Tab[] = {1,2,3,4,5,6,7,8,9}; printf("Moyene\t= %d\n",f_MoyenTab(Tab,Size_Tab(Tab))); return (0); }
à bientôt
Toute connaissance est une réponse à une question.
Salut sambia39,
cette partie :
c'est bien vu, car cela permet de rejeter les entrées illégales, dont une qui ferait une division par zéro. Cela dit, je ne sais pas s'il faudrait retourner 0, car cela ne permettrait pas de distinguer une moyenne de 0 d'un code d'erreur. Si les notes négatives ne peuvent exister, retourner -1 pour signifier une erreur serait peut-être mieux.
et puisqu'on en est à parler de préférences de style, moi j'aime bien mettre un espace entre le if et la parenthèse qui contient l'expression testée (et des espaces entre les opérateurs), alors que je ne mets pas d'espaces entre l'identifiant de la fonction et la parenthèse qui contient ses paramètres éventuels.
Dal
cette partie :
/* Vérification * de la taille du tableau */ if (size <= 0) return (0);
c'est bien vu, car cela permet de rejeter les entrées illégales, dont une qui ferait une division par zéro. Cela dit, je ne sais pas s'il faudrait retourner 0, car cela ne permettrait pas de distinguer une moyenne de 0 d'un code d'erreur. Si les notes négatives ne peuvent exister, retourner -1 pour signifier une erreur serait peut-être mieux.
et puisqu'on en est à parler de préférences de style, moi j'aime bien mettre un espace entre le if et la parenthèse qui contient l'expression testée (et des espaces entre les opérateurs), alors que je ne mets pas d'espaces entre l'identifiant de la fonction et la parenthèse qui contient ses paramètres éventuels.
Dal
@Dal En réalité la fonction ne fait que rendre le résultat de la moyenne qui a été calculé c'est donc normal de renvoyer zéro qu'un code erreur car tout ce qui est zéro divisible par 1 ou 100 ben c'est zéro :)
Ceci dit je pourrais juste dans le cas où le renvoi de zéro gêne , évaluer le tableau avant de faire appel à la fonction mais bon c'est un choix.
Ceci dit je pourrais juste dans le cas où le renvoi de zéro gêne , évaluer le tableau avant de faire appel à la fonction mais bon c'est un choix.
Effectivement il marche pour vous ; j'ai remis le printf à la ligne, sans succès.
J'ai vérifié ligne par ligne, on a la même chose.
Heureusement que je n'en ai pas vraiment besoin et que j'apprends..
Ce qui est rassurant pour moi est que je n'ai pas fait de grosses fautes de code.
Bonne journée
(j'ai aussi appris le (double)taille, merci)
Inutile. somme est de type double. Donc tailleTab sera automatiquement convertit en double. somme/tailleTab; est donc correct.
Merci