Fonction ne renvoie pas la bonne valeur avec certaine entrée.
vflo
-
fiddy Messages postés 11653 Statut Contributeur -
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
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
A voir également:
- Fonction ne renvoie pas la bonne valeur avec certaine entrée.
- Fonction si et - Guide
- Vers quelle adresse web renvoie ce lien - Guide
- Excel ne pas afficher #valeur ✓ - Forum Excel
- Cette valeur ne correspond pas aux restrictions de validation des données pour cette cellule ✓ - Forum MacOS
- Renvoie d'appel ooredoo ✓ - Forum Free mobile
2 réponses
Pour rappel:
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.
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:
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();
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>.
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>.