C語(yǔ)言實(shí)現(xiàn)表達(dá)式計(jì)算_第1頁(yè)
C語(yǔ)言實(shí)現(xiàn)表達(dá)式計(jì)算_第2頁(yè)
C語(yǔ)言實(shí)現(xiàn)表達(dá)式計(jì)算_第3頁(yè)
C語(yǔ)言實(shí)現(xiàn)表達(dá)式計(jì)算_第4頁(yè)
C語(yǔ)言實(shí)現(xiàn)表達(dá)式計(jì)算_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、用兩種方式實(shí)現(xiàn)表達(dá)式自動(dòng)計(jì)算用兩種方式實(shí)現(xiàn)表達(dá)式自動(dòng)計(jì)算- #-邊轉(zhuǎn)換邊計(jì)算的運(yùn)行結(jié)果圖和判錯(cuò)圖:faiizbijiexePleaseEntertheExp12x(45/9-31+9x3Theresultis24000000_圖6邊轉(zhuǎn)換邊計(jì)算運(yùn)行結(jié)果圖圖7邊轉(zhuǎn)換邊計(jì)算錯(cuò)誤字符圖五、遇到的問(wèn)題及解決這部分我主要遇到了如下兩個(gè)問(wèn)題,其內(nèi)容與解決方法如下所列:第一個(gè)問(wèn)題是中綴轉(zhuǎn)后綴時(shí)的數(shù)字元素整合問(wèn)題解決辦法:一開(kāi)始一直在糾結(jié)于如何在中綴轉(zhuǎn)后綴時(shí)把數(shù)字元素整合后和運(yùn)算符一起放入后綴表達(dá)式中,因?yàn)檎虾蟮臄?shù)是浮點(diǎn)型,而運(yùn)算符是字符型。首先想到的解決辦法是建立兩個(gè)數(shù)組,一個(gè)是浮點(diǎn)型數(shù)組用來(lái)存儲(chǔ)整合后的數(shù)

2、,一個(gè)是字符型的數(shù)組用來(lái)存儲(chǔ)運(yùn)算符。兩個(gè)數(shù)組使用同一個(gè)索引。當(dāng)遇到數(shù)的時(shí)候進(jìn)數(shù)組,符組讀入空格;當(dāng)遇到的是運(yùn)算符的時(shí)候進(jìn)符組,數(shù)組讀入空格。當(dāng)輸出后綴表達(dá)式的時(shí)候,索引依次掃描,當(dāng)在數(shù)組或符組中遇到的是元素時(shí)輸出,當(dāng)時(shí)空格時(shí)輸出后轉(zhuǎn)到另一個(gè)組索引。部分程序如下:num20,char20;/*num存儲(chǔ)了整合數(shù),char存儲(chǔ)了字符,一下為輸出后綴操作*/while(i!=0)if(numi!=)printf(%f,numi);i+;elsei+;if(chari!=)printf(%f,numi);i+;elsei+;但是方法過(guò)于繁瑣,程序過(guò)于冗長(zhǎng),后來(lái)通過(guò)多次分析發(fā)現(xiàn)如果在轉(zhuǎn)換的時(shí)候不整合數(shù)字

3、就可以使用一個(gè)字符型數(shù)組進(jìn)行存儲(chǔ)后綴表達(dá)式,并且輸出的時(shí)候也簡(jiǎn)單了些。只需要在后綴運(yùn)算的時(shí)候整合就可以了。以下為最后修改的將中綴中的數(shù)存入后綴表達(dá)式的程序:if(exp1index1=0&exp1index1=0&exp1index1=9)|exp1index1=.)exp2index2=exp1index1;index2+;index1+;exp2index2=;index2+;第二個(gè)問(wèn)題是擔(dān)心左右括號(hào)不匹配的問(wèn)題解決辦法:一開(kāi)始加了一個(gè)函數(shù)首先計(jì)算輸入的表達(dá)式的左右括號(hào)個(gè)數(shù),如下:intmatch(char*exp)inti=0,j=0,k=0;while(expi!=0)if(expi=

4、()j+;if(expi=)k+;return(j=k);雖然可以判定左右括號(hào)個(gè)數(shù)不同的錯(cuò)誤,但是當(dāng)遇到類似“1+2*)3+4(”這種個(gè)數(shù)相同但是先右后左的問(wèn)題就不行了。后來(lái)通過(guò)對(duì)程序的分析發(fā)現(xiàn),只要在出棧判空處提示錯(cuò)誤就可以解決右括號(hào)提前或者比左括號(hào)多的問(wèn)題。比如先出現(xiàn)右括號(hào)或者右括號(hào)比左括號(hào)多的時(shí)候,根據(jù)程序,遇到右括號(hào)則符棧出棧直到左括號(hào),但是由于遇到右括號(hào)時(shí)前面的左括號(hào)個(gè)數(shù)不夠,就會(huì)導(dǎo)致符棧最后??粘鰲#簿涂梢耘卸ㄥe(cuò)誤。而對(duì)于左括號(hào)而言,如果匹配的話,那么在表達(dá)式掃描結(jié)束前就會(huì)處理完括號(hào)。所以可以在表達(dá)式掃描結(jié)束后的對(duì)棧中剩余元素的處理處解決。先把左括號(hào)的優(yōu)先級(jí)設(shè)為-1,而最后出棧運(yùn)

5、算時(shí)先判斷優(yōu)先級(jí),當(dāng)為-1時(shí)報(bào)錯(cuò)就可以了。同時(shí)基于以上發(fā)現(xiàn),又增加了數(shù)棧出棧判空?qǐng)?bào)錯(cuò),所以就可以對(duì)類似“1*+-3”這種運(yùn)算符相鄰時(shí)的錯(cuò)誤進(jìn)行報(bào)錯(cuò)。由于有很多出口,就定義了一個(gè)報(bào)錯(cuò)函數(shù)方便調(diào)用,如下:intError()printf(Error!);getch();exit(1);六、心得體會(huì)通過(guò)對(duì)本次程序的學(xué)習(xí)和編寫,了解了關(guān)于電腦對(duì)計(jì)算表達(dá)式的計(jì)算過(guò)程,并且學(xué)會(huì)了從中綴變成后綴的方法。在本次編寫的時(shí)候遇到了不少問(wèn)題和麻煩,通過(guò)對(duì)C語(yǔ)言的復(fù)習(xí)和對(duì)算法的分析,最終也一一解決。也是這次的編寫讓我更加認(rèn)識(shí)到算法的重要性和算法的趣味性,特別是中綴轉(zhuǎn)后綴如直接計(jì)算的差別體現(xiàn)了算法的發(fā)展歷程和一個(gè)好的算法對(duì)于程序的關(guān)鍵性。通過(guò)本次編寫也意識(shí)到了清晰的程序結(jié)構(gòu)對(duì)于以后的更新和更改都有很重要的意義,方便的利用函數(shù)體來(lái)定義一些算法比直接在主函數(shù)中設(shè)置算法要好的多。更關(guān)鍵的是了解到了棧的性質(zhì)和用途,一些適當(dāng)?shù)膯?wèn)題使用棧不僅僅可以迎刃而解,有時(shí)還能夠起到事倍功半的效

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論