计算给定零钱金额的硬币面额的程序

Program that will calculate denominations of coins of a given amount of change

本文关键字:金额 硬币 程序 零钱 计算      更新时间:2023-10-16

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

不知怎的,我没有正确显示一角硬币/四分之一硬币等的数量,它只给了我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;
}

尝试遍历程序,您会注意到change()总是返回0,因此输出是正确的,但函数显然不是。

想想这个函数返回了什么以及它应该返回什么。还要记住,您正在传递一个引用,所以无论您在change()中对money做什么,即使在函数的作用域之外也会持续存在。

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


除非你真的被卡住了,否则不要读过这一行,但即使这样,也要先自己想清楚 如果你做不到,请一步一步地阅读,然后再考虑一遍,等等。

让我们快速了解一下change():的实现

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

这在这里没有多大意义。value将持有当前硬币的价值,但你不知何故试图用它进行一些计算。由于value在这个循环中不会改变,所以你基本上创建了一个无限循环。没有输入,因为value现在从未大于100(因为DOLLAR100)是传递的最大值)。

numQuarter=货币/季度;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;
}