2016-11-25 9 views
1

私は、ユーザーが$を押してからメインメニューに戻るまで、操作を続行するメインメニューの電卓を作っています。私はそれをテストすると、無限ループで自分のコードをスローします。私は何を間違えたのですか?以下は、1つの関数のスニペットです。 (メニューは空白と宣言されています)whileループを中断しようとすると無限ループに陥る

float makeSum(float num1, float num2) { 

float r = 0; 
bool ended = false; 
do { 
    cout << "Please provide the first number: " << endl; 
    cin >> num1; 

    if (num1 == '$') { 
     ended = true; 
    } 

    cout << "Please provide the second number: " << endl; 
    cin >> num2; 

    if (num2 == '$') { 
     ended = true; 

    r = num1 + num2; 
    cout << "Result: " << r << endl; 
} while (!ended); 

menu(); 
return r; 

} 
+0

あなたが表示する機能はビルドすべきではありません。閉じたブレース '}'がありません。 –

+0

どのような状況で、 '' $ ''と等しいとテストするために、ユーザから読み込まれた' 'float'型の値を期待しますか?ストリーミング演算子は浮動小数点値に変換する方法を知らないので、ユーザが '$'を入力した場合は確かではありません。あなたの実装がASCII文字セット(またはそれと互換性のあるもの)を使用している場合、 '36'を入力すると、' '$ ''の整数値であるため、ループが終了します。 – Peter

答えて

5

これは確かに動作しません。あなたが言うとき:

float num2; 

し、後で:

cin >> num2; 

のみ山車は、入力ストリームから読み込まれます。このうち1つの方法は、ループ内で、持っていることです。

string input; 
... 
cin >> input; 
if (input == "$") break; 
istringstream s(input); 
float num; 
s >> num; // now you read a float from the string 

もう一つは、私は上記のコードスニペットに示されているようではなく使用しての、breakを使用してループから抜け出すためだけに簡単であるということですbooleanフラグをチェックしてチェックします。

+1

さらに、失敗した場合は入力したくないので、チェックは失敗します(ほとんどの場合)ので、常にcinの状態をテストする必要があります。 – kevr

+1

'float num = std :: stof(input)'は 'istringstream' IMOを使うより読みやすくなります。 –

+0

@kevr改良が必要なことがたくさんありますが、私はその質問に答えることを試みました。 Stackoverflowや他の場所にはたくさんのコード例があります。 –

関連する問題