C++計(jì)算數(shù)學(xué)計(jì)算式內(nèi)附源碼及附件_第1頁
C++計(jì)算數(shù)學(xué)計(jì)算式內(nèi)附源碼及附件_第2頁
C++計(jì)算數(shù)學(xué)計(jì)算式內(nèi)附源碼及附件_第3頁
C++計(jì)算數(shù)學(xué)計(jì)算式內(nèi)附源碼及附件_第4頁
C++計(jì)算數(shù)學(xué)計(jì)算式內(nèi)附源碼及附件_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

溫馨提示程序語言:C、C++、C*、Python〔紅色字體表示本課設(shè)使用的程序設(shè)計(jì)語言〕圖形功能選項(xiàng):Win32控制臺(tái)程序〔黑框、文本界面〕、Win32程序、MFC、WinForm、Direct*10〔黑體標(biāo)明表示本課設(shè)的程序圖形類別,默認(rèn)為非圖形界面Win32控制臺(tái)程序〕數(shù)據(jù)構(gòu)造:根底類型、數(shù)組、鏈表、雙向鏈表、搜索樹〔非平衡二叉樹〕、平衡二叉樹、鏈表與平衡二叉樹相結(jié)合、堆棧、隊(duì)列、串、圖〔黑體標(biāo)明表示本課設(shè)使用的數(shù)據(jù)構(gòu)造〕C++語言項(xiàng):STL庫〔黑體標(biāo)明表示使用C++的STL庫〕編譯環(huán)境:Windows764位旗艦版〔Linu*及其他環(huán)境請慎重下載〕集成開發(fā)環(huán)境:VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015均可通過編譯?!矞\藍(lán)色字體表示無法通過編譯〕分多頭文件編譯:否〔所有代碼根本都包含在一個(gè)文件,如需試驗(yàn)頭文件功能,請自行參考相關(guān)文獻(xiàn)〕容說明:1、課設(shè)題目及預(yù)覽容將在第二頁開場展示。2、代碼行數(shù):175行3、目錄所示容,本文根本涵蓋,如無容,會(huì)在本頁進(jìn)展說明。4、附錄絕對包含用戶使用手冊及程序完整源代碼和詳細(xì)注釋。5、如需下載其他頭文件〔例如Direct*需另行配置〕,本文會(huì)在此進(jìn)展說明。6、本文撰寫容僅供學(xué)習(xí)參考,另外,由于本人水平有限,編寫之處難免存在錯(cuò)誤和紕漏,懇請各位教師或同學(xué)批評指正。題目:輸入一個(gè)算式,并計(jì)算結(jié)果表1整體思路首先,從屏幕讀入一個(gè)字符串存儲(chǔ)到str,比方1/20-5+((2-10*5)+5-10*2)開場將中綴表達(dá)式添加到字符串隊(duì)列:stringQueueMiddle第一,檢索str里的字符,如果是數(shù)字就添加到strNumber字符串的末尾第二,檢索str里的字符,如果遇到+-*/,就將strNumber數(shù)字進(jìn)隊(duì),strSymbol運(yùn)算符進(jìn)隊(duì)循環(huán)進(jìn)展,直到到達(dá)str的末尾。其次,將中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式,將其添加到字符串隊(duì)列stringQueueBack第一,遇到數(shù)字就直接將數(shù)字字符串添加到隊(duì)列第二,如果stringStack棧為空,則將運(yùn)算符字符進(jìn)棧第三,如果stringStack棧不為空,假設(shè)第一個(gè)運(yùn)算符的優(yōu)先級小于等于棧頂?shù)倪\(yùn)算符的優(yōu)先級,則先把棧的所有高于等于第一個(gè)運(yùn)算符添加到隊(duì)列〔然后出棧〕,再把低或等的運(yùn)算符壓入棧第四,如果遇到左括號(hào),則直接壓棧第五,遇到右括號(hào),則直接把左括號(hào)右邊的所有運(yùn)算符出棧,添加到隊(duì)列表2中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式例子例如1/20-5+((2-10*5)+5-10*2)stringQueueMiddle(中綴表達(dá)式隊(duì)列)stringStack(棧)stringQueueBack(后綴表達(dá)式隊(duì)列)1/20-5+((2-10*5)+5-10*2)/20-5+((2-10*5)+5-10*2)1遇到數(shù)字直接入隊(duì)20-5+((2-10*5)+5-10*2)/1???,運(yùn)算符入棧-5+((2-10*5)+5-10*2)120遇到數(shù)字直接入隊(duì)5+((2-10*5)+5-10*2)-120/-的優(yōu)先級低于/+((2-10*5)+5-10*2)120/5-遇到數(shù)字直接入隊(duì)((2-10*5)+5-10*2)+120/5--與+運(yùn)算符的優(yōu)先級一樣,則先出棧,在入棧(2-10*5)+5-10*2)+(120/5-遇到(,直接入棧2-10*5)+5-10*2)+((120/5-同上-10*5)+5-10*2)+((120/5-210*5)+5-10*2)+((-120/5-2因?yàn)?在棧里,(的優(yōu)先級最低*5)+5-10*2)+((-120/5-2105)+5-10*2)+((-*120/5-210*的優(yōu)先級高于-,入棧)+5-10*2)+((-*120/5-2105+5-10*2)+(120/5-2105*-遇到),則把第一個(gè)(之前的所有運(yùn)算符彈出入隊(duì),并出棧(5-10*2)+(+120/5-2105*--10*2)+(+120/5-2105*-510*2)+(-120/5-2105*-5+優(yōu)先級相等的運(yùn)算符彈出入隊(duì),-入棧*2)+(-120/5-2105*-5+102)+(-*120/5-2105*-5+10*優(yōu)先級高于-,入棧)+(-*120/5-2105*-5+102120/5-2105*-5+102*-+遇到),彈出所有運(yùn)算符,并且中綴表達(dá)式到達(dá)結(jié)尾,彈出所有運(yùn)算符表3后綴表達(dá)式計(jì)算例子120/5-2105*-5+102*-+后綴表達(dá)式計(jì)算遇到數(shù)字就壓棧,只要遇到運(yùn)算符就把棧中的兩個(gè)數(shù)字拿出來運(yùn)算,把運(yùn)算結(jié)果再壓到棧中stringQueueBack(后綴表達(dá)式隊(duì)列)stringStack(棧)120/5-2105*-5+102*-+20/5-2105*-5+102*-+1數(shù)字則入棧/5-2105*-5+102*-+120遇到運(yùn)算符,則把棧頂?shù)膬蓚€(gè)數(shù)字彈出來運(yùn)算,將運(yùn)算結(jié)果壓棧,1/20=00.55-2105*-5+102*-+0.05-2105*-5+102*-+0.055先彈出來的作為右運(yùn)算數(shù)〔0.05-5〕2105*-5+102*-+-4.95105*-5+102*-+-4.9525*-5+102*-+-4.95210*-5+102*-+-4.952105彈出10*5,計(jì)算結(jié)果50入棧-5+102*-+-4.95250彈出2-50,計(jì)算結(jié)果-48入棧5+102*-+-4.95-48+102*-+-4.95-485102*-+-4.95-432*-+-4.95-4310*-+-4.95-43102-+-4.95-4320+-4.95-63-67.95注:空白處步驟類似,不再贅述運(yùn)行結(jié)果如下列圖所示:附錄用戶使用手冊1、根據(jù)提示,輸入一條計(jì)算式即可。2、開頭無法輸入負(fù)數(shù),否則程序會(huì)崩潰。3、輸入的計(jì)算式需正確,否則會(huì)崩潰程序源代碼*include<iostream>*include<stack>*include<queue>*include<string>*include<cctype>*include<stdio.h>*include<stdlib.h>*pragmawarning(disable:4996)usingnamespacestd;classE*pression{public:voidsetE*pression(); //從屏幕獲取一行計(jì)算式子voidcalculationResult(); //計(jì)算出結(jié)果,并輸出private:voidtransformation(); //將中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式stack<string>stringStack; //棧queue<string>stringQueueMiddle; //存儲(chǔ)中綴表達(dá)式的隊(duì)列queue<string>stringQueueBack; //存儲(chǔ)后綴表達(dá)式的隊(duì)列};voidE*pression::setE*pression(){charch[200];stringstr; //獲取屏幕的表達(dá)式stringstrNumber; //暫時(shí)存儲(chǔ)數(shù)字stringstrSymbol; //暫時(shí)存儲(chǔ)運(yùn)算符inti=0; cout<<"請輸入一個(gè)表達(dá)式〔不需要輸入=,請不要輸入無謂的字符隔開,比方空格〕:"<<endl; cout<<"\t"; cin.getline(ch,200); str=ch;for(i=0;i<str.size();i++){if(str[i]>='0'&&str[i]<='9'||'.'==str[i]){ strNumber+=str[i]; }else{ stringQueueMiddle.push(strNumber); //將數(shù)字添加到隊(duì)列 strNumber.clear(); //清空字符串 strSymbol+=str[i]; stringQueueMiddle.push(strSymbol); //將符號(hào)添加到隊(duì)列 strSymbol.clear(); //清空字符串 } }//將最后一個(gè)數(shù)字添加到隊(duì)列 stringQueueMiddle.push(strNumber); //將數(shù)字添加到隊(duì)列 strNumber.clear(); //清空字符串 transformation();}voidE*pression::transformation(){inti=0;for(;!stringQueueMiddle.empty();stringQueueMiddle.pop()){if(isdigit(stringQueueMiddle.front()[0])) //判斷該字符串的第一個(gè)字符是否為數(shù)字 stringQueueBack.push(stringQueueMiddle.front()); //純數(shù)字則將該字符串添加到后綴表達(dá)式隊(duì)列elseif(stringStack.empty()||'('==stringQueueMiddle.front()[0]) stringStack.push(stringQueueMiddle.front()); //如果棧空或者遇到(,則直接進(jìn)棧elseif('+'==stringQueueMiddle.front()[0]||'-'==stringQueueMiddle.front()[0]){if(!stringStack.empty()&&'*'==stringStack.top()[0]||'/'==stringStack.top()[0]){ //棧不空,則棧中有*/則出棧//棧中只要有連續(xù)的+-*/就出棧,且棧不能為空,遇到(也不出棧for(;!stringStack.empty()&&'('!=stringStack.top()[0];stringStack.pop()) stringQueueBack.push(stringStack.top()); //*/進(jìn)入后綴表達(dá)式隊(duì)列 }elseif(!stringStack.empty()&&'+'==stringStack.top()[0]||'-'==stringStack.top()[0]){ //如果遇到同等級的運(yùn)算符,則先出棧再進(jìn)棧 stringQueueBack.push(stringStack.top()); stringStack.pop(); //棧頂出棧 } stringStack.push(stringQueueMiddle.front()); //+-優(yōu)先級低,直接進(jìn)棧 }elseif('*'==stringQueueMiddle.front()[0]||'/'==stringQueueMiddle.front()[0]){if(!stringStack.empty()&&'*'==stringStack.top()[0]||'/'==stringStack.top()[0]){ //棧不空,則棧中有*/則出棧 stringQueueBack.push(stringStack.top()); //進(jìn)后綴表達(dá)式的隊(duì) stringStack.pop(); } stringStack.push(stringQueueMiddle.front()); //進(jìn)棧 }elseif(')'==stringQueueMiddle.front()[0]){ //遇到右括號(hào),則左括號(hào)之前的運(yùn)算符都彈出for(;'('!=stringStack.top()[0];stringStack.pop()) stringQueueBack.push(stringStack.top()); //運(yùn)算符依次進(jìn)入后綴表達(dá)式隊(duì)列 stringStack.pop(); //彈出( } }for(;!stringStack.empty();stringStack.pop()){ //中綴表達(dá)式掃描完畢,則棧中的所有運(yùn)算符彈出if('('!=stringStack.top()[0]) stringQueueBack.push(stringStack.top()); //將棧中的運(yùn)算符添加到后綴表達(dá)式隊(duì)列 }}voidE*pression::calculationResult(){doubleback=0.0; //記錄第一個(gè)從棧頂彈出來的元素doublefront=0.0; //記錄第二個(gè)從棧頂彈出來的元素doubleresult=0.0; //記錄運(yùn)算結(jié)果charch[100];stringstr;for(;!stringQueueBack.empty();stringQueueBack.pop()){if(isdigit(stringQueueBack.front()[0])) //判斷該字符串的第一個(gè)字符是否為數(shù)字 stringStack.push(stringQueueBack.front()); //純數(shù)字則將該字符串進(jìn)棧else{ //遇到運(yùn)算符switch(stringQueueBack.front()[0]) {case'+': back=atof(stringStack.top().c_str()); //彈出第一個(gè)棧頂元素 stringStack.pop(); front=atof(stringStack.top().c_str()); //彈出第二個(gè)棧頂元素 stringStack.pop(); result=front+back; sprintf(ch,"%lf",result); //將浮點(diǎn)數(shù)轉(zhuǎn)換成字符串 str=ch; stringStack.push(str);break;case'-': back=atof(stringStack.top().c_str()); //彈出第一個(gè)棧頂元素 stringStack.pop(); front=atof(stringStack.top().c_str()); //彈出第二個(gè)棧頂元素 stringStack.pop(); result=front-back; sprintf(ch,"%lf",result); //將浮點(diǎn)數(shù)轉(zhuǎn)換成字符串 str=ch; stringStack.push(str);break;case

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論