Petite erreur à trouver

Résolu/Fermé
Maxcocatrix Messages postés 88 Date d'inscription dimanche 24 juin 2012 Statut Membre Dernière intervention 30 octobre 2014 - Modifié par Maxcocatrix le 26/06/2014 à 13:45
Maxcocatrix Messages postés 88 Date d'inscription dimanche 24 juin 2012 Statut Membre Dernière intervention 30 octobre 2014 - 14 oct. 2014 à 16:02
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

6 réponses

Dosman Messages postés 1444 Date d'inscription mardi 1 mai 2012 Statut Contributeur Dernière intervention 26 septembre 2017 213
Modifié par Dosman le 26/06/2014 à 13:15
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 !"
0
Maxcocatrix Messages postés 88 Date d'inscription dimanche 24 juin 2012 Statut Membre Dernière intervention 30 octobre 2014
26 juin 2014 à 13:44
Merci de l'avoir testé.
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)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 juin 2014 à 14:03
double moyenne = (somme/(double)tailleTab)
Inutile. somme est de type double. Donc tailleTab sera automatiquement convertit en double. somme/tailleTab; est donc correct.
0
Maxcocatrix Messages postés 88 Date d'inscription dimanche 24 juin 2012 Statut Membre Dernière intervention 30 octobre 2014
26 juin 2014 à 14:05
Oui c'est ce qui me semblait, ça affichait déjà un type double.
Merci
0
Maxcocatrix Messages postés 88 Date d'inscription dimanche 24 juin 2012 Statut Membre Dernière intervention 30 octobre 2014
26 juin 2014 à 14:10
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 juin 2014 à 14:11
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 :
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,
0
Maxcocatrix Messages postés 88 Date d'inscription dimanche 24 juin 2012 Statut Membre Dernière intervention 30 octobre 2014
Modifié par Maxcocatrix le 26/06/2014 à 14:20
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
0
Dosman Messages postés 1444 Date d'inscription mardi 1 mai 2012 Statut Contributeur Dernière intervention 26 septembre 2017 213
26 juin 2014 à 14:47
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 juin 2014 à 17:52
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...
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 27/06/2014 à 10:50
Bonjour
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
27 juin 2014 à 11:05
il est préférable d'utiliser les pointeurs donc
C'est exactement pareil. int tab[] c'est kif kif avec int *tab dans ce contexte.
Donc c'est selon ses préférences :-).

return (0);
Pourquoi mettre des parenthèses autour de 0 dans le return ? Ce n'est pas une fonction ;-).
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
27 juin 2014 à 11:36
oui trouve que ça marque une pertinence d'observation un peut comme
return (EXIT_SUCCESS);
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 27/06/2014 à 13:53
Salut sambia39,

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
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 27/06/2014 à 15:42
@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.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
27 juin 2014 à 15:22
heu... un petit break s'impose :-)
0