模块化硬币兑换程序逻辑

我对这个程序的目的是告诉每个面额应该给客户多少硬币,假设输入是5-95。

我已经用最好的模块化forms编写了我的程序,它似乎正在工作。 但是,该程序显示每个面额为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); } 

GetChange()返回用户的输入,但您没有保存调用的结果。 你要

 input = GetChange(); 

函数具有输入(参数),输出(返回值以及可能由指针传递的参数)以及从输入生成输出的算法。

有时function并不像你的PrintDisplay那样有输入或输出。 如果您使代码更具可读性/更好地组织,这通常是可以的。 你的函数是超级的,因为你为一个简单的一行语句创建了一个函数(有四行)。 本质上并不坏但是超级丰富。

返回值“出现”在进行函数调用的位置。 所以,如果你这样做

 input = GetChange(); 

input将设置为GetChange的返回值。

你在Daves回答之后解决了这个问题,但没看到你的所有Get...函数都有一个你在代码中忽略的返回值。

因此,通过修复所有这些代码应该可以工作(或者看不到编辑)。

您的所有function( 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 }