




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
班級:計科111班學(xué)號:2011081113姓名:羅明芳題目:計算表達(dá)式的值一:問題描述問題描述:計算表達(dá)式的值,對于給定的一個表達(dá)式,表達(dá)式中可以包括整數(shù)或小數(shù)、算術(shù)運(yùn)行符(“+”、“-”、“*”、“/”)和括號,編寫程序計算表達(dá)式的值。2?基本要求:從鍵盤輸入一個正確的中綴表達(dá)式,將中綴表達(dá)式轉(zhuǎn)換為對應(yīng)的后綴表達(dá)式,計算后綴表達(dá)式的值。二:需要分析軟件的基本功能本程序能計算出含+、-、*、/、(、)等運(yùn)算符的簡單運(yùn)算。輸入的形式和輸入值的范圍根據(jù)題目要求與提示,在輸入一個中綴表達(dá)式,輸入數(shù)的范圍為int或float型,此時,程序?qū)⒂嬎愠霰磉_(dá)式的結(jié)果。當(dāng)按照程序輸入表達(dá)式;程序?qū)F(xiàn)將中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式并計算出結(jié)果。測試數(shù)據(jù)輸入一個中綴表達(dá)式,例如輸入3*(4+2)/2-5#,那么輸出結(jié)果是4;如果輸入表達(dá)式?jīng)]有結(jié)束標(biāo)示符#,如3*(4+2)/2-5,那將不會輸出任何結(jié)果,或出現(xiàn)錯誤結(jié)果。三:概要設(shè)計首先設(shè)計一個棧模板定義一個運(yùn)算對象棧Intstack<float>n,一個運(yùn)算符棧Intstackvchar>m。ADTInitStackData棧中元素具有相同類型及后進(jìn)先出的特性,相鄰元素具有前驅(qū)和后繼關(guān)系基本操作:InitStack()前置條件:棧不存在輸入:無功能:棧的初始化輸出:無后置結(jié)果:構(gòu)造一個空棧DestroyStack()前置條件:棧已存在輸入:無功能:銷毀棧輸出:無后置條件:釋放棧所占用的空間GetTop()前置條件:棧S已存在輸入:無功能:取棧頂元素,讀取當(dāng)前的棧頂元素輸出:若棧不空,返回當(dāng)前的棧頂元素值后置條件:棧不變Push(x)前置條件:棧已存在輸入:元素值X功能:入棧操作,在棧頂插入一個元素值輸出:如果插入不成功,則拋出異常后置條件:如果插入成功,則棧頂增加了一個元素Pop()前置條件:棧已存在輸入:無功能:出棧操作,刪除棧頂元素輸出:如果刪除成功,返回被刪元素值操作結(jié)果:刪除S的棧頂元素。Empty()前置條件:棧已存在輸入:無功能:判空操作,判斷棧是否為空輸出:如果棧為空,返回1,否則返回0后置條件:棧不變endADT對于輸入的表達(dá)式進(jìn)行判斷如果輸入錯誤,就提示出來,并返回1如果沒有錯誤,就返回0intjudge(chara[])如果返回0,就繼續(xù)進(jìn)行以下運(yùn)算,否則返回主界面中綴表達(dá)式變后綴表達(dá)式voidorder(chara[])偽代碼如下:將運(yùn)算符棧s初始化為空棧。從左到右依次掃描表達(dá)式的每一個字符,執(zhí)行下列操作。若當(dāng)前字符是運(yùn)算對象,則輸出該字符,處理下一個字符若當(dāng)前字符是運(yùn)算符且優(yōu)先級比棧s的棧頂運(yùn)算符的優(yōu)先級高,則將字符入棧s,處理下一個字符。若當(dāng)前字符是運(yùn)算符且優(yōu)先級比棧s的棧頂運(yùn)算符的優(yōu)先級低,則將棧s的棧頂元素彈出并輸出。若當(dāng)前字符是運(yùn)算符且優(yōu)先級與棧s的棧頂運(yùn)算符的優(yōu)先級相等,則將棧s的棧頂元素彈出,處理下一字符。算出表達(dá)式的結(jié)果voidFunction(chara[])偽代碼如下:將對象棧n初始化為空,將字符站m也初始化為空。從左到右掃描表達(dá)式的的每一個字符執(zhí)行下列操作,指導(dǎo)遇到結(jié)束語‘#'2.1若當(dāng)前字符是運(yùn)算對象,則入棧n。2.2若當(dāng)前字符是運(yùn)算符且優(yōu)先級比棧m的棧頂運(yùn)算符的優(yōu)先級高,則入棧m,處理下一個字符。2.3若當(dāng)前字符是運(yùn)算符且優(yōu)先級比棧m的棧頂運(yùn)算符的優(yōu)先級低,則從棧n出棧兩個運(yùn)算對象,從棧m中出棧一個運(yùn)算符進(jìn)行運(yùn)算,并將運(yùn)算結(jié)果入棧n,繼續(xù)處理下一個字符。2.4若當(dāng)前字符是運(yùn)算符且優(yōu)先級與棧m的棧頂運(yùn)算符的優(yōu)先級相同,則將棧m的棧頂運(yùn)算符出棧,處理下一個字符。輸出棧n的棧頂元素,既表達(dá)式的運(yùn)算結(jié)果。四?主程序流程及模塊調(diào)用關(guān)系結(jié)束四:詳細(xì)設(shè)計模板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)先級判斷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<<"錯誤"vvr<<':'<<''<<a[i]<<"沒有左運(yùn)算符!"<<endl;p++;r++;}if(a[y]=='('){_coutvv"錯誤"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<< "錯誤"vvrvv':'vv''<<a[i]<<"后被除數(shù)不能是零!"vvendl;P++;r++;}}if(a[x]=='('lla[x]=='+'lla[x]=='-'lla[x]=='*'lla[x]=='/'){-cout<<"錯誤"<<r<<':'<<&□]<<"沒有左運(yùn)算對象!"<<endl;P++;r++;}if(a[y]==')'lla[y]=='+'lla[y]=='-'lla[y]=='*'lla[y]=='/'){_cout<<"錯誤"<<r<<':'<<''<<a[i]<<"沒有右運(yùn)算對象!"<<endl;P++;r++;}}else{if(i!=0){cout<<"錯誤"<<[<<':'<<"輸入字符'"<<a[i]<<"'不正確!"vvendl;P++;r++;}}i++;}if(m!=n){coutvv"錯誤"vvrvv':'vv"左右括號不相等"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)〃字符棧空時{m.push(a[i]);i++;}else{if(prior(a[i])>prior(m.Gettop()))//當(dāng)前優(yōu)先級大于棧優(yōu)先級{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)先級小于棧優(yōu)先級{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)先級等于棧優(yōu)先級{cout<<m.pop()<<'';m.push(a[i]);i++;}}}}cout<<endl;}計算表達(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{m.push(a[i]);i++;}else{〃當(dāng)前優(yōu)先級大于棧優(yōu)先級時if(prior(a[i])>prior(m.Gettop())){if(a[i]!=')') 〃處理后括號的情況{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)先級小于棧優(yōu)先級時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)先級等于棧的優(yōu)先級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ù),實現(xiàn)函數(shù)的調(diào)用intmain(){cout<<setw(50)<<"歡迎使用本小型計算系統(tǒng)"vvendl;coutvvendl;while(l){coutvv"請選擇操作:1.表達(dá)式計算 2.退出該系統(tǒng)"vvendl;charx;cin>>x;cin.ignore();switch(x){caseT:{coutvv"請請輸入中綴表達(dá)式,以'#'號結(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)了一個問題,就是輸入空格后就無法正常進(jìn)行了,后來經(jīng)過分析和查閱資料,明白了字符數(shù)組中,如果有空格就不能用cin>>來進(jìn)行輸入,經(jīng)過了用cin.getline()這個函數(shù)解決了我的問題。經(jīng)過了三個星期的努力,現(xiàn)在還沒有發(fā)現(xiàn)問題,不過我會繼續(xù)改進(jìn)我的程序。六:使用說明運(yùn)行的軟件:本程序的運(yùn)行環(huán)境為VC6.0。進(jìn)入演示程序后即顯示提示信息:簡要說明程序運(yùn)行操作步驟主菜單為1輸入表達(dá)式2退出該運(yùn)算若輸入1.則繼續(xù)輸入一中綴表達(dá)式,程序?qū)⒂嬎愠鼋Y(jié)果;請輸入一個中綴表達(dá)式:輸入一中綴表達(dá)式進(jìn)行判斷,如果不正確,返回主菜單否則將轉(zhuǎn)化為相應(yīng)的后綴表達(dá)式,程序此后將顯示轉(zhuǎn)換后的后綴表達(dá)式,并輸出運(yùn)算結(jié)果。若輸入2.退出系統(tǒng),結(jié)束所有的運(yùn)行七:測試結(jié)果判斷整型:判斷十位數(shù)以上的數(shù):歡迎使用本小型計算系纟?青選擇操作:「表達(dá)式計算 囂退岀該系統(tǒng)1請請輸入中綴表達(dá)式,以^號結(jié)束:1+25*4#變?yōu)楹缶Y表達(dá)式為=1254*+表達(dá)式運(yùn)算結(jié)果為:101判斷小數(shù)運(yùn)算:歡迎使用本小型計算系統(tǒng)請選擇操作:「表達(dá)式計算 器退岀該系統(tǒng)1.2+2.5*4#請請輸入中綴表達(dá)式,以,護(hù)號結(jié)東:變?yōu)楹缶Y表達(dá)式為:22.54*+表達(dá)式運(yùn)算結(jié)果
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大連醫(yī)科大學(xué)《皮革整飾化學(xué)與工藝學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江藥科職業(yè)大學(xué)《學(xué)前兒童衛(wèi)生學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津醫(yī)學(xué)高等??茖W(xué)校《中醫(yī)基礎(chǔ)理論》2023-2024學(xué)年第二學(xué)期期末試卷
- 衡陽師范學(xué)院南岳學(xué)院《信號與系統(tǒng)綜合實踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 工程竣工驗收報告防腐涂料質(zhì)量評估
- 針對進(jìn)口商品各種情況調(diào)查
- 2025年中國醫(yī)藥市場分析:規(guī)模突破4萬億元 基因藥物增速領(lǐng)跑行業(yè)
- 深溝槽專項施工方案
- 湖南省株洲市淥口區(qū)第三中學(xué)、株洲健坤瀟湘高級中學(xué)2024-2025學(xué)年高二上學(xué)期1月期末聯(lián)考數(shù)學(xué)試題(解析版)
- 成渝經(jīng)濟(jì)圈名校聯(lián)盟2024-2025學(xué)年高三上學(xué)期第一次聯(lián)考數(shù)學(xué)試題(解析版)
- 中小學(xué)勞動教育實踐指導(dǎo)手冊
- 基于語文核心素養(yǎng)的初中語文綜合性學(xué)習(xí)教學(xué)策略研究
- 高血壓員工免責(zé)協(xié)議范本
- 工藝部述職報告
- 供貨交貨進(jìn)度計劃及保證措施
- 第17課《學(xué)習(xí)中的煩心事》課件
- 規(guī)劃選址及用地預(yù)審流程
- 關(guān)于衛(wèi)健系統(tǒng)工作調(diào)研報告
- 烯烴習(xí)題參考答案
- 2023-2024學(xué)年山東省淄博市高青縣七年級下學(xué)期期中考試英語試題 (含答案)
- 各國鋼材牌號對照大全
評論
0/150
提交評論