簡易計算器棧與隊列實驗報告_第1頁
簡易計算器棧與隊列實驗報告_第2頁
簡易計算器棧與隊列實驗報告_第3頁
簡易計算器棧與隊列實驗報告_第4頁
簡易計算器棧與隊列實驗報告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第三組專題二棧與隊列實驗報告簡易計算器一.(1)問題描述通過模擬一個簡單的計算器來進行+、-、*、/、人(乘方)等運算,從鍵盤上輸入一算術(shù)表達式(一般為中綴表達式),計算出表達式的值。(2)基本要求編寫程序,要求可對一實數(shù)算術(shù)表達式進行簡單的數(shù)學(xué)運算。可以識別帶加減乘除等運算符及括號的中綴表達式。a.按照四則運算規(guī)則,求表達式的值。一般規(guī)則如下:1)先括號,再括號外。2)先乘方,再乘除,后加減。b.同級運算從左到右順序執(zhí)行。c.如表達式有誤,應(yīng)給出相應(yīng)的提示信息。(3)數(shù)據(jù)結(jié)構(gòu)與算法分析解決表達式求值問題的方法之一是:第一步將中綴表達式轉(zhuǎn)換為后綴表達式,第二步按后綴表達式求值。解題時可以結(jié)合字

2、符串的相關(guān)知識。(4)測試4.5+5+6.5*1.06=16.39二.(1)問題分析:計算機要計算一個式子,不能像我們一樣計算,它需要把表達式由中綴表達式轉(zhuǎn)換成后綴表達式,即逆波蘭表達式。將一般中綴表達式轉(zhuǎn)換為逆波蘭表達式有如下轉(zhuǎn)換過程:(1)首先構(gòu)造一個運算符棧,此運算符在棧遵循越往棧頂優(yōu)先級越高的原則。(2)讀入一個用中綴表示的簡單算術(shù)表達式,為方便起見,設(shè)該簡單算術(shù)表達式的右端多加上了優(yōu)先級最低的特殊符號“二”。(3)從左至右掃描該算術(shù)表達式,從第一個字符開始判斷,如果該字符是數(shù)字,則分析到該數(shù)字串的結(jié)束并將該數(shù)字串直接輸出。(4)如果不是數(shù)字,該字符則是運算符,此時需比較優(yōu)先關(guān)系。做法

3、如下:將該字符與運算符棧頂?shù)倪\算符的優(yōu)先關(guān)系相比較。如果,該字符優(yōu)先關(guān)系高于此運算符棧頂?shù)倪\算符,則將該運算符入棧。倘若不是的話,則將棧頂?shù)倪\算符從棧中彈出,直到棧頂運算符的優(yōu)先級低于當(dāng)前運算符,將該字符入棧。(5)重復(fù)上述操作(3)-(4)直至掃描完整個簡單算術(shù)表達式,確定所有字符都得到正確處理,我們便可以將中綴式表示的簡單算術(shù)表達式轉(zhuǎn)化為逆波蘭表示的簡單算術(shù)表達式。(2)問題實現(xiàn)及代碼。1.菜單函數(shù):使用switch函數(shù)根據(jù)輸入的數(shù)字選擇是否進入計算器f8求、“實數(shù)瑁科學(xué)葬式訪算Sir*"成上)£力巾3仙ftCwKC*"'.nd1psuHV"

4、,計算茸式Y(jié)mcHgelitHft.£fflfiShCCendljmuf4虜青nd1卜EUtJ你的選抒是:)iMtcholcejclH»chok#jHiit-ch(Ghgi55,cni-rf:rmiiHFi|.csw1;(ciwiriQ.Qft-'y'sstringequaticnjWhiAe話:;_ws/,1):(£口11114cirndldcendlcc-WASK,以-等號)結(jié)能,<EdcinjiequaticmiCilcul4tet«|Mtion)jmut"維埃怦用叫?慕地雉人尸HWAh,"icin

5、7;p>onj.M麻避,上,i.;)"0rM);2 .檢測非法輸入函數(shù):Intlllegal_chdr(£trin£Sjintiintj=fljJill叫(I”式T打倒=,廣值j-='|"j=|<jJ-4(lbCJJ->Al>j*i“/上赧林崇。貳廠十二釘二m孑如若存在re與式子:一制人else!sjitr程序賽止,存在非法的字符翰入II1“endh廣靜iMEff)nttur-nlr,7匚二"-.,._:_-;._.b3 .雙目運算符定義函數(shù):完成對+,-,*,/,人的定義:iwihiMkIH.J31FF-fTw

