/switchステートメント奇妙な出力
-
25-10-2019 - |
質問
#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
キーストロークです - あなたはそれを説明する必要があります:)
あなたの数学に関しては、あなたは決して初期化しません total
に 0
したがって、初期値は不確定です。
スコーピングに注意を払っていませんでした - 数学の本当の答えは、ループが以前のコストを再び添加していることです 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
- a
は 4.25
, 、 いいえ 5.24
. 。と 28.14
ちょうど2回です 14.07
.