c++實現的完整功能計算器_第1頁
c++實現的完整功能計算器_第2頁
c++實現的完整功能計算器_第3頁
c++實現的完整功能計算器_第4頁
c++實現的完整功能計算器_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、些說明:本程序支持基本的四則運算,三角函數運算( sin , cos , tan ),指數運算,以及對數運算( lg , ln , log ),取模運算,同時還支持括號!主函數流程:輸入運算式子 -> 判斷是否有異常字符 -> 對式子進行處理以便于計算->調用計算沒有括號的式子的函數去除括號,即先計算括號里的子式-> 最后得到沒有括號的式子, 在調用函數計算得到結果。值得注意的是輸入運算式子時, 必 須寫成 alogb , 必 須寫成 pi ,三角函數若不是tanN形式的話,要加上括號如tan (a+b),這是由于控 制臺輸入的限制和為了輸入后便于處理。子函數流程:從運

2、算式子中讀出數字和字符, 分別存于一個隊列中 -> 按順序取出數字與字符, 進行乘方運算, 其他的再一次放回隊列中 -> 依次再取出進行三角函數和對數的運算, 其他依次放回 -> 再依次取出進行乘除和取模運算, 其他依次放回 -> 現在只剩下加減運算, 依次取出計算,得到最后的結果。關鍵技術:一、c+的sstream流的運用,可以從中分別讀出運算式子的數字與字符還有去除括號時將未處理字符(即非括號內的字符)以及括號內的子式處理結果輸出到流中,便于迭代去除括號。2、 對沒括號的式子進行分級處理。3、 將式子的字符以及數字分開處理。源代碼如下:#include<ios

3、tream> #include<sstream> #include<string> #include<cmath> #include<queue>#define pi 3.141592654 double calculate( std:string);int main()/輸入式子,存于s 中std:string s;std:getline(std:cin, s);/拋出異常try/判斷是否有異常字符const std:string jubge = "1234567890 tan sin cos +-*/八(|) log ln l

4、g sqrt pi!"for (const auto &i : s)if (jubge. find(i) = -1)throw 1;/ 拋出異常/將三角函數名化為數字與&字符,便于識別和計算以及將對數函數以及階乘以及開方將pi/?;癁閿底謘ize_t n = 0;while (n = s. find("sin") != -1)s. replace(n, 3, "1&");while (n = s. find("cos") != -1)s. replace(n, 3, "2&"

5、;);while (n = s. find("tan") != -1)s. replace(n, 3, "3&");while (n = s. find("ln") != -1)s. replace(n, 2, "4&");while (n = s. find("lg") != -1)s. replace(n, 2, "5&");while (n = s. find("sqrt") != -1)s. replace(n, 4, &q

6、uot;6&");while (n = s. find("log") != -1)s. replace(n, 3, "");while (n = s. find("!") != -1)s. replace(n, 1, "$7");while (n = s. find("pi") != -1)s. replace(n, 2, std:to_string(pi);/去除括號while (s. find("(") != -1|s. find(")&quo

7、t;)!=-1)std:ostringstream uout;/ 存儲未處理字符auto left = s. begin();/記錄左括號位置auto right = s. begin();/記錄右括號位置while (right != s. end()/ 處理最里層括號里的字符if (*right = '(')if (*left = '(')for (auto i = left; i != right; +i)uout << *i;left = right;else if (*right = ')')if (*left != 

8、9;(') throw 2;/ 拋出異常uout << calculate( std:string(left + 1, right);break;else if (*left != '(')uout << *right;else;+right;if (*left = '('&&right = s. end() throw 3;/ 拋出異常for (auto i = right + 1; i != s. end(); +i)/ 輸出剩余未處理符uout << *i;s = uout. str();/將處理

9、一對括號后的字符串賦給s/計算最后結果 double result = calculate(s);/輸出結果std:cout << result << std:endl;catch (int e)/ 捕獲并處理異常using std:cout;using std:endl;cout << "Input Error!" << endl;switch (e)case 1: cout << "式子中有異常字符! " << endl; break;case 2: cout <<

10、"缺左括號!" << endl; break;case 3: cout << "缺右括號!" << endl; break;case 4: cout << "運算符相連或對數等復活寫錯! " << endl;break;default:;system("pause");return 0;double calculate( std:string s)/將數字和運算符分別裝入雙向隊列和隊列適配器中std:deque<double> number;s

11、td:queue<char> symbol;std:istringstream uin(s);symbol. push('+');/ 添加加號為第一個運算符double tpn; char tpc;while (uin >> tpn >> tpc)number. push_back(tpn), symbol. push(tpc);if (!uin. eof() throw 4;/ 拋出異常number. push_back(tpn);/ 添加最后一個數字/計算乘方for (int i = 0, n = number. size(); i &l

12、t; n; +i)tpc = symbol. front(); symbol. pop();取出運算符tpn = number. front(); number. pop_front();取出數字if (tpc ='八')計算乘方double temp = number. back();number. back() = pow(temp, tpn);elsesymbol. push(tpc);/ 放回隊列,置于最后精品資料number. push_back(tpn);/ 放回隊列,置于最后/計算三角函數以及對數 for (int i = 0, n = number. size(

13、); i < n; +i)tpc = symbol. front(); symbol. pop();取出運算符tpn = number. front(); number. pop_front();取出數字if (tpc = '&')/ 計算乘方以及對數switch (int(number. back()case 1:number. back() case 2:number. back() case 3:number. back() case 4:number. back() case 5:number. back() case 6:number. back() d

14、efault:;= sin(tpn); break;= cos(tpn); break;= tan(tpn); break;= log(tpn); break;= log10(tpn); break;= sqrt(tpn); break;else if (tpc = '')/ 計算對數double temp = number. back();number. back() = log(tpn) / log(temp);else if (tpc = '$')/ 計算階乘int n = number. back();number. back() = 1;for (in

15、t i = 1; i <= n; +i) number. back() *= i;elsesymbol. push(tpc);/ 放回隊列,置于最后number. push_back(tpn);/ 放回隊列,置于最后/計算乘除以及取模運算for (int i = 0, n = number. size(); i < n; +i)tpc = symbol. front(); symbol. pop();取出運算符tpn = number. front(); number. pop_front();取出數字if (tpc = '+' | tpc = '-')symbol. push(tpc);number. push_back(tpn);else if (tpc = '*')number. back() *= tpn;/ 計算乘else if (tpc = '/')number. back() /= tpn;/ 計算除else/取模運算double temp = number. back();temp = int(temp) % int(tpn);number. back() = temp;/計算加減得出結果double resu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論