我对这个程序的目的是告诉客户假设输入数是5-95,应该给每个面额多少钱币。
我已经用最好的模块化形式编写了我的程序,它似乎正在工作。但是,该程序显示每个面额为0。
有什么问题?
void PrintDisplay(void)
{
printf("Enter an amount to calculate change: ");
return;
}
int GetChange(void)
{
int change;
scanf("%d%*c", &change);
return(change);
}
int GetCoins(int cents, int coin)
{
int quantity;
quantity = cents / coin;
return(quantity);
}
int GetNewChange(int cents, int coin)
{
int newchange;
newchange = cents - coin;
return(newchange);
}
void PrintResult(int fifties, int twenties, int tens, int fives)
{
printf("The amount of each coin denomination you should give are: \n");
printf("Fifty cent coins: %d \n", fifties);
printf("Twenty cent coins: %d \n", twenties);
printf("Ten cent coins: %d \n", tens);
printf("Five cent coins: %d \n", fives);
return;
}
int main(int input)
{
int FiftyCentAmount;
int TwentyCentAmount;
int TenCentAmount;
int FiveCentAmount;
PrintDisplay();
GetChange();
FiftyCentAmount = GetCoins(input, 50);
GetNewChange(input, 50);
TwentyCentAmount = GetCoins(input, 20);
GetNewChange(input, 20);
TenCentAmount = GetCoins(input, 10);
GetNewChange(input, 10);
FiveCentAmount = GetCoins(input, 5);
GetNewChange(input, 5);
PrintResult(FiftyCentAmount, TwentyCentAmount, TenCentAmount, FiveCentAmount);
system("pause");
return(0);
}
答案 0 :(得分:4)
一个函数有一个输入(参数),一个输出(返回值和可能由指针传递的参数)和一个从输入生成输出的算法。
有时功能并不像你的超级PrintDisplay
那样有输入或输出。如果您使代码更具可读性/更好地组织,这通常是可以的。你的函数是超级的,因为你为一个简单的一行语句创建了一个函数(有四行)。不是天生就是坏但是超级丰富。
返回值“出现”在进行函数调用的位置。所以,如果你这样做
input = GetChange();
input
将设置为GetChange
的返回值。
你在Daves回答之后解决了这个问题,但没看到你的所有Get...
函数都有一个你在代码中忽略的返回值。
因此,通过修复所有代码,您的代码应该可以工作(或者看不到编辑)。
您的所有功能(PrintResult
除外)和textinput都基本上都是oneliner。并且
他们减少到
int GetCoins(int cents, int coin)
{
return cents / coin;
}
int GetNewChange(int cents, int coin)
{
return cents - coin;
}
因此,改进的程序(在您的设计中)将如下所示:
int main()
{
int leftover_change;
printf("Enter an amount to calculate change: ");
leftover_change= GetChange();
int FiftyCentAmount = GetCoins(leftover_change, 50);
leftover_change = GetNewChange(leftover_change, 50);
int TwentyCentAmount = GetCoins(leftover_change, 20);
leftover_change = GetNewChange(leftover_change, 20);
int TenCentAmount = GetCoins(leftover_change, 10);
leftover_change = GetNewChange(leftover_change, 10);
int FiveCentAmount = GetCoins(leftover_change, 5);
leftover_change = GetNewChange(leftover_change, 5);
PrintResult(FiftyCentAmount, TwentyCentAmount, TenCentAmount, FiveCentAmount);
if(leftover_change >0)
{
printf("there are %d cents left\n", leftover_change);
}
system("pause");
return 0;
}
这仍然违反DRY概念(不要重复自己)你可以通过用定义或const变量替换魔术数来解决这个问题(至少部分)。
更好的是循环遍历不同的硬币。但这需要更多思考和使用数组。
编辑:我没有首先检查算法,我的scanf
缩减是废话,但我很匆忙所以这里有一个有效的版本。为了使这个答案完整,但正如Dave所说,你应该在实现它之前检查你的算法。
int GetNewChange(int cents, int coin)
{
return cents % coin; //this is the modulus operator
}
答案 1 :(得分:3)
GetChange()返回用户的输入,但您不能保存通话结果。你想要
input = GetChange();