对于学校,我要写一个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("%i\n",n);
}
while (n >= 10 && n < 25)
{
counter ++;
n = n - 10;
dimes ++;
printf("%i\n",n);
}
while (n >= 5 && n < 10)
{
counter ++;
n = n - 1;
nickels++;
printf("%i\n",n);
}
while (n > 0 && n < 5)
{
counter ++;
n = n - 1;
pennies ++;
printf("%i\n",n);
}
}
printf("%d\n",counter + n);
printf("%i quarters, %i dimes, %i nickels, %i pennies\n",
quarters, dimes, nickels, pennies);
return 0;
}
答案 0 :(得分:1)
我有点惊讶他们希望你使用break来退出循环,因为你通常希望循环“自然地”结束(你通常会为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, ¢);
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 %d\n", q, d, n, p);
return 0;
}
例如,如果您给出秒数并想要从中找到min:sec,则此方法也有效。如果给你65秒,那么你的分钟部分是65/60(这是1),而秒部分就是你除以60或65%60(即5)之后的余数。
答案 1 :(得分:0)
这是一个更完整的答案,符合您给我们开始的代码。我将循环更改为减法/乘法并修复了您将镍币视为便士的错误。你不再需要计数器变量,但我把它留在了。
#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( "%i\n", n );
dimes = (int)floor(n / 10);
n -= dimes*10;
printf("%i\n",n);
nickels = (int)floor(n / 5);
n -= nickels*5;
printf("%i\n",n);
pennies = n;
printf("%i\n",n);
}
printf("%i quarters, %i dimes, %i nickels, %i pennies\n",
quarters, dimes, nickels, pennies);
return 0;
}
答案 2 :(得分:-1)
首先,尝试从抽象出如何处理一种类型的硬币开始:
int coinsNeeded( int amount, int coinAmount )
{
return (int) floor( amount / coinAmount );
}
然后,分开处理每个硬币:
quarters = coinsNeeded( cash, 25 );
cash -= (quarters * 25);
请为您想要考虑的每种类型的硬币重复一遍,然后在最后打印出信息。关于是否要使用浮点存在一些分歧。浮点确实存在使用金钱时要避免的舍入错误。你真正需要的是一个定点数据类型,但我离题了。你可以按照你的方式做到足够接近(乘以100,只需要处理便士)。