語言課程設(shè)計(jì)輸入一個(gè)表達(dá)式輸出其結(jié)果_第1頁
語言課程設(shè)計(jì)輸入一個(gè)表達(dá)式輸出其結(jié)果_第2頁
語言課程設(shè)計(jì)輸入一個(gè)表達(dá)式輸出其結(jié)果_第3頁
語言課程設(shè)計(jì)輸入一個(gè)表達(dá)式輸出其結(jié)果_第4頁
語言課程設(shè)計(jì)輸入一個(gè)表達(dá)式輸出其結(jié)果_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、課 程 設(shè) 計(jì) 報(bào) 告課程名稱C語言程序設(shè)計(jì)課題名稱 輸入一個(gè)表達(dá)式,輸出其結(jié)果 專 業(yè) 通信工程 班 級 通信1101 學(xué) 號 27 姓 名 皮鋒 指導(dǎo)教師 羅雅博 彭禎 曹燚 2012年 6月 29 日湖南工程學(xué)院課 程 設(shè) 計(jì) 任 務(wù) 書課程名稱 C語言程序設(shè)計(jì) 課 題 輸入一個(gè)表達(dá)式,輸出其結(jié)果 專業(yè)班級 通信1101 學(xué)生姓名 皮鋒 學(xué) 號 27 指導(dǎo)老師 羅雅博 彭禎 曹燚審 批 任務(wù)書下達(dá)日期 2012 年 6 月 15 日任務(wù)完成日期 2012 年 6 月 29日一、設(shè)計(jì)思想兩種算法首先都要建立兩個(gè)棧,一個(gè)是存放操作數(shù)的數(shù)棧OdStack,一個(gè)是存放運(yùn)算符的符棧OpStack。

2、數(shù)棧采用double型的用來存放浮點(diǎn)數(shù),符棧采用char型的用來存放運(yùn)算符,由于考慮到運(yùn)算符有優(yōu)先級的問題,所以事先做了一個(gè)Type用來存儲運(yùn)算符的優(yōu)先級。棧建立好了之后做棧的相關(guān)操作,初始化棧,入棧,出棧,看棧頂。其中入棧要判滿,出棧和看棧頂要判空。中綴轉(zhuǎn)后綴再計(jì)算的算法。此算法的基本思路是先將中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式,之后再利用后綴表達(dá)式的算法對表達(dá)式進(jìn)行計(jì)算。首先,用一個(gè)char數(shù)組將中綴表達(dá)式讀入,對數(shù)組中的每一個(gè)元素進(jìn)行處理,區(qū)分哪些是數(shù),哪些是運(yùn)算符。如果是數(shù)元素(或小數(shù)點(diǎn)元素),則依次存入用來存儲后綴表達(dá)式的char數(shù)組,直到一個(gè)整合數(shù)存完之后用空格將其與后面的元素分開。如果是

3、運(yùn)算符元素,則根據(jù)當(dāng)前運(yùn)算符的優(yōu)先級和棧里面的運(yùn)算符的優(yōu)先級進(jìn)行處理。如果棧內(nèi)元素的優(yōu)先級小于當(dāng)前元素的優(yōu)先級或者棧內(nèi)為空,則將當(dāng)前運(yùn)算符入棧;如果棧內(nèi)元素的優(yōu)先級大于等于當(dāng)前元素的,則依次將出棧元素存入后綴表達(dá)式,并用空格將其與后面的元素分開,直到棧內(nèi)元素的優(yōu)先級小或者棧內(nèi)為空。對于左括號來說,無條件進(jìn)棧,并只在有右括號出現(xiàn)的時(shí)候才有可能出棧。對于右括號來說,無條件讓棧內(nèi)元素出棧,直到左括號出棧。依次將每個(gè)元素進(jìn)行處理直到中綴表達(dá)式索引完畢。至此,已經(jīng)實(shí)現(xiàn)了將中綴表達(dá)式轉(zhuǎn)換成了后綴表達(dá)式,在數(shù)組的最后加上結(jié)束符以便下一步的調(diào)用。第二步,讀出后綴表達(dá)式并進(jìn)行計(jì)算。如果索引到空格則將索引標(biāo)志后推

