2016-04-10 6 views
0

私はBjarne StroustrupのC++ブックのコード例を模倣したプログラムを作ろうとしています。これは、評価が必要な長い式を解析できる電卓を作るための初期のアプローチです。 オペレータの優先順位はまだですが、現在のコードで問題が発生していることを理解しようとしています。ここでは、次のとおりです。なぜこのプログラムは3行の入力を必要としますか?

#include <iostream> 
using namespace std; 

int main() { 
    cout << "Expression: "; 
    int lval = 0; //left-hand value 
    int rval; // right-hand value 
    char op; 
    cin >> lval; //read leftmost operand 
    while (cin>>op) { //read operator and righ-hand operand repeatedly 
    cin >> rval; 
    switch (op) { 
    case '+': 
     lval += rval; //add: lval = lval+rval 
     break; 
    case '-': 
     lval -= rval; //subtract: lval = lval-rval 
     break; 
    case '*': 
     lval *= rval; //multiply: lval =lval*rval 
     break; 
    case '/': 
     lval /= rval; // divide: lval = lval/rval 
     break; 
    default: // not another operator: print result 
     cout << "Result: " << lval << '\n'; 
     return 0; 
    } 
    } 
return 0; 
} 

私はコンパイルしてプログラムを実行すると、私はいつも、たとえば、入力の2つの余分な行を追加する必要があります。

$ ./calculator 
>Expression: 1+2+3 
> 
> 
[I can keep pressing enter as many times as I wish until I type in 2 more lines] 
>l 
>l 
>Results: 6 

なぜプログラムがこのように動作するのでしょうか? \n文字を読み取ったときに、なぜcin>>opがfalseを返さないのですか?

私は本からwhile(cin>>op)部分をコピーしたので私は混乱します。

+1

次の2つの問題、 '空白は、それによって破棄されるので、CIN >> op'は' \のN 'を抽出することはありませんので、あなたがあなたのループを終了するために、事業者の一つではない何かを入力する必要がありますがあります。 2つ目の問題は、オペレータが見つからなくても、右手側のオペランドを常に*読み込むことです。そのため、2行を入力しなければなりません – melak47

答えて

2

各反復でcin>>opcin>>rvalを読み込んでいるため、この読み取り操作はユーザーが何らかの値を入力するまでブロックされます。 >> operatorは、改行文字( '\ n')を読み込まないので、他の値を入力してEnterを押すと、両方の行がブロックされます。なぜなら、式を書いた後、何回入力しても他の2つの値を入力するのを待ちます(最初の値は、デフォルトのswitch文が実行されるように非演算子の値を開始します)。

cin.get()を使用すると、演算子を取得できます。これは、新しい演算子を読み込み、これを避けるために各演算子のswitch文内のrvalを読み込むためです。

cout << "Expression: "; 
    int lval = 0; //left-hand value 
    int rval; // right-hand value 
    char op; 
    cin >> lval; //read leftmost operand 
    while (cin.get(op)) { //read operator and righ-hand operand repeatedly 
    switch (op) { 
    case '+': 
     cin >> rval; 
     lval += rval; //add: lval = lval+rval 
     break; 
    case '-': 
     cin >> rval; 
     lval -= rval; //subtract: lval = lval-rval 
     break; 
    case '*': 
     cin >> rval; 
     lval *= rval; //multiply: lval =lval*rval 
     break; 
    case '/': 
     cin >> rval; 
     lval /= rval; // divide: lval = lval/rval 
     break; 
    default: // not another operator: print result 
     cout << "Result: " << lval << '\n'; 
     return 0; 
    } 
    } 
+0

あなたの答えと私に 'cin.get()'関数を表示してくれてありがとう、ありがとう。 – goncalotomas

4

whileループの繰り返しごとに、2つの入力(cin >> opcin >> rval)が必要です。これには、defaultのケースに切り替える最後の入力が含まれます。それで、あなたは2つの追加行を入力する必要があります。

関連する問題