计算给定数量变化的硬币面额的程序

时间:2014-09-26 06:39:14

标签: c++

我应该创建一个(一个函数)程序来计算给定量变化的硬币面额。

不知怎的,我没有得到正确显示的硬币/四分之一等数,它只给了我00000.我做错了什么?

这是我的代码:

#include <iostream>

using namespace std;

const int DOLLAR = 100;
const int QUARTER = 25;
const int DIME = 10;
const int NICKEL = 5;
const int PENNY = 1;

void getChange (double &money, int &value);
int change(double &money, int value);

int main()
{
    double money;
    int value;

    getChange (money, value);


    int numDollar = change(money, DOLLAR);

    int numQuarter = change(money, QUARTER);

    int numDime = change(money, DIME);

    int numNickel = change(money, NICKEL);

    int numPenny = change(money, PENNY);


    cout << numDollar << endl;
    cout << numQuarter <<endl;
    cout << numDime <<endl;
    cout << numNickel <<endl;
    cout << numPenny <<endl;
    cout << value <<endl;



}

void getChange (double &money, int &value)
{
    cin >> money;
    value = static_cast<double>(money) * 100;

}


int change(double &money, int value)
{
    int numDollar, numQuarter, numDime, numNickel, numPenny;

    while(value>100)
        numDollar = value / DOLLAR;
    money = value - (numDollar*DOLLAR);

    numQuarter = money / QUARTER;
    money = money - (numQuarter*QUARTER);

    numDime = money / DIME;
    money = money - (numDime*DIME);

    numNickel = money / NICKEL;
    money = money - (numNickel*NICKEL);

    numPenny = money / PENNY;
    money = money - (numPenny*PENNY);

    return money;

}

1 个答案:

答案 0 :(得分:0)

尝试逐步执行您的程序,您会注意到change()始终返回0,因此输出正确,但功能显然不是。

考虑函数返回的内容以及它应该返回的内容。另请注意,您正在传递引用,因此无论您在money内对change()所做的任何操作,都会在函数范围之外持续存在。

由于您希望change()返回硬币数量,您很可能希望它返回金额除以当前硬币的价值。


除非你真的陷入困境,否则不要读过这一行,但即便如此,也要先尝试自己解决这个问题! 如果你不能,请阅读一步一步地再考虑一下等等。

让我们快速浏览一下change()的实现:

while(value>100)
    numDollar = value / DOLLAR;

这在这里没有多大意义。 value将保留当前硬币的价值,但你却试图用它做一些计算。由于value在此循环内没有改变,因此您基本上创建了一个无限循环。未输入,因为value现在永远不会超过100(因为DOLLAR100)是传递的最大值。

numQuarter = money / QUARTER;    money = money - (numQuarter * QUARTER);

这将正确计算季度数并计算余数。但是,这不是你应该在这里做的,因为实际的硬币value是由参数决定的。

最后,但并非最不重要的是,你得到了你的回复声明:

return money;

如果一切按预期工作(假设当前实施是预期的;即计算所有硬币计数),那么现在的钱应该是0,这将被返回。


“编程”的一个重要部分实际上是关于能够采取一些想法然后将其转换为某种代码结构。这不是要知道某些命名空间或头文件中的所有可能功能(你总能看到它们)。它是关于能够写下概念和想法并理解它们,如果由其他人写的话。如果您愿意,可以使用以下代码获取灵感,但除非您真正理解每一行的作用,否则不要继续。


这是我快速而又肮脏的解决方案。没有错误处理等等,但它似乎正常工作:

#include <iostream>

const unsigned int DOLLAR  = 100;
const unsigned int QUARTER =  25;
const unsigned int DIME    =  10;
const unsigned int NICKEL  =   5;
const unsigned int PENNY   =   1;

unsigned int change(unsigned int &money, unsigned int coin);

int main(int argc, char **argv) {
    double input;

    // Retrieve the amount of money from the user.
    std::cout << "Enter the amount in USD: ";
    std::cin >> input;    

    // Now convert it into cents for processing.
    unsigned int money = input * 100;

    // And now count and output the number of coins:
    std::cout << "You'll get:\n";
    std::cout << "\t" << change(money, DOLLAR) << " dollar(s)\n";
    std::cout << "\t" << change(money, QUARTER) << " quarter(s)\n";
    std::cout << "\t" << change(money, DIME) << " dime(s)\n";
    std::cout << "\t" << change(money, NICKEL) << " nickel(s)\n";
    std::cout << "\t" << change(money, PENNY) << " penny(s)" << std::endl;
    return 0;
}

unsigned int change(unsigned int &money, unsigned int coin) {
    // First count the number of coins that fit into the amount.
    // Since we're doing integer division, all results will be rounded down.
    const unsigned int count = money / coin;
    // Then calculate the remainder and update it.
    // The modulo operator (%) always returns the integer remainder.
    money %= coin;
    // Return the number of coins of this size
    return count;
}