CS50 PSET1 cash.c: я не могу заставить его напечатать значение, которое я хочу. Просто повторяю ввод снова и снова

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

Эта проблема:

Запишите в файл с именем cash.c в ~/workspace/pset1/cash/ программу, которая сначала запрашивает у пользователя сумму внесенных изменений, а затем выплевывает минимальное количество монет, с помощью которых можно внести указанное изменение.

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

int main(void)
{
    float x;
    int coin_amount = 0;
    do
    {
        x = get_float("how much change is owed: $");
    }
    while (x < 0);

    while (x >= .25)
    {
        coin_amount += 1;
        x = x - .25;
    }
    while (x >= .10 && x < .25)
    {
        coin_amount += 1;
        x = x - .10;
    }
    while (x >= .05 && x < .10)
    {
        coin_amount += 1;
        x =  x - .05;
    }
    while (x >= .01 && x < .05)
    {
        coin_amount += 1;
        x = x - .01;
    }
    while (x < .01)
    {
        coin_amount = coin_amount;
    }
    printf("I have %i coins to give you in change\n", coin_amount);
}

Есть идеи в том, что я делаю не так? Спасибо:)

1 ответ

Основная проблема с вашим решением заключается в том, что финал while() цикл - после ввода - не может быть завершен. Однако есть несколько других небольших проблем:

  • Вы должны использовать return 0; чтобы обеспечить возвращаемое значение для int main(void)
  • while (x >= .10 && x < .25) и друзья излишни: вы можете просто использовать while (x >= .10) (поскольку второе условие уже выполнено в предыдущем while() петля
  • Ты можешь использовать x -= .25 вместо x = x - .25 (не важно и вопрос предпочтений)

Учитывая эти моменты, вы можете попробовать следующее...

#include <stdio.h>

int main(void) {
    float x = 0.0;
    int coin_amount = 0;

    printf("Enter the currency amount: ");
    scanf("%f", &x);
    printf("You entered: %.4f\n", x);

    while (x >= .25) {
        coin_amount += 1;
        x -= .25;
    }
    while (x >= .10) {
        coin_amount += 1;
        x -= .10;
    }
    while (x >= .05) {
        coin_amount += 1;
        x -= .05;
    }
    // Use .00999 instead of .01 due to quirks with floating point math
    while (x >= .00999) {
        coin_amount += 1;
        x -= .01;
    }
    if (x > 0) {
        printf("Ignoring residual value - %.4f ...\n", x);
    }
    printf("I have %i coins to give you in change\n", coin_amount);

    return 0;
}

Вы не указали, что ваш get_float() функция есть, поэтому я использовал scanf() вместо.

Как отметил Юннош в своем ответном комментарии, возможно, стоит рассмотреть решение, которое также не использует математику с плавающей запятой.

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