4、1位。之后要先對char型的數(shù)字元素進(jìn)行整合,從后綴表達(dá)式中依次取出數(shù)字元素(連同小數(shù)點(diǎn))存入一個(gè)新的char型數(shù)組,直到一整個(gè)數(shù)取完后通過atof函數(shù)將char型轉(zhuǎn)換成浮點(diǎn)型存入數(shù)棧,并將新數(shù)組初始化用來存儲下一個(gè)數(shù)。如果是索引到運(yùn)算符,則在數(shù)棧中出棧兩個(gè)數(shù)字與當(dāng)前運(yùn)算符進(jìn)行運(yùn)算,先出棧的數(shù)字放在運(yùn)算符后面,后出棧的數(shù)字放在運(yùn)算符的前面,將運(yùn)算以后的結(jié)果再次存入數(shù)棧。依次進(jìn)行計(jì)算直到后綴表達(dá)式索引完畢。此時(shí)對棧內(nèi)剩余元素進(jìn)行操作。每在符棧出棧一個(gè)運(yùn)算符,就從數(shù)棧出棧兩個(gè)數(shù)進(jìn)行計(jì)算,算法同上,將運(yùn)算以后的結(jié)果再次存入數(shù)棧。循環(huán)操作直到符棧??眨藭r(shí)數(shù)棧出棧元素即為最后結(jié)果。二、算法流程圖中綴轉(zhuǎn)

5、后綴再計(jì)算的算法分兩個(gè)流程,第一步是中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式;圖1 中綴轉(zhuǎn)后綴算法流程圖第二步是將后綴表達(dá)式進(jìn)行計(jì)算輸出。三調(diào)試分析過程描述1.首先,設(shè)計(jì)的程序每運(yùn)行一次只能進(jìn)行一次計(jì)算:int main()printf( *歡迎進(jìn)入小型計(jì)算器*n請輸入算術(shù)表達(dá)式:);char strN; double result; scanf(%s,str);result=Calu(str); printf(輸出計(jì)算結(jié)果: %fn,result);為了改進(jìn)程序,我在主函數(shù)里加了一個(gè)循環(huán):int main()int a;printf( *歡迎進(jìn)入小型計(jì)算器*n請輸入算術(shù)表達(dá)式:);for(a=0;a+)c

6、har strN; double result; scanf(%s,str);result=Calu(str); printf(輸出計(jì)算結(jié)果: %fn,result);printf();2. 為了人性化原則,想什么時(shí)候退出計(jì)算就退出計(jì)算,我對程序又進(jìn)行了改進(jìn),輸入字母e退出計(jì)算:if(exp1index1=() tempsign.Type=exp1index1;tempsign.level=-1; OpPush(&OpStack,&tempsign);index1+;else if(exp1index1=) while(OpPeek(&OpStack).level != -1) exp2ind

7、ex2=OpPop(&OpStack).Type;index2+;exp2index2= ; index2+; OpPop(&OpStack); index1+; else if(exp1index1=e) /*exit(0); elseError();四程序運(yùn)行結(jié)果五程序源代碼#include#include#include#define N 100/*N為數(shù)棧和表達(dá)式數(shù)組容量*/#define M 100/*M為符棧和其他數(shù)組容量*/typedef struct /*定義運(yùn)算符類型,level為運(yùn)算符等級*/char Type;int level;Type;/*做一個(gè)Type用來存儲運(yùn)算符

8、的優(yōu)先級*/typedef struct /*定義數(shù)棧*/double stackN;int top;OdStack;typedef struct /*定義符棧*/Type stackM;int top;OpStack;void Init_OdStack(OdStack *s) /*定義初始化數(shù)棧*/ (*s).top=0; /初始化棧頂,賦等級0值void OdPush(OdStack *s,double n) /*進(jìn)數(shù)棧*/if(*s).top=N-1) /*如果棧滿則報(bào)錯(cuò)退出程序*/ Error();else(*s).stack(*s ).top=n;/將數(shù)棧中的值變?yōu)閚(*s).top

9、+;/棧頂?shù)闹导?double OdPop(OdStack *s) /*定義出數(shù)棧*/if (*s).top=0) /*如果??談t報(bào)錯(cuò)退出程序*/Error();else(*s).top-;/棧頂?shù)闹禍p1return (*s).stack(*s).top;/返回?cái)?shù)棧中的值void Init_OpStack(OpStack *s) /*定義初始化符棧*/ (*s).top=0; /初始化棧頂,賦等級0值void OpPush(OpStack *s,Type *sign) /*定義進(jìn)符棧*/if(*s).top=M-1) /*如果棧滿則報(bào)錯(cuò)退出程序*/Error();else(*s).stack(

10、*s).top=*sign;(*s).top+;/棧頂?shù)闹导?Type OpPop(OpStack *s) /*定義出符棧*/if (*s).top=0) /*??談t報(bào)錯(cuò)退出程序*/ Error();else(*s).top-;return (*s).stack(*s).top;/返回符棧的值Type OpPeek(OpStack *s) /*定義看符棧頂*/Type ren;if (*s).top=0) /*判棧空,空則賦等級0值*/ren.level=0;/運(yùn)算優(yōu)先級為等級0值return ren;elsereturn (*s).stack(*s).top-1;int Error() /*

11、報(bào)錯(cuò)函數(shù)*/printf(輸入錯(cuò)誤!n);exit(1);int Com(char tempch) /*定義運(yùn)算符等級*/int level; /*給不同運(yùn)算符定級*/switch (tempch) case +:case -:level=1;break;case *:case /:level=2;break; return level;/返回運(yùn)算符等級double Oper(double a,double b,char tempch) /*定義運(yùn)算過程*/double ren;switch (tempch) /*對不同運(yùn)算符執(zhí)行運(yùn)算并返回結(jié)果*/ case +:ren=b+a;break;c

