質問

#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の後に印刷した後、なぜ printf 2回は入力から私をスキップします。次に、5.24+5.57+5.24を28.14に等しく計算するのですか?

役に立ちましたか?

解決

他の人が言及したように、Enterを押すと、2人のキャラクターが入力され、 the character you enter + the newline, 、これらの両方を説明する必要があります。

可能な解決策は次のとおりです。

アプローチ1:Cウェイ

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

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

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

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

cin >> item;

なぜ結果が未定義になっているのですか?
変数を初期化しなかったからです total, 、これはです 未定義の動作 予期しない出力を与えます。
total グローバルなので、そうなるでしょう デフォルトの初期化 0.0に。
未定義の結果の本当の理由は、 @Mysticalの答えです。

他のヒント

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

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

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

以来 newline 言及されています、私は理由の他の質問に答えます 28.14.

スイッチでは、デフォルトが返されるだけであることに注意してください。 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.

これは簡単に説明できます。あなたが入るとき a そして、ヒットします ENTER キー、これは場所です 2 入力バッファーの文字、 a そしてその newline キャラクター。

それが、最初を除くすべてのために、あなたはそれが印刷してから、 newline 標準入力から。

scanf C ++では本当に互換性のあるものです、あなたは使用する必要があります cin >> something (また どれか C ++のためのStreams関連のものの本当に)スタイル入力。

この炭化業者の二重のヒットは、あなたが誤った合計を説明していることも説明しています。 得る それ newline で、現在のコストの値を追加します また メインループで。

あなたの合計は、あなたが追加しているという事実により、各値の2つで構成されています cost 入力された値に関係なく。

のエントリ付き a,b,a, 、そうなるでしょう 4.25 + 5.57 + 4.25 = 14.07 - a4.25, 、 いいえ 5.24. 。と 28.14 ちょうど2回です 14.07.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top