2016-03-15 69 views
1

我想從與優先申請閱讀後以解決這種類型的表達式
2 + 3/5 * 9 + 3-4
這裏是我試圖解決該任務的代碼我怎樣才能解決這個問題C++優先經由申請

while (!inputFile.eof()) { 
    getline(inputFile, read); 
    cout << read << endl; 
    for (int i = 0; i < read.length(); i++) { 
    if (read[i] == '/') { 
     result = static_cast<float>(read[i - 1])/static_cast<float>(read[i + 1]); 
     read[i - 1] = result; 
     for (int j = i; j < read.length() - 2; j++) { 
     read[j] = read[j + 2]; 
     } 
     read[read.length() - 1] = '\0'; 
     read[read.length() - 2] = '\0'; 
    } 
    } 
    cout << result << endl; 
    cout << read << endl; 
} 
+0

你正在評估的操作數爲花車但你保存它放回串作爲一個字符,失去了任何精度。您正在基於它們的ascii表示來評估操作數,而不是實際值。該代碼假定每個操作數只有一個字符長。你只顯示分區,但是在執行乘法時,你可能會得到大於9的值,因此會有問題。我認爲你應該重新思考你的解決方案,我建議不要試圖在一個字符串中完成所有工作。 – vu1p3n0x

+0

我不確定自己明白你想要做什麼。評估表達式不是一項簡單的任務。 [This](http://www.stroustrup.com/3rd_code.html)可能會幫助你(尋找桌面計算器)。如果'「/」'是字符串的第一個字符,而如果給定的格式良好的輸入不會發生 – ZDF

回答

2

您將需要從輸入中構建樹狀結構。首先你需要lex(/ tokenize)你的方程,這樣你就可以得到一個List/Array /任何你認爲符合你的標記(數字,運算符,括號)的容器。這些可能已經擁有正確的數據類型(float或int等等)。

然後您就可以使用正確的優先順序解析您的標記成樹狀結構。這是構建類似計算器的應用程序的棘手部分。

基本上你在這裏解析語法,但你應該考慮一下這個自己(這是一個很好的做法)。

你的樹結構2 + 3/5 * 9只+ 3-4需要看起來像這樣:

MINUS 
|- PLUS 
| |- PLUS 
| | |- 2 
| | |- MULTIPLY 
| | | |- DIVIDE 
| | | | |- 3 
| | | | |- 5 
| | | |- 9 
| |- 3 
|- 4 
1

代碼有一些問題

  1. 有在第一次循環中嘗試訪問大概不存在的讀取[-1]存儲器地址時,會出現索引超出邊界錯誤。

  2. 讀取(可能是)字符數組,這意味着read [i]包含一個ASCII字符而不是原始數字。所以,如果讀[我]包含「5」,應用結果的static_cast <浮動>(讀[1])是'53 0.0' ,因爲ASCII的代碼‘5’是53.所以你真正需要的是的static_cast <浮動>(閱讀[i] - '0')

  3. 你不應該將浮點除法的結果存回讀[i-1],因爲很明顯你正在用chars混合浮點值。如果你是認真的做,你應該轉換爲字符串的操作的結果,但我敢說這是一個不必要的複雜性:你爲什麼不乾脆用一個浮點數臨時變量來存儲部分結果?

  4. 但絕對沒有你消耗了前兩個操作數後,就推進指針萎縮讀取緩衝區內容的必要性。

+0

#1只能發生。 – vu1p3n0x

+0

我不會假設輸入結構良好的,因爲它沒有任何地方檢查 –

+0

夠公平的.... – vu1p3n0x