Программа, которая распространяет изменения среди клиентов. (С)

Цель:

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

Выпуск:

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

Дополнительная информация:

Я добавил функцию печати в код, чтобы определить, где была проблема. "test1" транслируется, "test2" - нет.

Я использую некоторые функции, локальные для библиотеки cs50.h:

  • get_float (); - получает значение с плавающей запятой от пользователя и сохраняет его.

Пожалуйста, не исправляйте мой код для меня! Мне нужно научиться делать это самому. Мне просто нужна помощь в поиске логической ошибки или ошибки форматирования. Да, я знаю, что это не эффективно.

Примеры того, что я ищу:

  • "Ваша проблема в строке X, ваши значения делают так, чтобы VARIABLE никогда не достигал 0".

  • "В C вы не можете отформатировать '( x < 0);' - вы должны сказать '(x<0);'."

Проход кода:

Программа получает 2 значения с плавающей запятой от пользователя, количество и стоимость. "сумма" - это сумма, которую клиент дал, "стоимость" - стоимость товара.

Программа находит "сумму - стоимость", чтобы определить, сколько изменений должно быть. Это значение хранится в 'diff'.

Программа вычитает 0,25 из 'diff' и добавляет 1 к переменной 'четверть'.

Программа вычитает 0.10 из 'diff' и добавляет 1 к переменной 'dime'.

...

Программа печатает, сколько кварталов, центов, никелей и пенни нужно использовать, чтобы максимально эффективно изменить клиента.

Предположим, что можно использовать только монеты.

Код:

#include <stdio.h>
#include <cs50.h>


int main()
{

    float cost;
    do
    {
        printf("How much did it cost?\n");
        cost = get_float();
    }
    while (cost < 0);

    float amount;
    do
    {
        printf("How much did you pay?\n");
        amount = get_float();
    }
    while (amount < cost);




    int quarter = 0;
    int dime = 0;
    int nickel = 0;
    int penny = 0;
    float diff = amount - cost;
    do
    {
        while (diff >= 0.25)
        {
            diff = diff - .25;
            quarter++;
        }
        printf("test1");


        while (.10 <= diff < .25)
        {
            diff = diff - 0.10;
            dime++;
        }
        printf("test2");


        while (0.05 <= diff < .10)
        {
            diff = diff - 0.05;
            nickel++;
        }


        while (0.01 < diff < 0.05)
        {
            diff = diff - 0.01;
            penny++;
        }


        while (diff == 0.01)
        {
            penny++;
            diff = 0;
        }


    } // end bracket for do function
    while (diff > 0);



    if (diff == 0)
        {
            printf("Your change consists of:\n");
            printf("%i quarters.\n", quarter);
            printf("%i dimes.\n", dime);
            printf("%i nickels.\n", nickel);
            printf("%i pennies.\n", penny);
            exit(0);
        }

    if (diff < 0)
        {
            printf("Your change consists of:\n");
            printf("%i quarters.\n", quarter);
            printf("%i dimes.\n", dime);
            printf("%i nickels.\n", nickel);
            printf("%i pennies.\n", penny);
            exit(0);
        }

} // end bracket for int main

Ожидаемый результат:

Программа работает, как описано выше.

Фактический результат:

Программа не выполняется полностью. "test1" транслируется, "test2" - нет.

3 ответа

Решение

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

Тем не менее, заявления, как

 while (.10 <= diff < .25)

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

Вы должны соединить их, используя && оператор, как

 while (.10 <= diff && diff < .25) {

Прежде всего, ваша петля вечна. while (сумма <стоимость); <- Сумма и стоимость никогда не меняются. Так...

Во-вторых, вы не можете писать такие условия, как (1 <= 2 < 3), это не означает, что вы думаете, что это значит. Он по отдельности выполняет операторы, поэтому в итоге получается что-то похожее на (1 <= 2) < 3, причем первым является 1 (истина) или 0 (ложь).

Беда в сравнении как 0.05 <= diff < .10 которые не совпадают с 0.05 <= diff && diff < .10 Последний делает то, что вы намереваетесь, первый сравнивает 0 или 1 с 0,10. Если значение diff больше 0,05, то значение 0,05 <= diff равно 1, что затем сравнивается с 0,10. То, что вы написали, так же, как (0.05 <= diff) < .10,

Другие вопросы по тегам