目标:
实施一个程序,计算给用户更改所需的最小硬币数。
问题:
程序无法正常执行。我很确定我的问题本质上是合乎逻辑的,但也可能是因为我没有正确的格式化经验。
额外的信息:
我在代码中添加了一个print函数来确定问题所在。 “test1”是广播,“test2”不是。
我正在使用cs50.h库本地的一些函数:
请不要为我修复我的代码!我需要学会自己这样做。我只是需要帮助找到我的逻辑错误或格式错误。是的,我知道它效率不高。
我正在寻找的例子:
代码演练:
程序从用户获得2个浮点值,'金额'和'成本'。 “金额”是指客户提供的金额,“成本”是项目的成本。
程序找到'金额 - 成本'来确定欠多少变化。该值存储在'diff'中。
程序从'diff'中减去0.25,并将1加到变量'quarter'。
程序从'diff'减去0.10并将1加到变量'dime'。
...
程序打印需要使用多少宿舍,尺寸,镍,便士,以最有效的方式为客户提供更改。
假设只能使用硬币。
码:
#include <stdio.h>
#include <cs50.h>
int main()
{
float cost;
do
{
printf("How much did it cost?\n");
cost = get_float();
}
while (cost < 0);
float amount;
do
{
printf("How much did you pay?\n");
amount = get_float();
}
while (amount < cost);
int quarter = 0;
int dime = 0;
int nickel = 0;
int penny = 0;
float diff = amount - cost;
do
{
while (diff >= 0.25)
{
diff = diff - .25;
quarter++;
}
printf("test1");
while (.10 <= diff < .25)
{
diff = diff - 0.10;
dime++;
}
printf("test2");
while (0.05 <= diff < .10)
{
diff = diff - 0.05;
nickel++;
}
while (0.01 < diff < 0.05)
{
diff = diff - 0.01;
penny++;
}
while (diff == 0.01)
{
penny++;
diff = 0;
}
} // end bracket for do function
while (diff > 0);
if (diff == 0)
{
printf("Your change consists of:\n");
printf("%i quarters.\n", quarter);
printf("%i dimes.\n", dime);
printf("%i nickels.\n", nickel);
printf("%i pennies.\n", penny);
exit(0);
}
if (diff < 0)
{
printf("Your change consists of:\n");
printf("%i quarters.\n", quarter);
printf("%i dimes.\n", dime);
printf("%i nickels.\n", nickel);
printf("%i pennies.\n", penny);
exit(0);
}
} // end bracket for int main
预期结果:
程序如前所述工作。
实际结果:
程序没有完全执行。 'test1'是广播,'test2'不是。
首先,你需要检查accuracy for floating point arithmetic。
那说,声明就好
while (.10 <= diff < .25)
没有做你认为他们做的事。使用您在C中使用的方法不可能链接关系运算符。
你需要使用&&
运算符将它们耦合起来
while (.10 <= diff && diff < .25) {
麻烦在于像0.05 <= diff < .10
这样的比较与0.05 <= diff && diff < .10
不同。后者做你想要的,前者比较0或1到.10。如果diff大于0.05,则'0.05 <= diff'评估为1,然后将其与.10进行比较。你写的和(0.05 <= diff) < .10
一样。
首先,你的循环是永恒的。而(金额<成本); < - 金额和成本永远不会改变。所以...
其次,你不能写出像(1 <= 2 <3)这样的条件,它并不意味着你认为它意味着什么。它单独执行运算符,因此您最终得到的东西类似于(1 <= 2)<3,第一个是1(真)或0(假)。