当我尝试运行代码时,结果是:
$ ./prueba
Your change is...0.41
your cents is 41
prueba.c:20:19: runtime error: signed integer overflow: -2147483634 - 25 cannot be represented in type 'int'
我不了解整数的错误以及如何解决它,我需要把钱作为浮点数,并计算需要支付的美分,因此我将浮点数乘以x100,然后尝试四舍五入,但不知道为什么不起作用,我的代码是:
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void)
{
float cash;
do
{
cash = get_float("Your change is...");
}
while (cash <= -1);
cash = cash * (100);
int cents = roundf(cash);
int coins = 0;
printf("your cents is %i\n",cents);
do{
cents = cents - 25;
coins++;
}
while(cents < 24);
do{
cents = cents - 10;
coins++;
}
while( 25 > cents && cents < 9);
do{
cents = cents - 5;
coins++;
}
while ( 5 > cents && cents < 2);
do{
cents = cents - 1;
coins++;
}
while ( 4 >= cents && cents <=1);
printf("Your change is %i coins\n",coins);
}
顺便说一句,这是CS50第1周现金的“轻松”项目,谢谢您的帮助。
答案 0 :(得分:0)
这是错误的:
do{
cents = cents - 25;
coins++;
}
while(cents < 24);
这就是所谓的“底部测试的循环”,这意味着仅在循环体至少评估了一次之后才检查条件。 (测试在循环的底部或末端。)
这对您意味着什么,即使金额少于25美分,您也无条件评估cents = cents - 25
。这是不正确的,因为它会使cents
变成负数!您需要一个经过最高测试的循环,该循环检查是否已完全进入循环。简而言之,do-while循环需要替换为while循环。
但这不是唯一的问题。进入循环的条件不正确。只要数量大于或等于25,就应该输入循环。如果数量小于24,则进入循环是完全错误的。
最后,您可能需要为每种硬币单独计数。