版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
班級(jí):計(jì)科111班學(xué)號(hào):2011081113姓名:羅明芳題目:計(jì)算表達(dá)式的值一:問題描述問題描述:計(jì)算表達(dá)式的值,對(duì)于給定的一個(gè)表達(dá)式,表達(dá)式中可以包括整數(shù)或小數(shù)、算術(shù)運(yùn)行符(“+”、“-”、“*”、“/”)和括號(hào),編寫程序計(jì)算表達(dá)式的值。2?基本要求:從鍵盤輸入一個(gè)正確的中綴表達(dá)式,將中綴表達(dá)式轉(zhuǎn)換為對(duì)應(yīng)的后綴表達(dá)式,計(jì)算后綴表達(dá)式的值。二:需要分析軟件的基本功能本程序能計(jì)算出含+、-、*、/、(、)等運(yùn)算符的簡(jiǎn)單運(yùn)算。輸入的形式和輸入值的范圍根據(jù)題目要求與提示,在輸入一個(gè)中綴表達(dá)式,輸入數(shù)的范圍為int或float型,此時(shí),程序?qū)⒂?jì)算出表達(dá)式的結(jié)果。當(dāng)按照程序輸入表達(dá)式;程序?qū)F(xiàn)將中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式并計(jì)算出結(jié)果。測(cè)試數(shù)據(jù)輸入一個(gè)中綴表達(dá)式,例如輸入3*(4+2)/2-5#,那么輸出結(jié)果是4;如果輸入表達(dá)式?jīng)]有結(jié)束標(biāo)示符#,如3*(4+2)/2-5,那將不會(huì)輸出任何結(jié)果,或出現(xiàn)錯(cuò)誤結(jié)果。三:概要設(shè)計(jì)首先設(shè)計(jì)一個(gè)棧模板定義一個(gè)運(yùn)算對(duì)象棧Intstack<float>n,一個(gè)運(yùn)算符棧Intstackvchar>m。ADTInitStackData棧中元素具有相同類型及后進(jìn)先出的特性,相鄰元素具有前驅(qū)和后繼關(guān)系基本操作:InitStack()前置條件:棧不存在輸入:無功能:棧的初始化輸出:無后置結(jié)果:構(gòu)造一個(gè)空棧DestroyStack()前置條件:棧已存在輸入:無功能:銷毀棧輸出:無后置條件:釋放棧所占用的空間GetTop()前置條件:棧S已存在輸入:無功能:取棧頂元素,讀取當(dāng)前的棧頂元素輸出:若棧不空,返回當(dāng)前的棧頂元素值后置條件:棧不變Push(x)前置條件:棧已存在輸入:元素值X功能:入棧操作,在棧頂插入一個(gè)元素值輸出:如果插入不成功,則拋出異常后置條件:如果插入成功,則棧頂增加了一個(gè)元素Pop()前置條件:棧已存在輸入:無功能:出棧操作,刪除棧頂元素輸出:如果刪除成功,返回被刪元素值操作結(jié)果:刪除S的棧頂元素。Empty()前置條件:棧已存在輸入:無功能:判空操作,判斷棧是否為空輸出:如果棧為空,返回1,否則返回0后置條件:棧不變endADT對(duì)于輸入的表達(dá)式進(jìn)行判斷如果輸入錯(cuò)誤,就提示出來,并返回1如果沒有錯(cuò)誤,就返回0intjudge(chara[])如果返回0,就繼續(xù)進(jìn)行以下運(yùn)算,否則返回主界面中綴表達(dá)式變后綴表達(dá)式voidorder(chara[])偽代碼如下:將運(yùn)算符棧s初始化為空棧。從左到右依次掃描表達(dá)式的每一個(gè)字符,執(zhí)行下列操作。若當(dāng)前字符是運(yùn)算對(duì)象,則輸出該字符,處理下一個(gè)字符若當(dāng)前字符是運(yùn)算符且優(yōu)先級(jí)比棧s的棧頂運(yùn)算符的優(yōu)先級(jí)高,則將字符入棧s,處理下一個(gè)字符。若當(dāng)前字符是運(yùn)算符且優(yōu)先級(jí)比棧s的棧頂運(yùn)算符的優(yōu)先級(jí)低,則將棧s的棧頂元素彈出并輸出。若當(dāng)前字符是運(yùn)算符且優(yōu)先級(jí)與棧s的棧頂運(yùn)算符的優(yōu)先級(jí)相等,則將棧s的棧頂元素彈出,處理下一字符。算出表達(dá)式的結(jié)果voidFunction(chara[])偽代碼如下:將對(duì)象棧n初始化為空,將字符站m也初始化為空。從左到右掃描表達(dá)式的的每一個(gè)字符執(zhí)行下列操作,指導(dǎo)遇到結(jié)束語‘#'2.1若當(dāng)前字符是運(yùn)算對(duì)象,則入棧n。2.2若當(dāng)前字符是運(yùn)算符且優(yōu)先級(jí)比棧m的棧頂運(yùn)算符的優(yōu)先級(jí)高,則入棧m,處理下一個(gè)字符。2.3若當(dāng)前字符是運(yùn)算符且優(yōu)先級(jí)比棧m的棧頂運(yùn)算符的優(yōu)先級(jí)低,則從棧n出棧兩個(gè)運(yùn)算對(duì)象,從棧m中出棧一個(gè)運(yùn)算符進(jìn)行運(yùn)算,并將運(yùn)算結(jié)果入棧n,繼續(xù)處理下一個(gè)字符。2.4若當(dāng)前字符是運(yùn)算符且優(yōu)先級(jí)與棧m的棧頂運(yùn)算符的優(yōu)先級(jí)相同,則將棧m的棧頂運(yùn)算符出棧,處理下一個(gè)字符。輸出棧n的棧頂元素,既表達(dá)式的運(yùn)算結(jié)果。四?主程序流程及模塊調(diào)用關(guān)系結(jié)束四:詳細(xì)設(shè)計(jì)模板templatevtypenameT>structnode{Tdata;nodevT>*next;};templatevtypenameT>classIntstack{public:friendostream&operatorvv(ostream&,IntstackvT〉&);〃運(yùn)算符重載Intstack();voidpush(T);Tpop();intempty();voidget(T&,T&);TGettop();~Intstack();private:node<T>*top;};#endiftemplatevtypenameT>ostream&operatorvv(ostream&os,IntstackvT>&in)〃輸出重載{while(in.top){osvvin.top->datavv'\t';in.top=in.top->next;}osvvendl;returnos;}templatevtypenameT>IntstackvT>::Intstack()〃構(gòu)造函數(shù){top=NULL;}templatevtypenameT>voidIntstackvT>::push(Tp)//入棧操作{nodevT>*s;s=newnodevT>;s->data=p;s->next=top;top=s;}templatevtypenameT>//出棧操作TIntstackvT>::pop(){nodevT>*p;Tx;p=top;x=top->data;top=top->next;deletep;returnx;}templatevtypenameT>intIntstackvT>::empty()〃判空操作{returntop==NULL?1:0;}templatevtypenameT>TIntstackvT>::Gettop(){returntop->data;〃取棧頂兀素}templatevtypenameT> 〃取棧兀素voidIntstackvT>::get(T&numl,T&num2){num1=pop();num2=pop();}templatevtypenameT>Intstack<T>::~Intstack()〃析構(gòu)函數(shù){nodevT>*p;while(top){p=top;top=top->next;deletep;}}優(yōu)先級(jí)判斷intprior(charp){intj=0;switch(p){case'(':case')':j=9;break;case'*':case'/':j=8;break;case'+':case'-':j=7;break;case'#':j=6;break;}returnj;}判斷輸入的表達(dá)式是否正確intjudge(chara[]){inti=0;intm=0;intn=0;intp=0;intr=1;while(a[i]!='#'){inty=i+l;intx=i-1;if(a[i]=='(')m++;elseif(a[i]==')')n++;elseif(a[i]>='0'&&a[i]v=9){if(a[x]==')'){-cout<<"錯(cuò)誤"vvr<<':'<<''<<a[i]<<"沒有左運(yùn)算符!"<<endl;p++;r++;}if(a[y]=='('){_coutvv"錯(cuò)誤"vvrvv':'<<''vva[i]vv"沒有右運(yùn)算符!"vvendl;p++;r++;}}elseif(a[i]='.'){}elseif(a[i]=='+'lla[i]=='-'lla[i]=='*'lla[i]=='/'){if(a[i]=='/'){if(a[y]=='0'){cout<< "錯(cuò)誤"vvrvv':'vv''<<a[i]<<"后被除數(shù)不能是零!"vvendl;P++;r++;}}if(a[x]=='('lla[x]=='+'lla[x]=='-'lla[x]=='*'lla[x]=='/'){-cout<<"錯(cuò)誤"<<r<<':'<<&□]<<"沒有左運(yùn)算對(duì)象!"<<endl;P++;r++;}if(a[y]==')'lla[y]=='+'lla[y]=='-'lla[y]=='*'lla[y]=='/'){_cout<<"錯(cuò)誤"<<r<<':'<<''<<a[i]<<"沒有右運(yùn)算對(duì)象!"<<endl;P++;r++;}}else{if(i!=0){cout<<"錯(cuò)誤"<<[<<':'<<"輸入字符'"<<a[i]<<"'不正確!"vvendl;P++;r++;}}i++;}if(m!=n){coutvv"錯(cuò)誤"vvrvv':'vv"左右括號(hào)不相等"vvendl;return1;if(p!=O)return1;elsereturn0;}中綴表達(dá)式變后綴表達(dá)式voidorder(chara[]){inti=0;floats=0;Intstackvchar>m;while(a[i]){if(a[i]>='0'&&a[i]v=9)//十位數(shù)以上的數(shù)據(jù)處理{s=s*10.0+(float(a[i])-48);i++;}else{if(a[i]=='.')//處理小數(shù){floatj=1;i++;while(a[i]>='0'&&a[i]v=9){j=j*1O;intt=(float)a[i]-48;s=s+t/j;i++;}}if(s!=0)//數(shù)據(jù)輸出{cout<<svv'';s=0;}if(m.empty()=l)〃字符??諘r(shí){m.push(a[i]);i++;}else{if(prior(a[i])>prior(m.Gettop()))//當(dāng)前優(yōu)先級(jí)大于棧優(yōu)先級(jí){if(a[i]!=')'){m.push(a[i]);i++;}else{while(m.Gettop()!='('){cout<<m.pop()vv'';}m.pop();i++;}}elseif(prior(a[i])<prior(m.Gettop()))//當(dāng)前優(yōu)先級(jí)小于棧優(yōu)先級(jí){if(a[i]!='#')〃處理特殊情況#{if(m.Gettop()=='(')//處理特殊情況({m.push(a[i]);i++;}else{cout<<m.pop()vv'';else{while(m.empty()!=l){cout<<m.pop()<<'';}i++;}}else〃當(dāng)前優(yōu)先級(jí)等于棧優(yōu)先級(jí){cout<<m.pop()<<'';m.push(a[i]);i++;}}}}cout<<endl;}計(jì)算表達(dá)式結(jié)果voidFunction(chara[]){floats=0;inti=0;floatnum1=0;floatnum2=0;Intstackvchar>m;Intstackvfloat>n;inttmp=0;while(a[i]){if(a[i]>='0'&&a[i]v=9)//十位數(shù)整數(shù)以上的數(shù)據(jù)處理{s=s*10.0+(float(a[i])-48);i++;}else{if(a[i]=='.')//處理小數(shù){floatj=1;i++;while(a[i]>='0'&&a[i]v=9){j=j*10;intt=(float)a[i]-48;s=s+t/j;i++;}}if(s!=O){n.push(s);//數(shù)據(jù)入棧s=0;}if(m.empty()=1)〃字符??諘r(shí){m.push(a[i]);i++;}else{〃當(dāng)前優(yōu)先級(jí)大于棧優(yōu)先級(jí)時(shí)if(prior(a[i])>prior(m.Gettop())){if(a[i]!=')') 〃處理后括號(hào)的情況{m.push(a[i]);i++;}else{while(m.Gettop()!='('){n.get(num1,num2);charc=m.pop();switch(c){case'*':n.push(num1*num2);break;case'/':n.push(num2/num1);break;case'+':n.push(num2+numl);break;case'-':n.push(num2-num1);break;}}m.pop();i++;}}〃當(dāng)前棧優(yōu)先級(jí)小于棧優(yōu)先級(jí)時(shí)elseif(prior(a[i])vprior(m.Gettop())){if(a[i]!='#') 〃處理'#'的情況{if(m.Gettop()!='(')〃處理的'('情況{n.get(num1,num2);charc=m.pop();switch(c){case'*':n.push(num1*num2);break;case'/':n.push(num2/num1);break;case'+':n.push(num2+num1);break;case'-':n.push(num2-num1);break;}m.push(a[i]);i++;}else{m.push(a[i]);i++;}else{while(m.empty()!=l){n.get(num1,num2);charc=m.pop();switch(c){case'*':n.push(num1*num2);break;case'/':n.push(num2/num1);break;case'+':n.push(num2+num1);break;case'-':n.push(num2-num1);break;}}i++;}}〃當(dāng)前優(yōu)先級(jí)等于棧的優(yōu)先級(jí)else{n.get(num1,num2);charc=m.pop();switch(c){case'*':n.push(num1*num2);break;case'/':n.push(num2/num1);break;case'+':n.push(num2+numl);break;case'-':n.push(num2-num1);break;}m.push(a[i]);i++;}}}}coutvvn.Gettop()vvendl;}主函數(shù),實(shí)現(xiàn)函數(shù)的調(diào)用intmain(){cout<<setw(50)<<"歡迎使用本小型計(jì)算系統(tǒng)"vvendl;coutvvendl;while(l){coutvv"請(qǐng)選擇操作:1.表達(dá)式計(jì)算 2.退出該系統(tǒng)"vvendl;charx;cin>>x;cin.ignore();switch(x){caseT:{coutvv"請(qǐng)請(qǐng)輸入中綴表達(dá)式,以'#'號(hào)結(jié)束:"vvendl;chara[size];cin.getline(a,size,'\n');coutvvendl;if(judge(a)!=1){cout<<"變?yōu)楹缶Y表達(dá)式為:"vvendl;order(a);coutvvendl;coutvv"表達(dá)式運(yùn)算結(jié)果為:"vvendl;Function(a);coutvvendl;}elsecoutvvendl;}break;case2:return0;break;}}return0;}五:編碼與調(diào)試分析編碼過程中,遇到很多小問題。比如不能判斷有些表達(dá)式是否正確,后來經(jīng)過嚴(yán)謹(jǐn)?shù)乃伎?,終于能判斷各種情況了。但后來又出現(xiàn)了一個(gè)問題,就是輸入空格后就無法正常進(jìn)行了,后來經(jīng)過分析和查閱資料,明白了字符數(shù)組中,如果有空格就不能用cin>>來進(jìn)行輸入,經(jīng)過了用cin.getline()這個(gè)函數(shù)解決了我的問題。經(jīng)過了三個(gè)星期的努力,現(xiàn)在還沒有發(fā)現(xiàn)問題,不過我會(huì)繼續(xù)改進(jìn)我的程序。六:使用說明運(yùn)行的軟件:本程序的運(yùn)行環(huán)境為VC6.0。進(jìn)入演示程序后即顯示提示信息:簡(jiǎn)要說明程序運(yùn)行操作步驟主菜單為1輸入表達(dá)式2退出該運(yùn)算若輸入1.則繼續(xù)輸入一中綴表達(dá)式,程序?qū)⒂?jì)算出結(jié)果;請(qǐng)輸入一個(gè)中綴表達(dá)式:輸入一中綴表達(dá)式進(jìn)行判斷,如果不正確,返回主菜單否則將轉(zhuǎn)化為相應(yīng)的后綴表達(dá)式,程序此后將顯示轉(zhuǎn)換后的后綴表達(dá)式,并輸出運(yùn)算結(jié)果。若輸入2.退出系統(tǒng),結(jié)束所有的運(yùn)行七:測(cè)試結(jié)果判斷整型:判斷十位數(shù)以上的數(shù):歡迎使用本小型計(jì)算系纟?青選擇操作:「表達(dá)式計(jì)算 囂退岀該系統(tǒng)1請(qǐng)請(qǐng)輸入中綴表達(dá)式,以^號(hào)結(jié)束:1+25*4#變?yōu)楹缶Y表達(dá)式為=1254*+表達(dá)式運(yùn)算結(jié)果為:101判斷小數(shù)運(yùn)算:歡迎使用本小型計(jì)算系統(tǒng)請(qǐng)選擇操作:「表達(dá)式計(jì)算 器退岀該系統(tǒng)1.2+2.5*4#請(qǐng)請(qǐng)輸入中綴表達(dá)式,以,護(hù)號(hào)結(jié)東:變?yōu)楹缶Y表達(dá)式為:22.54*+表達(dá)式運(yùn)算結(jié)果
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省開封市東南區(qū)重點(diǎn)名校2025屆中考生物仿真試卷含解析
- 2024年08月江蘇2024屆江蘇銀行南通分行秋季校園招考筆試歷年參考題庫附帶答案詳解
- 2024至2030年錐形磨邊鋼化玻璃項(xiàng)目投資價(jià)值分析報(bào)告
- 2024年08月廣東屆平安銀行特殊資產(chǎn)管理事業(yè)部校園招考筆試歷年參考題庫附帶答案詳解
- 2025年福建省莆田中國旅行社招聘筆試參考題庫含答案解析
- 2025年號(hào)百信息服務(wù)有限公司招聘筆試參考題庫含答案解析
- 2025年天津一商集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2025年新疆國展展覽有限公司招聘筆試參考題庫含答案解析
- 2025年海南元坤電力有限公司招聘筆試參考題庫含答案解析
- 2025年湖南湘西州永順縣經(jīng)濟(jì)建設(shè)投資集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 江西省上饒市2023-2024學(xué)年高一上學(xué)期期末教學(xué)質(zhì)量測(cè)試物理試題(解析版)
- 學(xué)生(幼兒)上學(xué)放學(xué)交通方式情況登記表
- 提高感染性休克集束化治療達(dá)標(biāo)率
- 2023年湖北省武漢市高考數(shù)學(xué)一模試卷及答案解析
- 電動(dòng)自行車換電柜規(guī)劃方案
- 工程變更、工程量簽證、結(jié)算以及零星項(xiàng)目預(yù)算程序?qū)嵤┘?xì)則(試行)
- 中央廣播電視大學(xué)畢業(yè)生登記表-8
- 2023年人民日?qǐng)?bào)社校園招聘72人筆試參考題庫(共500題)答案詳解版
- 《焊接常用工具》課件
- 山東師范大學(xué)《古代文學(xué)專題(一)》期末復(fù)習(xí)題
- 員工內(nèi)部崗位調(diào)換申請(qǐng)表
評(píng)論
0/150
提交評(píng)論