12、ase -:ren=b-a;break;case *:ren=b*a;break;case /:ren=b/a;break; return ren;double Calu(char *exp1)/OdStack OdStack; /*定義數(shù)棧*/OpStack OpStack; /*定義符棧*/Type tempsign; /*定義Type型運(yùn)算符*/char exp2N,tempexpM,tempch; /*定義后綴表達(dá)式數(shù)組exp2,整合數(shù)組tempexp,tempch為運(yùn)算符*/int index1,index2,tempindex;/*index1為主要索引,index2為次要索引,t

13、empindex為附加索引*/double number,a,b,c; /*number為整合數(shù),a、b、c為運(yùn)算數(shù)*/ Init_OdStack(&OdStack); /*初始化數(shù)棧*/Init_OpStack(&OpStack); /*初始化符棧*/index1=0; /*初始化索引,附加索引*/index2=0;tempindex=0;tempexp0=0; /*初始化整合數(shù)組*/while(exp1index1!=0) /*處理初始表達(dá)式轉(zhuǎn)化成后綴表達(dá)式*/ if(exp1index1=0& exp1index1=0& exp1index1=tempsign.level) /*當(dāng)棧中符

14、的等級大于當(dāng)前等級時(shí)則取出符存入后綴表達(dá)式*/exp2index2=OpPop(&OpStack).Type;index2+;exp2index2= ; /*每兩個(gè)運(yùn)算符之間用空格分開*/index2+;OpPush(&OpStack,&tempsign); /*結(jié)束后將當(dāng)前運(yùn)算符入棧*/index1+; else if(exp1index1=() /*如果是左括號則無條件進(jìn)棧*/ tempsign.Type=exp1index1;tempsign.level=-1; /*進(jìn)棧后等級為-1,以便遇到右括號出棧*/OpPush(&OpStack,&tempsign);index1+; else

15、if(exp1index1=) /*右括號規(guī)則*/ while(OpPeek(&OpStack).level != -1) /*遇到右括號則不斷出棧存入后綴表達(dá)式直到尋到左括號*/ exp2index2=OpPop(&OpStack).Type;index2+;exp2index2= ; /*每兩個(gè)運(yùn)算符之間用空格分開*/index2+; OpPop(&OpStack); /*直到遇到左括號將左括號出棧*/index1+; else if(exp1index1=e) exit(0);else/*如果輸入了非法字符則報(bào)錯(cuò)退出程序*/Error(); while(OpPeek(&OpStack).

16、level !=0) /*原表達(dá)式結(jié)束后對棧進(jìn)行操作直到???/ if(OpPeek(&OpStack).level=-1) /*如果有為用掉的左括號則報(bào)錯(cuò)退出程序*/Error();exp2index2=OpPop(&OpStack).Type;index2+;exp2index2= ;index2+; exp2index2=0 ; /*最后結(jié)束后綴表達(dá)式*/index1=0; /*索引歸零,開始計(jì)算結(jié)果*/while(exp2index1 != 0) /*循環(huán)直到后綴表達(dá)式結(jié)束*/if(exp2index1=0& exp2index1=0& exp2index1=9) | exp2inde

17、x1=. ) /*用附加索引判斷數(shù)的長度并整合入整合數(shù)組*/tempexptempindex=exp2index1;index1+; tempindex+;tempexptempindex=0; /*結(jié)束整合數(shù)組*/if( tempexp0 != 0) /*如果整合數(shù)組有值則轉(zhuǎn)換成浮點(diǎn)型存入數(shù)棧*/ number = atof(tempexp);OdPush(&OdStack ,number);tempexp0=0; /*入棧后初始化整合數(shù)組和附加索引以便下次整合*/tempindex=0; elseif(exp2index1= ) /*判斷空格,有則跳過*/while(exp2index1=

18、 )index1+;elseif(exp2index1=+|exp2index1=-|exp2index1=*|exp2index1=/) /*對加減乘除進(jìn)行運(yùn)算*/a=OdPop(&OdStack);b=OdPop(&OdStack);tempch=(exp2index1);c=Oper(a,b,tempch);OdPush(&OdStack,c); /*將計(jì)算結(jié)果放入數(shù)棧*/index1+;return OdPop(&OdStack) ; /*彈出結(jié)果*/int main()int a;printf( *歡迎進(jìn)入小型計(jì)算器*n字母e結(jié)輸入束計(jì)算!n請輸入算術(shù)表達(dá)式:);for(a=0;a+)char str

溫馨提示

  • 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)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論