C程序用while循环计算硬币
C program counting coins with while loops
我看到很多人提到这个特定的 C 程序,尽管形式有所不同。但是,我似乎无法确定问题的根源,也无法找到其他有帮助的答案。除了一个输入:4.2
之外,程序可以正确编译甚至执行
除了 4.2 之外,该程序似乎在计算进行找零所需的最小硬币数。它输出 22 而不是它应该输出的 18(16 个 25 美分,2 个角钱)。
有什么想法吗?我正在旁听在线课程,没有 credit/no 学术不端问题。
#include <stdio.h>
#include <cs50.h>
int main(void)
{
//quarters, dimes, nickels, and total number of coins. a is float input for exact change.
float a;
int q=0;
int d=0;
int n=0;
int p=0;
int i;
//petitioning input
do
{
printf("Hello, how much change do I owe you?\n");
a = GetFloat();
}
while(a<=0);
//converting float a to an integer i
i= a*100;
//four 'while' loops checking quarters nickels dimes pennies and adding to coin count while
while(i>=25)
{
i=i-25;
q++;
}
while(i>=10 && i<25)
{
i=i-10;
d++;
}
while(i>=5 && i<10)
{
i=i-5;
n++;
}
while(i>0 && i<5)
{
i= i-1;
p++;
}
//printing sum of each coin type
{
printf("%d\n", q+d+n+p);
}
return 0;
}
许多数字无法用浮点数正确表示。 4.2 可能存储为 4.19999999 或类似的东西。
从浮点数到整数的转换不正确,可能会导致舍入错误:
//converting float a to an integer i
i= a*100;
在您的情况下,数字 4.2 变为 419 美分。
改为:
//converting float a to an integer i
i= a*100 + 0.5f;
有关更多信息,请阅读以下文章:
What Every Computer Scientist Should Know About Floating-Point Arithmetic, by David Goldberg
我不知道 GetFloat()
是什么,但您必须考虑 4.2
的浮点表示将是 4.19999981
。
你可以测试它添加 printf("a=%.8f", a);
然后当你 "convert" float 到 int 时 i
的值将是 419
.
计算硬币的代码运行良好,是您输入的不是您认为的那样。
THIS 可以帮助您更好地理解 float 到 int 的转换。
您刚刚被 floating point precision 盗版了。
你声明了
float a;
所以,当
a = 4.2; // say
看起来像
a = 4.19999981
因此,i= a*100;
被分配 419
到 i
而不是 420
(您所期望的)。
解 你需要convert float a
into integer:
(int)(x + 0.5)
所以,而不是 i= a*100
试试
i= a*100 + .5;
我看到很多人提到这个特定的 C 程序,尽管形式有所不同。但是,我似乎无法确定问题的根源,也无法找到其他有帮助的答案。除了一个输入:4.2
之外,程序可以正确编译甚至执行除了 4.2 之外,该程序似乎在计算进行找零所需的最小硬币数。它输出 22 而不是它应该输出的 18(16 个 25 美分,2 个角钱)。 有什么想法吗?我正在旁听在线课程,没有 credit/no 学术不端问题。
#include <stdio.h>
#include <cs50.h>
int main(void)
{
//quarters, dimes, nickels, and total number of coins. a is float input for exact change.
float a;
int q=0;
int d=0;
int n=0;
int p=0;
int i;
//petitioning input
do
{
printf("Hello, how much change do I owe you?\n");
a = GetFloat();
}
while(a<=0);
//converting float a to an integer i
i= a*100;
//four 'while' loops checking quarters nickels dimes pennies and adding to coin count while
while(i>=25)
{
i=i-25;
q++;
}
while(i>=10 && i<25)
{
i=i-10;
d++;
}
while(i>=5 && i<10)
{
i=i-5;
n++;
}
while(i>0 && i<5)
{
i= i-1;
p++;
}
//printing sum of each coin type
{
printf("%d\n", q+d+n+p);
}
return 0;
}
许多数字无法用浮点数正确表示。 4.2 可能存储为 4.19999999 或类似的东西。
从浮点数到整数的转换不正确,可能会导致舍入错误:
//converting float a to an integer i
i= a*100;
在您的情况下,数字 4.2 变为 419 美分。
改为:
//converting float a to an integer i
i= a*100 + 0.5f;
有关更多信息,请阅读以下文章:
What Every Computer Scientist Should Know About Floating-Point Arithmetic, by David Goldberg
我不知道 GetFloat()
是什么,但您必须考虑 4.2
的浮点表示将是 4.19999981
。
你可以测试它添加 printf("a=%.8f", a);
然后当你 "convert" float 到 int 时 i
的值将是 419
.
计算硬币的代码运行良好,是您输入的不是您认为的那样。
THIS 可以帮助您更好地理解 float 到 int 的转换。
您刚刚被 floating point precision 盗版了。
你声明了
float a;
所以,当
a = 4.2; // say
看起来像
a = 4.19999981
因此,i= a*100;
被分配 419
到 i
而不是 420
(您所期望的)。
解 你需要convert float a
into integer:
(int)(x + 0.5)
所以,而不是 i= a*100
试试
i= a*100 + .5;