2016-07-08 15 views
1

私は何かが本当にばかげて間違っているように感じる。私はちょうどあなたがnon-doublesに入っている時にユーザーに伝えて、値を入力しているcinにループバックしてほしいと思っています。なぜこれは文字で無限ループになりますが、倍精度ではありませんか?

任意の数値を入力します。そして、この些細な数学と本質的なことを本質的にやりなさい。その点ではうまく動作しますが、charのような予期しない入力があった場合に問題が発生します。何らかの形で入力がループに送られて、数字を入力して新しい番号でcin型にループバックするように伝えるのではなく、数学の問題をループします。

#include <iostream> 
#include <cstdlib> 

using std::cout; using std::cin; using std::endl; 

long double domath(long double i) 
{ 
    cout << i << "/" << 2 << "=" << i/2 << endl;  
    cout << i/2 << "*" << 10 << "=" << (i/2)*10 << endl << endl; 
    cout << 5 << "*" << i << "=" << 5*i << "\n\n";  
    return 0; 
} 

int main() 
{ 

    long double in = 0; 

    while(true) 
    { 
     cin >> in;   
     if (cin.fail()) {    
      in = char(int(in)); 
     }   
     domath(in); 
    } 
    system("pause>nul"); 
    return 0; 
} 
+0

サンプル入力、期待値と実際の出力を入力してください。 –

+0

[tag:c]タグを削除してください。 –

+0

cinをクリアする必要があります。http://stackoverflow.com/questions/17928865/correct-way-to-use-cin-fail –

答えて

1

あなたが失敗した場合にcinをクリアしていない、それは無限に毎回失敗し、倍増する間違った入力を解析しようとします。あなたは、エラーの場合にバッファをクリアする必要があります。

if (cin.fail()) { 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    in = char(int(in)); 
} 

また、あなたが

in = char(int(in)); 

inで達成しようとしているかを理解することはできませんが、長いダブル可変であり、最後を開催しますあなたがそれに割り当てた価値、それを "変換"して数学をする必要はありません。

+0

なぜ数値入力でクリアする必要はありませんか? – x4kepa

+0

@ x4kepaこれは構文解析時に正常に消費されるためです。 – buld0zzr

+0

このようなことはどこで学びますか?このようなことをするときの具体的な知識はどこから来たのですか? – x4kepa

0

このようなことをやってみませんか?

int x; 

if(std::cin >> x) 
    doSomethingCool(x); 
else 
    std::cout << "Error, not a valid integer!" << std::endl; 

不正な入力でループを終了します。

これはバッファと他のすべてのジャズをクリアするよりも自然であると感じます。ちょうど私の意見。

if (cin >> x) - Why can you use that condition?

編集:ブルの答えはしかし、まだ良いものです。

関連する問題