Ошибка в то время как цикл продолжает считать за пределами условия - PullRequest
0 голосов
/ 18 мая 2018

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

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

Вот что я имею до сих пор.

#include <stdio.h>

int main()
{
    float cash;
    int n;
    int counter=0;
    int quarters=0;
    int dimes=0;
    int nickels=0;
    int pennies=0;

    for (;;)
    {
        printf("Enter change amount: ");
        scanf("%f",&cash);

        if (cash > 0)
        {
            break;
        }
    }

    n = cash * 100; 
    counter = 0;

    while (n > 0)
    {
        while (n >= 25)
        {
            counter ++;
            n = n - 25;
            quarters ++;
            printf("%i\n",n);
        }

        while (n >= 10 && n < 25)
        {
            counter ++;
            n = n - 10;
            dimes ++;
            printf("%i\n",n);
        }

        while (n >= 5 && n < 10)
        {
            counter ++;
            n = n - 1;
            nickels++;
            printf("%i\n",n);
        }

        while (n > 0 && n < 5)
        {
            counter ++;
            n = n - 1;
            pennies ++;
            printf("%i\n",n);
        }
    }
    printf("%d\n",counter + n);
    printf("%i quarters, %i dimes, %i nickels, %i pennies\n", 
                quarters, dimes, nickels, pennies); 

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Вот более полный ответ, который соответствует коду, который вы нам дали для начала.Я изменил циклы на вычитание / умножение и исправил ошибку, когда вы рассматривали никели как копейки.Вам больше не нужна переменная counter, но я оставил ее внутри.

#include <stdio.h>

int main()
{
    float cash;
    int n;
    int counter=0;
    int quarters=0;
    int dimes=0;
    int nickels=0;
    int pennies=0;

    for (;;)
    {
        printf("Enter change amount: ");
        scanf("%f",&cash);

        if (cash > 0)
        {
            break;
        }
    }

    n = cash * 100; 
    counter = 0;

    if (n > 0)
    {
        quarters = (int)floor(n / 25);
        n -= quarters*25;
        printf( "%i\n", n );

        dimes = (int)floor(n / 10);
        n -= dimes*10;
        printf("%i\n",n);

        nickels = (int)floor(n / 5);
        n -= nickels*5;
        printf("%i\n",n);

        pennies = n;
        printf("%i\n",n);
    }
    printf("%i quarters, %i dimes, %i nickels, %i pennies\n", 
                quarters, dimes, nickels, pennies); 

    return 0;
}
0 голосов
/ 18 мая 2018

Я немного удивлен, что они хотят, чтобы вы использовали break для выхода из цикла, так как вы обычно хотите, чтобы циклы заключали «естественно» (и вы обычно сохраняете разрывы для операторов switch).Примерно так должно работать, используя целочисленное деление и оператор модуля (примечание для редактирования: я использую два целых вместо одного с плавающей точкой из-за неточности с последним. Если кто-то более знающий хочет показать, как это сделать с плавающей точкой, будетбыть интересным.):

#include <stdio.h>

int main() {
    int dollar, cent;

    int q = 0;
    int d = 0;
    int n = 0;
    int p = 0;

    int re;

    printf("Enter amount: ");
    scanf(" %d.%d", &dollar, &cent);

    q = dollar * 4;        
    re = cent;

    q = q + (re / 25);
    re = re % 25;

    d = re / 10;
    re = re % 10;

    n = re / 5;
    re = re % 5;

    p = re;

    printf("q %d d %d n %d p %d\n", q, d, n, p);

    return 0;
}

Этот подход также работает, если, например, вам даны секунды и вы хотите найти min: sec из этого.Если вам дается 65 секунд, вы делаете 65/60 для минутной части (которая равна 1), а секундная часть - это только остаток от деления на 60, или 65% 60 (что составляет 5).

0 голосов
/ 18 мая 2018

Прежде всего, попробуйте начать с абстрагирования от обращения с монетами одного типа:

int coinsNeeded( int amount, int coinAmount )
{
    return (int) floor( amount / coinAmount );
}

Затем обрабатывайте каждую монету отдельно:

quarters = coinsNeeded( cash, 25 );
cash -= (quarters * 25);

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

...