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

int main(void) {

    printf("Enter your change: ");
    int pennies = 0, nickels = 0, dimes = 0, quarters = 0;
    float change = GetFloat();

    while (change > 0) {
        if (change >= 0.25) {
            quarters++;
            change -= 0.25;
        }
        else if (change >= 0.10) {
            dimes++;
            change -= 0.10;
        }
        else if (change >= 0.05) {
            nickels++;
            change -= 0.05;
        }
        else if (change >=0.01) {
            pennies++;
            change -= 0.01;
        }
        // force break
        else {
        printf("%1.2f - Num. of change left\n", change);
        break;
        }
    }
    printf("Quarters: %d\n", quarters);
    printf("Dimes: %d\n", dimes);
    printf("Nickels: %d\n", nickels);
    printf("Pennies: %d\n", pennies);
    return 0;
}

こんにちは、私は現在 C の初心者で、ハーバードの CS50 クラスをオンラインで受講しています。「変更」変数は、while ループを停止せずに 0.00 まで下がるようです。これにより、最後に「break」と入力する必要がありました。コードの何が問題になっていますか?

ちなみにこれは問題集1からです。

4

6 に答える 6

1

テストされていませんが、これが私が書いた方法です。int丸めの問題を回避するのではなくを使用しfloat、コインごとにテーブル駆動の計算を行い、減算を繰り返すのではなく除算を行います。

int change = GetFloat() * 100 + 0.5;
struct {const char *name; int value;} coins[] = {
    {"Quarters", 25},
    {"Dimes", 10},
    {"Nickels", 5},
    {"Pennies", 1},
};
for (int i = 0; i < 4; i++) {
    int coin = change / coins[i].value;
    change %= coins[i].value;
    printf("%s: %d\n", coins[i].name, coin);
}
于 2013-06-22T17:33:49.023 に答える
1

ここで何度か述べたように、これにフロートを使用するのは賢明ではありません...

しかし、論理的には、あなたがしようとしていることを行うことができます.Cの比較および昇格ルールに関係していると思われます...しかし、これで問題が解決すると思います:

while (change > 0.0f)

そうすれば、同じようなタイプを比較しています...

実際には、int、long、または long long を使用して、ドルではなくセントを表すように変更する必要があります。

于 2013-06-22T16:38:55.087 に答える