Fonction ne renvoie pas la bonne valeur avec certaine entrée.

Fermé
vflo - 24 nov. 2014 à 01:17
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 25 nov. 2014 à 14:01
Bonjour je débute en c et j'ai un petit problème :(

avec ce code,
les puissances sont affichés pour 2,3,4 mais dès que j'arrive à 5 j'ai un problème:
si je rentre 5, la valeur sortir sera: 3125,624,124,24,5.
Toute les valeurs comprises entre la première et la dernier sont soustraites de 1, Pourquoi?

ps: j'utilise codeblocks.
_______________________________________________

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int obtenir(int nombre);

void main(void)
{

int nombre= obtenir(nombre);
int nombre2=nombre;

while(nombre !=0)
{
int nombreC=pow(nombre2, nombre);
printf("afficher %d \n",nombreC);
nombre=nombre-1;
}

}

int obtenir(int nombre)
{
printf("introduisez un nombre supperieur ou egal a 1...\n");
scanf("%d",&nombre);

while(nombre < 1 )
{
printf("Reintroduisez un nombre...");
scanf("%d",&nombre);

}
return nombre;
}
_______________________________________________

Merci d'avance

2 réponses

productif Messages postés 39 Date d'inscription mardi 8 mars 2011 Statut Membre Dernière intervention 9 février 2017 20
25 nov. 2014 à 12:36
Pour rappel:

double pow(double x, double y);


La probable raison des valeurs erronées est que la fonction pow renvoie un double mais la valeur renvoyée est stockée dans un int (nombreC); il y a une conversion implicite de double vers int et c'est probablement la cause du problème.

Pour bien faire, il faudrait utiliser la fonction lround qui arrondit correctement un double vers un int.

long lround(double x);


Pour faire encore mieux, quand on ne manipule que des int, on n'utiliserait probablement pas la fonction pow; on calculerait les puissances par multiplications successives. Mais ça devient plus compliqué...

Aussi, la fonction obtenir n'a pas besoin de paramètre, elle devrait plutôt être déclarée ainsi:

int obtenir();
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 nov. 2014 à 14:01
Bonjour,

int obtenir(int nombre);
Tu n'as pas besoin de paramètre. Plutôt : int obtenir(void);

Donc au lieu de :
</ital>int nombre= obtenir(nombre);
int nombre2=nombre; </ital>
Tu auras simplement : int nombre2=obtenir();
Pourquoi passer par nombre et nombre2 ? Cela rend la lecture du code plus difficile...

void main(void)
Non standard. Le bon prototype du main() sans argument est :
int main(void)
Il ne faut donc pas oublier aussi le "return 0;" final.

int nombreC=pow(nombre2, nombre);
pow() renvoie un double. Je te conseille de plutôt faire ta propre fonction de multiplication. Ca sera plus précis si tu travailles sur des entiers. Dans ce cas, plus besoin de #include <math.h>.

0