0
#include <stdio.h>
#include <iostream>
using namespace std;

float cost, total;
bool loop(char item){
        switch (toupper(item)) {
            case 'A':
                cost = 4.25;        
                return true;
            case 'B':
                cost = 5.57;
                return true;
            case 'C':
                cost = 5.25;
                return true;
            case 'D':
                cost = 3.75;
                return true;
            case 'T':
                return false;
        }
        return true;
}

int main(){
        char item;
        do {
            printf("\nEnter Item Ordered [A/B/C/D] or T to calculate total:");
            scanf("%c", &item);
            total = total + cost;
        } while (loop(item)); 
        printf("Total Cost: $%f\n", total);
}

プロセスを出力させてください:

$ ./Case3.o 

Enter Item Ordered [A/B/C/D] or T to calculate total:a

Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:b

Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:a

Enter Item Ordered [A/B/C/D] or T to calculate total:
Enter Item Ordered [A/B/C/D] or T to calculate total:t
Total Cost: $28.139999

printf最初の印刷後に2回印刷するのに、最初の入力をスキップするのはなぜですか。では、5.24 + 5.57 + 5.24を28.14に等しく計算するにはどうすればよいでしょうか?

4

4 に答える 4

3

enterキーストロークです-あなたはそれを説明する必要があります:)

あなたの数学に関しては、あなたは決して初期化total0ないので、初期値は不確定です。

スコーピングに注意を払っていませんでした-数学の本当の答えは、enterが押されたときにループが前のコストを再度追加することです。これはMysticialの回答に記載されています。

于 2011-10-18T04:49:55.843 に答える
2

他の人が言ったように、Enterキーを押すと、2つの文字が入力されthe character you enter + the newlineます、、これらの両方を考慮する必要があります。

考えられる解決策は次のとおりです。

アプローチ1:Cウェイ

 scanf(" %c", &item);
       ^^^

ここにスペースを追加するか、より良いアプローチ、

アプローチ2:C++の方法

ユーザーから入力を取得するC++の方法を使用するだけです。

cin >> item;

結果が未定義なのはなぜですか?
変数を初期化していないためtotal、これにより未定義動作が発生し、予期しない出力が発生します。
totalはグローバルであるため、デフォルトで0.0に初期化されます。
未定義の結果の本当の理由は、@Mysticalの答えにあります。

于 2011-10-18T04:54:12.163 に答える
1

これは簡単に説明できます。キーを入力aして押すと、入力バッファにと文字の2つの文字が配置されます。ENTERanewline

そのため、最初のプロンプトを除いて、それを印刷してnewlineから標準入力から取得するため、偽のプロンプトが表示されます。

scanfこれは実際にはC++でのC互換性のものであり、C ++スタイルの入力にはcin >> something(または実際にはストリーム関連のものを)使用する必要があります。

この文字のダブルヒットは、誤った合計も説明します。これを取得すると、コストの現在の値がメインループに再びnewline追加されるためです。

cost入力した値に関係なく追加するため、合計は各値の2つで構成されます。

のエントリを使用するとa,b,a、それは4.25 + 5.57 + 4.25 = 14.07-aであり4.25、ではありません5.24。そして28.14ちょうど2回14.07です。

于 2011-10-18T04:50:02.597 に答える
1

が言及されたのでnewline、私はなぜ他の質問に答えます28.14

スイッチでは、デフォルトは単にreturnであることに注意してください。cost設定されることはありません。したがって、それが読み込まれるとnewline、スイッチブロックがスキップされ、コストはそのままになります。

したがって、結果は次のようになります。

total = 0;  // It's actually undefined since you didn't initialize, but it probably started as zero.

total += 4.25;    //  For a
total += 4.25;    //  For '\n' after the 'a'

total += 5.57;    //  For b
total += 5.57;    //  For '\n' after the 'b'

total += 4.25;    //  For a
total += 4.25;    //  For '\n' after the 'a'

最終的な答え:28.14

最後に入力されたtものはに追加されませんtotal

于 2011-10-18T04:54:00.743 に答える