向客户分发零钱的程序。 (C)
Program that distributes change to customers. (C)
目标:
实现一个程序,计算给用户零钱所需的最少硬币数。
问题:
程序没有正确执行。我相当确定我的问题本质上是合乎逻辑的,但也可能是由于我对正确格式化缺乏经验所致。
补充信息:
我在代码中添加了打印功能以确定问题出在哪里。 "test1"是广播,"test2"不是。
我正在使用 cs50.h 库的一些本地函数:
- get_float(); - 从用户那里获取一个浮点值并存储它。
请不要帮我修复我的代码!我需要学会自己做。我只需要帮助找出我的逻辑错误或格式错误。是的,我知道效率不高。
我正在寻找的示例:
"Your issue is in line X, your values make it so that VARIABLE never reaches 0."
"In C, you can't format '( x < 0 );' - you have to say '(x<0);'."
代码演练:
程序从用户那里获得 2 个浮点值,'amount' 和 'cost'。 'amount'是客户给了多少钱,'cost'是商品的成本。
程序找到 'amount - cost' 以确定欠了多少零钱。此值存储在 'diff'.
程序从 'diff' 中减去 0.25 并将变量 'quarter' 加 1。
程序从 'diff' 中减去 0.10 并将变量 'dime' 加 1。
...
程序打印需要使用多少 25 美分、10 美分、5 美分、1 美分,以尽可能最有效的方式为客户找零。
假设只能使用硬币。
代码:
#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(假)。
目标:
实现一个程序,计算给用户零钱所需的最少硬币数。
问题:
程序没有正确执行。我相当确定我的问题本质上是合乎逻辑的,但也可能是由于我对正确格式化缺乏经验所致。
补充信息:
我在代码中添加了打印功能以确定问题出在哪里。 "test1"是广播,"test2"不是。
我正在使用 cs50.h 库的一些本地函数:
- get_float(); - 从用户那里获取一个浮点值并存储它。
请不要帮我修复我的代码!我需要学会自己做。我只需要帮助找出我的逻辑错误或格式错误。是的,我知道效率不高。
我正在寻找的示例:
"Your issue is in line X, your values make it so that VARIABLE never reaches 0."
"In C, you can't format '( x < 0 );' - you have to say '(x<0);'."
代码演练:
程序从用户那里获得 2 个浮点值,'amount' 和 'cost'。 'amount'是客户给了多少钱,'cost'是商品的成本。
程序找到 'amount - cost' 以确定欠了多少零钱。此值存储在 'diff'.
程序从 'diff' 中减去 0.25 并将变量 'quarter' 加 1。
程序从 'diff' 中减去 0.10 并将变量 'dime' 加 1。
...
程序打印需要使用多少 25 美分、10 美分、5 美分、1 美分,以尽可能最有效的方式为客户找零。
假设只能使用硬币。
代码:
#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(假)。