模块化硬币兑换程序逻辑[澳大利亚货币]

时间:2018-05-16 13:47:57

标签: c

我对这个程序的目的是告诉客户假设输入数是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);
}

2 个答案:

答案 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();