C语言 while-loop 中的错误不断计数超出条件



对于学校,我要编写一个C程序,该程序需要一定数量的现金,并返回达到该数量所需的最少数量的硬币。我不知道我做错了什么。我一直在调整和尝试各种不同的事情,但我似乎无法完全调试程序。

该程序对某些输入给出了正确的答案,但夸大了许多输入所需的硬币数量。

这是我到目前为止所拥有的。

#include <stdio.h>
int main()
{
float cash;
int n;
int counter=0;
int quarters=0;
int dimes=0;
int nickels=0;
int pennies=0;
for (;;)
{
printf("Enter change amount: ");
scanf("%f",&cash);
if (cash > 0)
{
break;
}
}
n = cash * 100; 
counter = 0;
while (n > 0)
{
while (n >= 25)
{
counter ++;
n = n - 25;
quarters ++;
printf("%in",n);
}
while (n >= 10 && n < 25)
{
counter ++;
n = n - 10;
dimes ++;
printf("%in",n);
}
while (n >= 5 && n < 10)
{
counter ++;
n = n - 1;
nickels++;
printf("%in",n);
}
while (n > 0 && n < 5)
{
counter ++;
n = n - 1;
pennies ++;
printf("%in",n);
}
}
printf("%dn",counter + n);
printf("%i quarters, %i dimes, %i nickels, %i penniesn", 
quarters, dimes, nickels, pennies); 
return 0;
}

我有点惊讶他们希望你使用中断来退出循环,因为你通常希望循环"自然"结束(并且您通常会为 switch 语句保存中断(。这样的东西应该可以工作,使用整数除法和模运算符(编辑注意:由于后者不准确,我使用两个整数而不是单个浮点数。如果知识渊博的人想展示如何使用浮点来做到这一点,那会很有趣。

#include <stdio.h>
int main() {
int dollar, cent;
int q = 0;
int d = 0;
int n = 0;
int p = 0;
int re;
printf("Enter amount: ");
scanf(" %d.%d", &dollar, &cent);
q = dollar * 4;        
re = cent;
q = q + (re / 25);
re = re % 25;
d = re / 10;
re = re % 10;
n = re / 5;
re = re % 5;
p = re;
printf("q %d d %d n %d p %dn", q, d, n, p);
return 0;
}

例如,如果您获得了秒数并希望从中找到 min:sec,则此方法也有效。如果你有 65 秒,你对分钟部分(即 1(执行 65/60,而秒部分只是除以 60 后的余数,即 65 % 60(即 5(。

这是一个更完整的答案,符合您一开始给我们的代码。 我将循环更改为减法/乘法,并修复了您将镍视为便士的错误。 你不再需要计数器变量了,但我把它留了下来。

#include <stdio.h>
int main()
{
float cash;
int n;
int counter=0;
int quarters=0;
int dimes=0;
int nickels=0;
int pennies=0;
for (;;)
{
printf("Enter change amount: ");
scanf("%f",&cash);
if (cash > 0)
{
break;
}
}
n = cash * 100; 
counter = 0;
if (n > 0)
{
quarters = (int)floor(n / 25);
n -= quarters*25;
printf( "%in", n );
dimes = (int)floor(n / 10);
n -= dimes*10;
printf("%in",n);
nickels = (int)floor(n / 5);
n -= nickels*5;
printf("%in",n);
pennies = n;
printf("%in",n);
}
printf("%i quarters, %i dimes, %i nickels, %i penniesn", 
quarters, dimes, nickels, pennies); 
return 0;
}

首先,尝试从抽象出如何处理一种类型的硬币开始:

int coinsNeeded( int amount, int coinAmount )
{
return (int) floor( amount / coinAmount );
}

然后,分别处理每个硬币:

quarters = coinsNeeded( cash, 25 );
cash -= (quarters * 25);

只需对您要考虑的每种类型的硬币重复此操作,然后在最后打印出信息。 关于是否要使用浮点存在一些分歧。 浮点确实有舍入误差,您在使用货币时要避免这些误差。 您实际需要的是定点数据类型,但我跑题了。 你可以通过按照你正在做的方式(乘以 100 并只处理便士(来接近足够近的距离。

最新更新