提供最小量更改的C ++程序不适用于最低面额

时间:2016-10-12 10:43:57

标签: c++

这样做的目的是给出最小票据/硬币数量的变化。到目前为止,我的代码适用于所有值,除了那些包含2p或1p硬币的值,例如。 12.33给出1英镑10英镑,1英镑2英镑,1 20英镑,1 10英镑和1 2p,但没有1p。我也试过了2p,它给了1个1p,1p给了0个硬币。我无法弄清楚这些特定值的错误,因为每个面额的代码都是相同的。

#include <iostream>

using namespace std;

int main()
{
  float change;
  int fifty = 0;
  int twenty = 0;
  int ten = 0;
  int five = 0;
  int two = 0;
  int one = 0;
  int fiftyp = 0;
  int twentyp = 0;
  int tenp = 0;
  int fivep = 0;
  int twop = 0;
  int onep = 0;

  cout << "Please enter the amount of change given:\n";
  cin >> change;

  while ( change >= 50)
    {
      fifty++;
      change -= 50;
    }


  while ( change >= 20)
    {
      twenty++;
      change -= 20;
    }


  while ( change >= 10)
    {
      ten++;
      change -= 10;
    }


  while ( change >= 5)
    {
      five++;
      change -= 5;
    }


  while ( change >= 2)
    {
      two++;
      change -= 2;
    }


  while ( change >= 1)
    {
      one++;
      change -= 1;
    }


  while ( change >= 0.5)
    {
      fiftyp++;
      change -= 0.5;
    }


  while ( change >= 0.2)
    {
      twentyp++;
      change -= 0.2;
    }


  while ( change >= 0.1)
    {
      tenp++;
      change -= 0.1;
    }


  while ( change >= 0.05)
    {
      fivep++;
      change -= 0.05;
    }


  while ( change >= 0.02)
    {
      twop++;
      change -= 0.02;
    }


  while ( change >= 0.01)
    {
      onep++;
      change -= 0.01;
    }


    cout << "Give " << fifty << " £50 notes.\n"; 
    cout << "Give " << twenty << " £20 notes.\n";
    cout << "Give " << ten << " £10 notes.\n";
    cout << "Give " << five << " £5 notes.\n";
    cout << "Give " << two << " £2 coins.\n";
    cout << "Give " << one << " £1 coins.\n";
    cout << "Give " << fiftyp << " 50p coins.\n";
    cout << "Give " << twentyp << " 20p coins.\n";
    cout << "Give " << tenp << " 10p coins.\n";
    cout << "Give " << fivep << " 5p coins.\n";
    cout << "Give " << twop << " 2p coins.\n";
    cout << "Give " << onep << " 1p coins.\n";

    return 0;
}

3 个答案:

答案 0 :(得分:4)

问题是浮点数学。考虑在程序结束时添加以下行:

cout << "Change left: " << change << '\n';

12.33作为输入运行程序会导致:

Change left: 0.00999992

显然这不到0.01。虽然您可以尝试添加软糖因子来处理与完美数字的“小”偏差,但通常最好使用整数来赚钱,这样1等于1美分。你应该通过适当的舍入来进行这种转换:

long int cents = lrintf(change * 100.0);

然后像这样替换你的while循环:

while (cents >= 5000) {
  fifty++;
  cents -= 5000;
}

等等。

答案 1 :(得分:2)

问题在于var anotherFilter = { matchType=contains, type=1, value=c }; request.rules[1].pageFilters.push(anotherFilter); 无法表示所有十进制数,而float实际上略小于0.02(并且0.02小于0.01)。

补救措施是对代表你最小面额的整数(即一分钱)进行计算。

让用户以便士的形式输入金额,或者读取你解析的字符串 后一种方法既复杂又方便用户,但首先使用前一种方法获得工作程序可能是一个好主意。
(这两种方法都可以忽略无意义的数量,如3.14159265。)

我还建议你阅读精美的C ++书中的循环和数组。

答案 2 :(得分:0)

下面/上面的答案解决了你实际问的问题 但是,我认为你实际上并没有问自己正确的问题 这是使用数组

制作程序的另一种更简单的方法
git shortlog -s -n 

如果您想随时更改硬币的金额/价值,请考虑使用向量而不是数组