Je pense que l’erreur réside dans cette ligne:
float bmi = weight * 703 / pow(height, 2.0); // user inputs weight and height and the bmi should be calculated.
Le fait est que j’ai créé une sorte de programme factice avec les valeurs déjà insérées et que tout allait bien. Mais lorsque j’utilise scanf () pour que l’utilisateur mette ces mêmes valeurs, cela ne fonctionne pas.
#include #include int main () { float weight = 105, height = 63; float bmi; bmi = weight * 703 / pow(height, 2.0); printf("%f\n", bmi); }
Le poids et la taille sont des flotteurs. Lorsque j’essaie d’imprimer le bmi, je reçois “inf.”
** Modifié pour afficher la fonction d’entrée et la déclaration d’impression.
printf("Weight? "); scanf("%f", &weight); printf("BMI is %.2f.\n", bmi);
L’autre déclaration d’entrée est essentiellement la même, le mot hauteur remplaçant poids.
edit: Voici le code complet
#include #include int main () { float weight, height; float bmi = weight * 703 / pow(height, 2.0); printf("Height? "); scanf("%f", &height); printf("Weight? "); scanf("%f", &weight); printf("Your BMI is calculated at %.2f.\n", bmi); printf("%f\n", height); printf("%f\n", weight); }
Vous utilisez un weight
et une height
non initialisés dans:
float weight, height; float bmi = weight * 703 / pow(height, 2.0);
C’est un comportement indéfini et c’est la raison pour laquelle vous obtenez inf
. Dans mon cas, j’ai 0.00
, mais tout peut arriver sous UB.
Changer en
#include #include int main(void) { float weight, height; float bmi; printf("Height? "); scanf("%f", &height); printf("Weight? "); scanf("%f", &weight); bmi = weight * 703 / pow(height, 2.0); printf("Your BMI is calculated at %.2f.\n", bmi); printf("%f\n", height); printf("%f\n", weight); return 0; }
Vous devez initialiser vos variables avant de les utiliser.
int main () { float weight, height; float bmi; printf("Height? "); scanf("%f", &height); printf("Weight? "); scanf("%f", &weight); bmi = weight * 703 / pow(height, 2.0); printf("Your BMI is calculated at %.2f.\n", bmi); printf("%f\n", height); printf("%f\n", weight); }
float weight, height; float bmi = weight * 703 / pow(height, 2.0);
Je pense que vous supposez que cela définit la signification de bmi
et que la valeur de bmi
changera avec le changement de weight
et de height
.
Je me souviens d’avoir fait une erreur similaire quand j’ai commencé à programmer. Contrairement aux équations mathématiques, les instructions en C sont exécutées dans l’ordre. Vous apprendrez bientôt comment affecter cet ordre, mais pour un petit programme comme celui-ci, les instructions sont exécutées de manière linéaire.
Une initialisation agit comme une assignation. Ce:
float bmi = weight * 703 / pow(height, 2.0);
fait la même chose que ça:
float bmi; bmi = weight * 703 / pow(height, 2.0);
Il définit la valeur de bmi
sur le résultat de l’expression au moment de son évaluation . Comme vous n’avez pas encore atsortingbué de valeur au weight
ni à la height
, leurs valeurs sont garbage et le résultat de l’expression atsortingbuée à bmi
est également garbage. Vous imprimez cette valeur de mémoire inchangée ultérieurement.
Si vous souhaitez que bmi
soit évalué lorsque vous vous référez plutôt que lorsque vous le définissez, vous pouvez en faire une fonction – mais ce n’est pas nécessaire dans ce cas. Au lieu de cela, assurez-vous simplement que la valeur que vous affectez à bmi
est valide, ce qui signifie qu’elle doit être calculée une fois que vous avez affecté des valeurs à la width
et à la height
.
Abandonnez l’initialisation lors de la déclaration de bmi
et ajoutez une affectation équivalente après que les valeurs valides ont été stockées en width
et en hauteur »:
float weight, height; float bmi; /* remove initializer */ printf("Height? "); scanf("%f", &height); printf("Weight? "); scanf("%f", &weight); /* add an assignment here */ bmi = weight * 703 / pow(height, 2.0);
Comme quelqu’un l’a suggéré, vous pouvez également déplacer la déclaration et l’initialisation plus tard dans le programme. (Les versions précédentes de C avaient des ressortingctions qui rendaient cela difficile, et certains compilateurs pourraient ne pas le supporter.)