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

vflo -  
fiddy Messages postés 11653 Statut Contributeur -
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 Statut Membre 20
 
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 11653 Statut Contributeur 1 847
 
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