


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一些說明:本程序支持基本的四則運(yùn)算,三角函數(shù)運(yùn)算(sin , cos, tan ), 指數(shù)運(yùn)算,以及對數(shù)運(yùn)算(lg,ln,log ),取模運(yùn)算,同時(shí)還支持 括號(hào)!主函數(shù)流程:輸入運(yùn)算式子-> 判斷是否有異常字符-> 對式子進(jìn)行處理以 便于計(jì)算-> 調(diào)用計(jì)算沒有括號(hào)的式子的函數(shù)去除括號(hào),即先計(jì)算括 號(hào)里的子式-> 最后得到?jīng)]有括號(hào)的式子,在調(diào)用函數(shù)計(jì)算得到結(jié) 果。值得注意的是輸入運(yùn)算式子時(shí),"& J必須寫成alogb,庇必須 寫成pi,三角函數(shù)若不是tanN形式的話,要加上括號(hào)如tan (a+b), 這是由于控制臺(tái)輸入的限制和為了輸入后便于處理。子函數(shù)流
2、程:從運(yùn)算式子中讀出數(shù)字和字符,分別存于一個(gè)隊(duì)列中-> 按順序 取出數(shù)字與字符,進(jìn)行乘方運(yùn)算,其他的再一次放回隊(duì)列中-> 依次 再取出進(jìn)行三角函數(shù)和對數(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)。二、對沒括號(hào)的式子進(jìn)行分級(jí)處理。三、將式子的字符以及數(shù)字分開處理。源代碼如下:#inClude<iostre
3、am>#inClude<sstream>#inClude<string>#inClude<Cmath>#inClude<queue>#define pi 3.141592654double CalCulate( std : string );int main()/輸入式子,存于S中std: string s;Std: getline ( Std : cin , S);/ 拋出異常try/ 判斷是否有異常字符conSt Std: String jubge = "1234567890 tan Sin coS +-*/八(|) log
4、In lg sqrt pi!"for (conSt auto &i : S)if (jubge. find (i) = -1)throw 1;/ 拋出異常/ 將三角函數(shù)名化為數(shù)字與 &字符,便于識(shí)別和計(jì)算/以及將對數(shù)函數(shù)/以及階乘/以及開方/將pi/ n化為數(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, &
5、quot;2&");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") !=
6、 -1)s. replace (n, 4, "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 ("
7、;(") != -1|s. find (")")!=-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 i
8、f (*right = ')')if (*left != '(') throw 2;/拋出異常uout << calculate( std: string (left + 1,right);break;else if (*left != '(') uout << *right;else;+right;if (*left = '('&&right = s.end() throw 3;/拋出異常end(); +i)/輸出for (auto i = right + 1; i != s.剩余未處理符
9、uout << *i;s = uout. str ();/ 將處理一對括號(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 << " 式子中有異常字符! "
10、; << endl; break;case 2: cout << " 缺左括號(hào)! " << endl; break;case 3: cout << " 缺右括號(hào)! " << endl; break;case 4: cout << " 運(yùn)算符相連或?qū)?shù)等復(fù)活寫錯(cuò)! " << endl; break;default:;system("pause");return 0;double calculate( std: string s)/ 將
11、數(shù)字和運(yùn)算符分別裝入雙向隊(duì)列和隊(duì)列適配器中std: deque<double> number;std: 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);/ 添
12、加最后一個(gè)數(shù)字/ 計(jì)算乘方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 = '")/計(jì)算乘方double temp = number. back();number. back() = pow(temp, tpn);elsesymbol. push(tpc);/ 放回隊(duì)列,置于最后number. push_back(tp
13、n);/ 放回隊(duì)列,置于最后 / 計(jì)算三角函數(shù)以及對數(shù)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 = '&')/計(jì)算乘方以及對數(shù)switch (int(number. back()case 1:number.back() =sin (tpn); break;case 2:number.back() =cos(t
14、pn); break;case 3:number.back() =tan (tpn); break;case 4:number.back() =log (tpn); break;case 5:number.back() =log10 (tpn); break;case 6:number.back() =sqrt (tpn); break;default:;double temp = number. back(); number. back() = log (tpn) / log (temp);else if (tpc = '$')/計(jì)算階乘int n = number. bac
15、k();number. back() = 1;for (int 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
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政管理心理學(xué)與組織績效提升的路徑研究試題及答案
- 行政管理的優(yōu)勢與不足分析試題及答案
- 行政公文的評(píng)估標(biāo)準(zhǔn)試題及答案
- 行政管理中公文流程的優(yōu)化試題及答案
- 行政管理市政學(xué)課程特色試題及答案
- 知識(shí)綜合運(yùn)用水利水電工程試題及答案
- 施工過程中的合同管理試題及答案
- 中級(jí)經(jīng)濟(jì)師考試題型深入探討試題及答案
- 探索公共關(guān)系學(xué)師職關(guān)系中的潛在問題及試題及答案
- 行政管理中的公共健康政策研究試題及答案
- GB/T 10599-2023多繩摩擦式提升機(jī)
- 蜜蜂的傳粉過程
- 公招資格復(fù)審個(gè)人委托書
- Python程序設(shè)計(jì)項(xiàng)目化教程
- 雙護(hù)筒旋挖鉆孔施工工法
- 人教版八年級(jí)物理下冊 實(shí)驗(yàn)題05 簡單機(jī)械實(shí)驗(yàn)(含答案詳解)
- 山西靈石紅杏廣進(jìn)寶煤業(yè)有限公司新建煤矸石綜合治理及土地復(fù)墾項(xiàng)目環(huán)評(píng)報(bào)告
- 睡蓮花卉欣賞與養(yǎng)護(hù)
- 出生證明英語翻譯模板
- 歷史中考熱點(diǎn)專題
評(píng)論
0/150
提交評(píng)論