Programme retournant inf?

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.)