【问题标题】:program that shows how to pay out change显示如何支付零钱的程序
【发布时间】:2014-11-22 13:40:51
【问题描述】:

我编写了以下代码来确定如何支付零钱:

#include<stdio.h>

#define twentyDollar 2000
#define tenDollar 1000
#define fiveDollar 500
#define oneDollar 100
#define quarters 25
#define dimes 10
#define nickels 5
#define pennies 1

int round(double change)
{
    return (int)(change + 0.5);

}

void main(void) {

int change, temp;
double cost, paid;


int numberOfTwentyDollar = 0;
int numberOfTenDollar = 0;
int numberOfFiveDollar = 0;
int numberOfOneDollar = 0;
int numberOfQuarters = 0;
int numberOfDimes = 0;
int numberOfNickels = 0;
int numberOfPennies = 0;

printf("Enter cost ($): ");
scanf("%lf", &cost);

printf("Enter amount tendered ($): ");
scanf("%lf", &paid);

change = round((paid - cost) * 100.0);

temp = change;

while (temp > 0) {
if (temp > twentyDollar)
{
    numberOfTwentyDollar = temp / twentyDollar;
    temp = temp % twentyDollar;
}

else if(temp > tenDollar)
{
    numberOfTenDollar = temp / tenDollar;
    temp = temp % tenDollar;
}

else if(temp > fiveDollar)
{
    numberOfFiveDollar = temp / fiveDollar;
    temp = temp % fiveDollar;
}

else if (temp > oneDollar)
{
    numberOfOneDollar = temp / oneDollar;
    temp = temp % oneDollar;
}

else if(temp > quarters)
{
    numberOfQuarters = temp / quarters;
    temp = temp % quarters;
}

else if(temp > dimes)
{
    numberOfDimes = temp / dimes;
    temp = temp % dimes;
}

else if(temp > nickels)
{
    numberOfNickels = temp / nickels;
    temp = temp % nickels;
}

else if(temp > pennies)
{
    numberOfPennies = temp / pennies;
    temp = temp % pennies;
}

}

printf("Change is $%.2d\n", change);

printf("$20 bills: %d\n", numberOfTwentyDollar);
printf("$10 bills: %d\n", numberOfTenDollar);
printf("$5 bills: %d\n", numberOfFiveDollar);
printf("$1 bills: %d\n", numberOfOneDollar);
printf("quarters: %d\n", numberOfQuarters);
printf("dimes: %d\n", numberOfDimes);
printf("nickels: %d\n", numberOfNickels);
printf("pennies: %d\n", numberOfPennies);
}

当我输入成本(23.18 美元)和投标金额(100.00 美元)的样本值时,输出都是正确的,但是显示的“更改”是 7682 美元,而假设是 76.82 美元。关于我做错了什么的任何指示?谢谢!

【问题讨论】:

  • 您在change = round((paid - cost) * 100.0); 处多次更改 100。如果您以后不撤消,那将是 100 太多。
  • 您使用change(然后是temp)来表示美分的数量,不是美元的数量!!!顺便说一句,对于“我已经编写了以下代码”这一说法,这个问题让人非常怀疑。就个人而言,我很难相信你是自己写的,最后问了这个问题(请不要冒犯)。
  • 有时人们会犯愚蠢的错误,或者在不应该出现的地方陷入困境。
  • 此外,我们得到了圆形原型以及用于设置更改的确切函数调用,因此得到某些东西并不得不使用它并不意味着我理解它。
  • 如果您的程序可以使用建议的简单修复,您可能希望编写一个替代版本不使用,使用类型double 并将其展示给执行此操作的人告诉你使用它。以及你为什么它应该工作得很好——如果不是更好的话。

标签: c pass-by-value


【解决方案1】:

关键问题是在打印(以美元为单位)时没有按比例缩放变化(以美分为单位)。

代码可以按照@user3121023 的建议将打印change 用作int,但这对否定change 有问题。

printf ("$%d.%02d\n", change/100, change%100);

或转换为double

printf("$%.2f\n", change/100.0);

财务代码存在许多问题,例如较弱的 ​​round(double change) 无法处理大值或负值,以及它偏向于四舍五入“中途”数字。 math.h 具有更好的 round() 功能。

另一个例子,交易的每个元素都应该进行四舍五入,并且可能和最终金额一样,

scanf("%lf", &cost);
cost = round(cost * 100.0);

scanf("%lf", &paid);
paid = round(paid * 100.0);

// change = round((paid - cost) * 100.0);
change = round(paid - cost);

建议将钱存放在 1 种而不是 2 种

int change, temp; 
double cost, paid;

使用int 有助于解决准确性问题,但在 I/O、范围和计算方面存在问题。

使用double 有助于范围和计算,但通常需要适当的舍入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 2021-10-15
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多