




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、些說(shuō)明:本程序支持基本的四則運(yùn)算,三角函數(shù)運(yùn)算( sin , cos , tan ),指數(shù)運(yùn)算,以及對(duì)數(shù)運(yùn)算( lg , ln , log ),取模運(yùn)算,同時(shí)還支持括號(hào)!主函數(shù)流程:輸入運(yùn)算式子 -> 判斷是否有異常字符 -> 對(duì)式子進(jìn)行處理以便于計(jì)算->調(diào)用計(jì)算沒(méi)有括號(hào)的式子的函數(shù)去除括號(hào),即先計(jì)算括號(hào)里的子式-> 最后得到?jīng)]有括號(hào)的式子, 在調(diào)用函數(shù)計(jì)算得到結(jié)果。值得注意的是輸入運(yùn)算式子時(shí), 必 須寫(xiě)成 alogb , 必 須寫(xiě)成 pi ,三角函數(shù)若不是tanN形式的話,要加上括號(hào)如tan (a+b),這是由于控 制臺(tái)輸入的限制和為了輸入后便于處理。子函數(shù)流程:從運(yùn)
2、算式子中讀出數(shù)字和字符, 分別存于一個(gè)隊(duì)列中 -> 按順序取出數(shù)字與字符, 進(jìn)行乘方運(yùn)算, 其他的再一次放回隊(duì)列中 -> 依次再取出進(jìn)行三角函數(shù)和對(duì)數(shù)的運(yùn)算, 其他依次放回 -> 再依次取出進(jìn)行乘除和取模運(yùn)算, 其他依次放回 -> 現(xiàn)在只剩下加減運(yùn)算, 依次取出計(jì)算,得到最后的結(jié)果。關(guān)鍵技術(shù):一、c+的sstream流的運(yùn)用,可以從中分別讀出運(yùn)算式子的數(shù)字與字符還有去除括號(hào)時(shí)將未處理字符(即非括號(hào)內(nèi)的字符)以及括號(hào)內(nèi)的子式處理結(jié)果輸出到流中,便于迭代去除括號(hào)。2、 對(duì)沒(méi)括號(hào)的式子進(jìn)行分級(jí)處理。3、 將式子的字符以及數(shù)字分開(kāi)處理。源代碼如下:#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;/ 拋出異常/將三角函數(shù)名化為數(shù)字與&字符,便于識(shí)別和計(jì)算以及將對(duì)數(shù)函數(shù)以及階乘以及開(kāi)方將pi/?;癁閿?shù)字size_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);/去除括號(hào)while (s. find("(") != -1|s. find(")&quo
7、t;)!=-1)std:ostringstream uout;/ 存儲(chǔ)未處理字符auto left = s. begin();/記錄左括號(hào)位置auto right = s. begin();/記錄右括號(hào)位置while (right != s. end()/ 處理最里層括號(hào)里的字符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、一對(duì)括號(hào)后的字符串賦給s/計(jì)算最后結(jié)果 double result = calculate(s);/輸出結(jié)果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、"缺左括號(hào)!" << endl; break;case 3: cout << "缺右括號(hào)!" << endl; break;case 4: cout << "運(yùn)算符相連或?qū)?shù)等復(fù)活寫(xiě)錯(cuò)! " << endl;break;default:;system("pause");return 0;double calculate( std:string s)/將數(shù)字和運(yùn)算符分別裝入雙向隊(duì)列和隊(duì)列適配器中std:deque<double> number;s
11、td:queue<char> symbol;std:istringstream uin(s);symbol. push('+');/ 添加加號(hào)為第一個(gè)運(yùn)算符double tpn; char tpc;while (uin >> tpn >> tpc)number. push_back(tpn), symbol. push(tpc);if (!uin. eof() throw 4;/ 拋出異常number. push_back(tpn);/ 添加最后一個(gè)數(shù)字/計(jì)算乘方for (int i = 0, n = number. size(); i &l
12、t; n; +i)tpc = symbol. front(); symbol. pop();取出運(yùn)算符tpn = number. front(); number. pop_front();取出數(shù)字if (tpc ='八')計(jì)算乘方double temp = number. back();number. back() = pow(temp, tpn);elsesymbol. push(tpc);/ 放回隊(duì)列,置于最后精品資料number. push_back(tpn);/ 放回隊(duì)列,置于最后/計(jì)算三角函數(shù)以及對(duì)數(shù) for (int i = 0, n = number. size(
13、); i < n; +i)tpc = symbol. front(); symbol. pop();取出運(yùn)算符tpn = number. front(); number. pop_front();取出數(shù)字if (tpc = '&')/ 計(jì)算乘方以及對(duì)數(shù)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 = '')/ 計(jì)算對(duì)數(shù)double temp = number. back();number. back() = log(tpn) / log(temp);else if (tpc = '$')/ 計(jì)算階乘int n = number. back();number. back() = 1;for (in
15、t i = 1; i <= n; +i) number. back() *= i;elsesymbol. push(tpc);/ 放回隊(duì)列,置于最后number. push_back(tpn);/ 放回隊(duì)列,置于最后/計(jì)算乘除以及取模運(yùn)算for (int i = 0, n = number. size(); i < n; +i)tpc = symbol. front(); symbol. pop();取出運(yùn)算符tpn = number. front(); number. pop_front();取出數(shù)字if (tpc = '+' | tpc = '-')symbol. push(tpc);number. push_back(tpn);else if (tpc = '*')number. back() *= tpn;/ 計(jì)算乘else if (tpc = '/')number. back() /= tpn;/ 計(jì)算除else/取模運(yùn)算double temp = number. back();temp = int(temp) % int(tpn);number. back() = temp;/計(jì)算加減得出結(jié)果double resu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同管理制度職責(zé)
- 農(nóng)業(yè)科技園區(qū)規(guī)劃設(shè)計(jì)與運(yùn)營(yíng)管理手冊(cè)
- 2025年毫州考從業(yè)資格證貨運(yùn)試題
- 家政公司家政服務(wù)合同
- 建筑鋼筋班組合同8篇
- 購(gòu)銷合同格式
- 房屋代理出租合同
- 建繼續(xù)教育建設(shè)工程合同管理
- 2025年景德鎮(zhèn)貨運(yùn)從業(yè)資格證考試試題及答案
- 第07講 文言文翻譯 講義 中考語(yǔ)文復(fù)習(xí)
- 2024-2025學(xué)年八年級(jí)地理下冊(cè)第七章《南方地區(qū)》檢測(cè)卷(人教版)
- 2025年湖南鐵路科技職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)參考答案
- 《ISO 56000-2025創(chuàng)新管理 基礎(chǔ)和術(shù)語(yǔ)》之1:“引言+范圍+術(shù)語(yǔ)和定義”專業(yè)深度解讀與應(yīng)用指導(dǎo)材料(雷澤佳編寫(xiě)2025A0)-1-150
- DB37-T4817-2025 瀝青路面就地冷再生技術(shù)規(guī)范
- 2025年公共營(yíng)養(yǎng)師三級(jí)理論試題及答案
- 提高設(shè)備基礎(chǔ)預(yù)埋螺栓一次安裝合格率
- 煤礦防治水安全質(zhì)量標(biāo)準(zhǔn)化評(píng)分表
- 2024年科技節(jié)小學(xué)科普知識(shí)競(jìng)賽題及答案(共100題)
- 2025年度教育培訓(xùn)機(jī)構(gòu)學(xué)生綜合素質(zhì)評(píng)價(jià)協(xié)議3篇
- 氧氣管道吹掃、打壓方案
- 第28課 改革開(kāi)放和社會(huì)主義現(xiàn)代化建設(shè)的巨大成就 教學(xué)設(shè)計(jì)(表格式)必修 中外歷史綱要(上)
評(píng)論
0/150
提交評(píng)論