6、arrnrjwridj.一jy=jp#J-忙doubleD_Operate(doubleXjcharoa?double,).,二三江二三/啟翼京(-dodblea>':一盧二三flitch(op)(匚爭匚a->+yib*-e?kjcase11-*?a-yj,breakcase4*1:a=s*yjbireak;case':a=w/j.break;cas*'ft<:=國為都墨於谷士進行運舞西曲不定義取凄運算retiuma;)4 .判斷運算符的優(yōu)先級,決定是壓?;蛘邚棗_\用到計算中:charPrecedeRcharop>charep或(if(opl=B

7、,+'|opl-="-,)&S(Qp2"»1+,|cp2=»*-'|op2="')'|op2«'=R)|(opl"'*'|opl="/")&8(cp2""1+'op2=»'-1op2«»*'op2='/"op2»»'),Iop2»=,-1)|(cpl"»,A'&&

8、(op2='+,|cp2"»,-1op2=»*op2»»'/'op2=R)'|op2»=,a,)return上逑靖方廣棧夜運則優(yōu)先皴高于將定運算窕嬴津我if(opi=,(aaop2="),|I(opi=,-,op2=,"')return'=el&ereturn;5 .括號匹配檢測函數(shù):ILn*wrv口舊亡1Hl(1.m-蠹).tt«±nrtop+圣i號H.t抬F1.事(s;七百之命|_弋如p-H&tCklttopJLJ=N<J

9、LI_J.七op-、產(chǎn)品把與右越號占超”左括號耳導(dǎo)*t產(chǎn)產(chǎn)科0口"i-FCtni口!日)士qu七七vJhAt:ur'n.9/,by*i*rr*j.6.運算棧:分為運算符棧和運算數(shù)棧:pufalxE.:妣心亮?xí)鴏fi:皆蚓J;brttopivnidstart()lar(i.rtrtHlMitup-0idwblegp"top-Ji由修“刖文*M,卬”rrturnnimbe-rjhdbkgelTDp("«''一京曲(ratiirniuflidlift:-.'|topijhQ*ER'L-bE;'putb-U-c:&

10、lt;.hM>*gL工U+imttcRpigidsta-t()/z-一;T三;?,勇于判建算式結(jié)束op<rej>p=-pf4MT(imt,X=1XZ<JL酬W1i再top 11/ 內(nèi)opwLA1=HJ'LLjvoidou.Mch.獷)i3per|topjatepi-gcJIiavpep;)<Hmbii-opjpertepJ»apvr't.t«nJNULL;rrtumg>pi-r>'三Word文檔7.算式計算函數(shù)(最關(guān)鍵函數(shù)):用于對用戶輸入的算式進行計算,給出最后結(jié)果:void calcjlstei strz

11、ng ea atisn 上 二上 :二 二Mnck nuititr; 一二. 李山OPERstack GKrt 丁 二:京 ,"???) nunbe-r. itairt ( . c per. sta-t : i - " Int i-Ejlfifi-Ujkj kF/'加4wble yNiraryuiFflj whiltitq jjticnri - .a -if>Tjjtion;iirri|-=".(CDUt«WS&A有誣!沒有君人蜀比籽號-零號。,女核匕 inf kj-lUegwll«q ) j好1mlEi :"”

12、- z .片式 >訐liTrrturni -' 號'=-'-?二一 "- - -" t( rtJUBt 1 5- 0 eqUflt loriL 1 p - 9")rnwer .pu sh (c qMtisn i ) a一,不if( (eqiiiat: ion iP <11 rquurt im i*l 卜勺')8*eqiLMtwn( i+1 生 * J)Hi-ber-UftQ; .二2 *二二三.二二二-三二二.二二三.廣斗一二一三百elw ”值此日時“/)_:丁一,iirtEkrfiilerquitkli*?'?

13、f,UrqiH,lk'-,|l*)i'.f!)(.nirfl«rter.top+-(LgR*tLmL+可二廿所i:昵#Ku士If-lli忖力ji-i+Mitin惻”由同im(op.ifih>?竄itWMM.-h-51H-::一1t="一:.:_一lh;口peit.7:.-而l-WjHEmvUMUIJ.M一a(制I阻M/宙匕營tTg0B?.小E"j”tfrRMqLnrtEL|E*】/可Jij.HgT)即,口口蓊門小卡一HLYIlIpZ.:*rrfWUMt期磔fW呼i:一”二遷*#虱*子特區(qū)禽蒼學(xué)費正中用于耙,#麴行一Jlile(nep-尸加一“

14、網(wǎng)#悶1-呢“34h叩b.pcpliyiunL»qriM-papO|owtidBii網(wǎng)和做到皿加IT;.i科¥蟲/kA”腿丁山*)rijEipr.n1-njrRr上工廠:wm?.tigj;.irlt«l=££tffTCEl;)re-3rezed!M.:h口.二.一二I近期I切匕一丁廣.二二一二:.一、,、竹,麗/£卜誑“#.1工4“向【加*'jp.僦"咿飆*,24、高凡9“MeqjiCbrKtiEjKidSfrEFguMjjj飛"he:三.程序運行演示:Word文檔隔上叱“等號暗中:,雌R粵式.伏-曙號)結(jié)

15、春川w-i6.3»unfi«wi堆蠟使用0寸MkAv否則施入n*括號檢測:請輸入算式,以(等號)結(jié)束;2+i+<2+3=葡菱融百,是請輸心否則輸入叱非法輸入檢測:請輸入算式,以=1等號)結(jié)束!1*1$=字符輸入! ! !否則輸入小.Word文檔四.MFC界面介紹.MFC界面。我們不滿足于DC限制的黑框框界面,所以我們運用了(1)界面初步簡介:(2)對程序的改動:原C程序的拆分Word文檔但STRING柒中R距Q與恒苴將編制網(wǎng)隨0RING懦啪融里型數(shù)規(guī)提疾春心”=住徭榻MLI也長莊登聃故他藐優(yōu)而/計豆式的室由計算函數(shù)調(diào)書計算囪鼐,并返期一個gjtie型的拮果用gilt接

16、收這回給果判劃展一嶼其能部分的情陰同一通一gibte轉(zhuǎn)換為ini再轉(zhuǎn)換為號符敵一如果不等則doA蝎換為字符敢據(jù)并從局解除為O的字符上處怠義按位數(shù)輸比.使行精果顯示更人性化(新僧部分)e_SMt墻加新的字將數(shù)(L完成范果顯示計算式輸入函數(shù)冷產(chǎn)%4工2泡£+ZHi/麗期I"tog左1咖Htt再曲品0»噂也m|_Vw,二JCET:1|£iMf1rin*1#T3oa曰圖W叫副中E匹g網(wǎng)而3ti*4丈H+HP=EU1干tfi-Bli-Ostik*(rt*5M«lttWKj2rHMq同3X*qu4Htor>-i>q3tion>1/4fcm

17、>岬Ttk-lnnq曲C1!;MRlADMJril-鞏洛西"ijCT,t*-!-BHCO"鵬kJWfaMllK與IffWDO任度皿由痔里但即SMi不曰IewwiM中川一miqmMwl網(wǎng)Lwgfri好llTl_$tHjHin"jUM0禹按畫:BUTTONS舉叫CSTRING拱型,心MMS加宇祥T龍豆據(jù)出行更露SRING與:euutjunk力口字#T退構(gòu)提J喳)舉“In_Sfkmntjqudba點巨蘆星后Tt泥空據(jù)進號更跖究生清除穩(wěn)(AC«0)舉例;yp室mStwjwf-cjqjhEj(hi匯款掂進打坦神(3) 對C+程序的改進:改進的報錯系統(tǒng)即時松查

18、毛為些做到易出請的樂出般接卜的信E時,商調(diào)用祖府的蝴請函數(shù),晚寫用戶涉及時發(fā)現(xiàn)«?、惜俁,掘免了出曲里打磕大的燦恒用口至蛻立說計算式輸入錯誤時就鹿用MfSEjyRox西曲,葬日一憎揖框,提他i后I并對于誨出褶的信自再艙反沖朝承息于MFC接出的先天硒的間于ffiPmXTFFtWHlTA曬竭制啊靛通過犢下按鈕給人信息.鬧溯戶不能統(tǒng)施人左拈號的件lih利步糾偌處的式了程人不完全*尺度燈括號進行初步糾錯.如果之前為空.娟自按輸入蒯果之M不足3-",必定出錯媼彈:UW由占加jJv-idd.人.jHC.CrihrCK4Ehn10WDC卜中加#T:*<|u4irufirpti;11

19、1wpriH*kinpTM.Show+«i%UkH4UXjt70),-4«Huji|<bi3Fi|RqLifKnaS*n1.丁一¥KTuMifn->rutan=I11Hf|i揖j*w<i11-.|«u*t»n|ELWfcn'-i=-AII.*0-1-111WMW1-*Rfr、kow*1_JT(TtUfeKtatn-DrXWM-l>1*4w>MT*jH*=LE-lifceiAA*iiIT1千±0計IWt括號的川惜進一事到惜此lit式了梅人完全,彘對括號匹配制刑.FEr:iMta±i

20、1;-nf。,七JpLa.星分一充II|HI-CMf13fFlMfj江fint"V?1M-n<d|Mp-fjiMidMU.rt,|£iP7哨1匚通feWiTEA*1MK*.ttumBiiHxL占m上*果ijftmtim中han加、減、乘、除、退格鍵的報錯提示程序的展示8.5+9/(3+4.5*6)-(7,65-計算式子: 8 9)*12)=23 8 清除展示 報錯展示五.優(yōu)勢與不足:優(yōu)勢:(1)做出了界面,不再是黑框框(2)報錯系統(tǒng)完善,基本不會出錯。(3)結(jié)果顯示正確,不會出現(xiàn)多余的0。不足:(1)雖然做出了界面,但是還不是很優(yōu)美。(2)功能還不是很強大,不能進行三

21、角函數(shù)的運算及其他運算。這些缺點我們都會再以后的學(xué)習(xí)中克服掉!源代碼:#include<iostream>#include<cmath>#include<string>#include<iomanip>usingnamespacestd;voidmenu();/位于calculate函數(shù)后面的菜單函數(shù)聲明doubleD_Operate(doublex,charop,doubley)/雙目運算符的運算定義doublea;/計算結(jié)果switch(op)case'+':a=x+y;break;case'-':a=x-y;

22、break;case'*':a=x*y;break;case'/':a=x/y;break;case'"a=pow(x,y);break;/哥運算包括乘方和開方)/因為都是利用double進行運算因此不定義取模運算returna;)charPrecede(charop1,charop2)判斷符號的優(yōu)先級op1在返回的結(jié)果符的左邊op2在右/用于判定運算符的優(yōu)先級以決定是把運算符壓棧還是把棧的運算符彈出來進行計算(if(op1='+'|op1='-')&&(op2='+'|op2=&

23、#39;-'|op2=')'110P2='=')|(op1='*'110P1='/')&&(op2='+'|op2='-'|op2='*'110P2='/'110P2=')'110P2='=')|(op1='A'&&(op2='+'|op2='-'|op2='*'110P2='/'110P2=')'11

24、0P2='=')return'>'/上述情況下棧頂運算符優(yōu)先級高于待定運算符需彈棧if(op1='('&&op2=')')|(op1='='&&op2='=')return'='elsereturn'<')intillegal_char(strings,inti)/非法輸入字符判定函數(shù)(intj=0;while(j<i)(if(sj>='0'&&sj<='9'

25、)j+;elseif(sj='+'|sj='-'|sj='*'|sj='/'|sj='.'|sj='('|sj=')'|sj='A')j+;/以上都是標準的數(shù)字字符和運算符如若存在其他形式的字符則是非法輸入else(cout<<"程序終止,存在非法的字符輸入!!"<<endl;return0;)return1;/沒有非法字符返回1否則返回0)intmatch(strings)/棧結(jié)構(gòu)的括號匹配檢測函數(shù)(inti=0,top=

26、0;charstack50;while(si!='0')(if(si='(')stacktop=si;top+;/push左括號壓入棧if(si=')')if(stacktop-1='(')inta=i+1;stacktop-1=NULL;top-;/把與右括號匹配的左括號彈掉elsecout<<"括號輸入有誤"<<endl;return0;/多了右括號括號失陪返回非法pop'('i+;if(top!=0)cout<<"括號輸入有誤"<

27、;<endl;return0;/多了左括號括號失陪返回非法return1;/返回合法classNUMstack/運算數(shù)棧public:doublenum1000;inttop;voidstart()/初始化棧清空棧頂指針置底for(inti=0;i<1000;i+)numi=0;top=0;voidpush(chara)/因為有多位數(shù)的運算因此不能一壓棧就提升棧頂指針10所以初始化要numtop=numtop*10+(a-'0');/把字符轉(zhuǎn)成數(shù)因為每次入棧之前要乘清0doublepop()top-;doublenumber=numtop;numtop=0;retu

28、rnnumber;彈棧函數(shù)彈掉棧頂元素棧頂歸0top指針下降doublegetTop()取棧頂元素但不必彈棧returnnumtop-1;voidlift()/提升top指針的函數(shù)top+;classOPERstack/運算符棧public:charoper1000;inttop;voidstart()/初始化函數(shù)棧清空棧底放一"="用于判定算式結(jié)束oper0='='for(inti=1;i<1000;i+)operi=NULL;top=1;/棧頂指針置于棧底的上一位voidpush(chara)opertop=a;top+;與數(shù)字棧不同一壓棧就可以提

29、升指針charpop()top-;charop=opertop;opertop=NULL;returnop;/彈出計算符用于計算chargetTop()returnopertop-1;/取棧頂符號但不彈??捎糜谂卸▋?yōu)先級;voidcalculate(stringequation)/算式計算函數(shù)(關(guān)鍵函數(shù))NUMstacknumber;/定義運算數(shù)棧變量numberOPERstackoper;定義運算符棧變量opernumber.start();oper.start();/把兩個棧初始化inti=0,len=0,k;charp,sig;doubleyuan1,yuan2;while(equati

30、oni!='0')len+;i+;/計算等式長度lenif(equationlen-1!='=')cout<<"輸入有誤!沒有輸入終止符號-等號“=""<<endl;return;/檢測有沒有結(jié)束符等號"="intle;le=illegal_char(equation,len-1);if(le=0)return;/有非法字符不進行后續(xù)計算le=match(equation);if(le=0)return;/括號匹配非法不進行后續(xù)計算for(i=0;i<len;i+)初步確定合法后開始

31、計算算式if(equationi>='0'&&equationi<='9')number.push(equationi);/壓數(shù)字字符入棧if(equationi+1<'0'|equationi+1>'9')&&equationi+1!='.')number.lift();當(dāng)整個多位運算數(shù)讀取完畢后,運算數(shù)棧棧頂指針才能提升elseif(equationi='.')小數(shù)壓棧代碼intx=1;while(equationi+x>='

32、0'&&equationi+x<='9')number.numnumber.top+=(equationi+x-'0')/pow(10,x);第x位小數(shù)入棧x+;x-;number.lift();i=i+x;elseif(equationi='(')oper.push(equationi);/左括號無條件壓棧Word文檔else/數(shù)乘方左括號判斷完畢后其他運算符的分類討論if(oper.top=1)/運算符棧為空運算符可以無條件入棧oper.push(equationi);else/運算符棧不為空則要進行優(yōu)先級判斷c

33、hartemp1=oper.getTop();/取出棧頂符號chartemp2;/待入棧符號temp2=equationi;p=Precede(temp1,temp2);if(p='<')oper.push(temp2);/棧頂符優(yōu)先級較低現(xiàn)在待定的運算符就可以入棧了if(p=|>'|p='=')charrep=p;當(dāng)棧頂符優(yōu)先級不低于待入棧的符號則運算符棧不停地彈棧/進行運算直到低于待入棧符號為止rep用于記錄比較結(jié)果要多次進行判斷while(rep='>'|p='=')&&(oper.top-1>0)sig=oper.pop();yuan1=number.pop();yuan2=number.getTop();/靠前的一個運算數(shù)只要取得不要彈出來if(sig=7'&&yuan1=0)yuan1是雙目運算符后面的第二運算元cout<<"錯誤!!除數(shù)為0!"<<endl;return;if(si

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論