试图解决这个问题的时间已经无处可寻。我不明白为什么镍的整数值如此之高?
请输入$ xx.xx格式的欠款:$ 10.73 1073 季度:42,余数:23 硬币:2,余数:3 镍币:4195856,余数:3 便士:3
#include <stdio.h>
#include <math.h>
int main ()
{
float userinput;
int cents, count, quarters, dimes, nickels, pennies, remainder;
printf("Please enter amount of change owed in $xx.xx format: $");
scanf("%f",&userinput);
while ((userinput <= 0) || (userinput < 0.01))
{
printf("Please enter a value equal to or greater than $0.01: $");
scanf("%f",&userinput);
}
cents = roundf(userinput * 100);
printf("%d\n", cents);
while ((cents / 25) >= 1) {
quarters = cents / 25;
remainder = cents % 25;
break;
}
printf("Quarters: %d, remainder: %d\n", quarters, remainder);
while ((remainder / 10) >= 1) {
dimes = remainder / 10;
remainder = remainder % 10;
break;
}
printf("dimes: %d, remainder: %d\n", dimes, remainder);
while ((remainder / 5) >= 1) {
nickels = remainder / 5;
remainder = remainder % 5;
break;
}
printf("nickels: %d, remainder: %d\n", nickels, remainder);
while ((remainder / 1) >= 1) {
pennies = remainder / 1;
break;
}
printf("pennies: %d\n", pennies);
}
答案 0 :(得分:5)
您需要初始化变量。
while ((remainder / 5) >= 1) { // If "(remainder / 5) >= 1" is false
nickels = remainder / 5; // nickles is never set
remainder = remainder % 5;
break;
}
printf("nickels: %d, remainder: %d\n", nickels, remainder); // Use of uninitialized value -> UB
所以尽量做到:
int cents=0, count=0, quarters=0, dimes=0, nickels=0, pennies=0, remainder=0;
一般来说,我认为您应该使用if
代替while
int nickels = 0;
....
....
if ((remainder / 5) >= 1) {
nickels = remainder / 5;
remainder = remainder % 5;
}
BTW:使用scanf
时,请务必检查返回值。
答案 1 :(得分:2)
未明确初始化的自动变量不会自动初始化为零。
待办事项
int nickels = 0; // similary for other variables too.
否则你可能会得到garbage value
- 提供的nickels
未在途中设置 - 这可能非常高:)
答案 2 :(得分:0)
原因是您没有初始化变量“nickeles”。 所以“nickels”的初始值是范围超过int值。 “余数”也小于5,所以这个仪器跳过了。 所以“镍币”的价值仍然没有改变。 但是你将“nickels”的值打印到int类型。
printf("nickels: %d, remainder: %d\n", nickels, remainder);
所以“镍币”的价值是4195856。
如果您打印正确的“镍币”值,则必须初始化“镍币”的值。
int nickels = 0;
我建议您在编码时初始化c / c ++中的所有值。
我希望这会有所帮助。