Почему не будет напечатано количество монет? - PullRequest
0 голосов
/ 16 октября 2019

Я делаю проблему Cash (less) в CS50, и мой код не будет печатать количество монет, которые у меня есть

Я пытался переместить печать в цикл do while, но это заставило его печатать навсегда.

do
{
    for(int f = money;f >=0;f++)
    {
        for(q=0; money >= .25;q++)
         {
             money = money - .25;
         } 
        for(d=0; money >= .10;d++)
         {
             money = money - .1;
         } 
        for(n=0; money >= .05;n++)
         {
             money = money - .05;
         } 
        for(p=0; money >= .01;p++)
         {
             money = money - .01;
         } 

    }
  }while(money>=0);
        coins = q+d+n+p;
        printf("%f", coins);

На нем должно быть напечатано минимальное количество монет, необходимое для возврата покупателю изменений, на основе введенного ранее в коде ввода.

1 Ответ

0 голосов
/ 16 октября 2019

Поскольку вы используете числа с плавающей точкой, вы можете получить ошибку округления и получить деньги, имеющие значение, например .001. Это приведет к тому, что вы снова войдете в верхний уровень для цикла, который сбросит q, d, n и p на 0. Гораздо удобнее использовать циклы while:

#include <stdio.h>
#include <stdlib.h>

main()
{
        int q = 0;
        int d = 0;
        int n = 0;
        int p = 0;
        float money = .34;  // test value
        int coins;

        while (money >= .25)
        {
                money = money - .25;
                q++;
        } 
        while (money >= .10)
        {
                money = money - .1;
                d++;
        } 
        while (money >= .05)
        {
                money = money - .05;
                n++;
        } 

        while (money >= .01)
        {
                money = money - .01;
                p++;
        }

        coins = q+d+n+p;
        printf("%d", coins);  // Note that type was changed to int
}

Примечание, поскольку при этом все еще используются числа с плавающей запятойВы можете получить небольшие ошибки округления. Было бы лучше посчитать по центам, используя целые числа, а не числа с плавающей запятой, чтобы отслеживать доли доллара, но я хотел сохранить стиль, аналогичный вашему.

...