2014-07-19 135 views
0

嗨,大家好,我在加入輸入時遇到了加號困難。這裏即時處理反向波蘭符號計算器。我所要做的就是將輸入作爲「3 2 + $」,這意味着(以簡單的方式)添加3和2並顯示它們。我嘗試使用stringstreams,而(cin)。現在我試圖逐個輸入;加號逃脫C++

int num; 
char ch; 
while (cin) 
    { 
     if (cin >> num) 
     { 
      cout<<num; 
     } 
     else 
     { 
      cin.clear(); 
      cin >> ch; 
      cout << ch; 
     } 
    } 
} 

它不適用於+和 - 並適用於*和/。但我也需要這些操作數。我嘗試通過getline來嘗試istringstream。它沒有看到+或 - 或者。

+0

你認爲+和 - 之前可以是數字的一部分:-10仍然是一個整數... –

+0

獲取每個參數爲一個字符串,測試字符串是什麼樣的參數。 – jxh

+0

'std :: cin >> num'只有在提取+或 - 後纔會失敗,並意識到沒有以下編號。 – chris

回答

2

在你的示例代碼中,這行代碼讓我擔心while (cin)(必須確定你有和無限循環),在示例代碼下面(我補充說,當輸入一個空行時程序結束)。

CIN將由一個詞,當你調用cin >> somevariable;獲取輸入一個詞,當你在控制檯3 2 + $寫會得到4個結果:然後然後+和最後$。閱讀波蘭標記時的其他問題是,您無法預測下一個標記是數字還是運算符,您可以得到:3 2 + $,但也可以使用3 2 2 + * $。出於這個原因,你需要一個容器來存儲操作數。

這裏是一個小工作示例:

#include <iostream> 
#include <stack> 
#include <boost/lexical_cast.hpp> 

using namespace std; 

int main(int argc, char *argv[]) { 
    string read; 
    std::stack<int> nums; 
    while (cin >> read) { 
     if (read.empty()) { 
      break; 
     } 
     else if (read == "$") { 
      std::cout << nums.top() << std::endl; 
     } 
     else if (read == "+" || read == "-" || read == "*" || read == "/") { 
      if (nums.size() < 2) { 
      } // error code here 

      int n1 = nums.top(); 
      nums.pop(); 
      int n2 = nums.top(); 
      nums.pop(); 

      if (read == "+") 
       nums.push(n2 + n1); 
      if (read == "-") 
       nums.push(n2 - n1); 
      if (read == "*") 
       nums.push(n2 * n1); 
      if (read == "/") 
       nums.push(n2/n1); 
     } 
     else { 
      try { 
       nums.push(boost::lexical_cast<int>(
        read)); // you should add convertion excepcion code 
      } 
      catch (...) { 

      } 
     } 
    } 

    return 0; 
}