




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、目錄一、 需要分析21) 課題要求22) 課題分析23) 實現(xiàn)功能步驟24) 承擔(dān)模塊工作詳解25) 運行環(huán)境2二、 概要設(shè)計31) 系統(tǒng)流程圖32) 提示輸入模塊43) 表達式正誤判斷模塊44) 中綴表達式轉(zhuǎn)為后綴表達式模塊45) 后綴表達式計算模塊4三、 詳細(xì)設(shè)計41) main函數(shù)模塊42) 提示輸入模塊53) 表達式正誤判斷64) 中綴表達式轉(zhuǎn)為后綴表達式75) 后綴表達式的計算9四、 調(diào)試分析141) 調(diào)試過程中遇到的問題和解決方法142) 經(jīng)驗和體會14五、 用戶使用說明14六、 測試結(jié)果15七、 參考文獻17八、 附錄18圖表目錄圖表 1 .1 輸入提示15圖表 2 .1 輸入選
2、擇錯誤15圖表 3 .1 正常表達式計算16圖表 4 .1表達式錯誤提示171、 需要分析 1) 課題要求表達式計算(難度:B)要求:輸入一個表達式,輸出其結(jié)果。表達式由數(shù)字、運算符(+ - * / ( ) )常用數(shù)學(xué)函數(shù)組成。例如,輸入 3*(sqrt(64)+(4/3),輸出28。此外,如果輸入的是錯誤的表達式,則提示錯誤。例如:2+*3則輸出:表達式輸入錯誤。2) 課題分析根據(jù)課題要求應(yīng)該做到以下幾點:1 提示輸入,輸出提示內(nèi)容。包括數(shù)的類型(浮點型),運算符種類(+、-、*、/), 函數(shù)的種 類(sqrt(x)、log(x)、fabs(x)、sin(x)、cos(x)、tan(x))。
3、2 主函數(shù)中設(shè)置計算循環(huán),實現(xiàn)可以運算多個表達式,并設(shè)置退出表達式計算按鈕。3 實現(xiàn)表達式的正誤判斷,錯誤返回0并輸出表達式錯誤,正確返回1。4 實現(xiàn)將中綴表達式轉(zhuǎn)為后綴表達式的處理,返回后綴表達式。5 實現(xiàn)后綴表達式的運算,返回最后數(shù)值。3) 實現(xiàn)功能步驟由提示輸入,輸入“1”按回車進行表達式計算,輸入要計算的表達式按回車就可以得出結(jié)果,由提示輸入,輸入“2”按回車退出表達式的計算程序。4) 承擔(dān)模塊工作詳解我要做的是先做到輸出提示輸入的內(nèi)容,用while語句做到多個表達式計算循環(huán),再利用單向棧的知識做到將中綴表達式轉(zhuǎn)為后綴表達式的處理,其中關(guān)乎括號和函數(shù)的處理,采用整體法思路,把括號里的內(nèi)
4、容和函數(shù)內(nèi)容看做整體處理,最后進行后綴表達式的計算,采用先分后整的方法,利用調(diào)用函數(shù)和遞歸,先進行表達式里的函數(shù)和括號里內(nèi)容的計算,再整體計算。主要要編寫出各部分的程序,合理的進行棧和遞歸的處理。5) 運行環(huán)境系統(tǒng)軟件:Window 2000 以上系統(tǒng)語言選擇:C語言工具軟件:VC+2、 概要設(shè)計1) 系統(tǒng)流程圖開始輸入選擇輸入為1 輸入表達式 是表達式正確 否 結(jié)束輸出計算結(jié)果轉(zhuǎn)為后綴表達式后綴表達式計算 是 否 2) 提示輸入模塊該模塊進行一些輸出提示,包括tishishuru(),tishishuru1() 兩個函數(shù),主要輸出表達式的運算符種類,函數(shù)類型等提示,輸出是否進行表達式計算板塊
5、,采用printf,scanf 語句就可以完成。3) 表達式正誤判斷模塊該模塊包括函數(shù)panduan(char*x) 當(dāng)輸入一個表達式時,將表達式存入數(shù)組后,先進行表達式的正誤判斷。進行一個個字符的判斷,用if語句進行判斷,得找出所有表達式錯誤的情況,則剩下正確的表達式。4) 中綴表達式轉(zhuǎn)為后綴表達式模塊這一模塊實現(xiàn)中綴表達式轉(zhuǎn)為后綴表達式,包括函數(shù)trans(char *exp,char*postexp),利用單向棧的知識,實現(xiàn)入棧操作,該模塊需采用整體法思想,把括號內(nèi)內(nèi)容和函數(shù)內(nèi)容看做整體存入為后綴表達式,利于后一步的分部計算。5) 后綴表達式計算模塊該模塊包括compvalue (cha
6、r *postex) 函數(shù),實現(xiàn)對后綴表達式的計算并且返回計算結(jié)果于主函數(shù)中,采用出棧計算操作,將計算結(jié)果存入數(shù)據(jù)棧中。3、 詳細(xì)設(shè)計1) main函數(shù)模塊進行對各個自定義函數(shù)的調(diào)用,輸入表達式,輸出計算結(jié)果并利用while 語句做循環(huán),實現(xiàn)多次計算。核心代碼:void main () /*主函數(shù)*/ float r; /*用于存入表達式最后結(jié)果*/ char *exp; /*存放輸入的表達式*/ char *postexp; /*存放后綴表達式*/ exp=(char*)malloc(MAXSIZE*sizeof(char); postexp=(char*)malloc(MAXSIZE*si
7、zeof(char); /*取內(nèi)存*/ tishishuru(); /*提示輸入的內(nèi)容*/tishishuru1(); while (n=1) printf("請輸入的表達式:"); /*提示輸入表達式*/ gets(exp); /*輸入表達式*/ if (panduan(exp)=0) /*判斷表達式正誤*/ printf ("tt表達式錯誤!n"); else trans(exp,postexp); /*調(diào)用中綴表達式轉(zhuǎn)后綴表達式函數(shù)*/ r=compvalue(postexp); /*調(diào)用函數(shù)*/ printf("tt輸出最后結(jié)果: %g
8、",r); /*輸出計算結(jié)果*/ tishishuru1(); printf("tt表達式計算結(jié)束n"); 2) 提示輸入模塊實現(xiàn)輸入的提示,主要輸出表達式的運算符種類,函數(shù)類型等提示,輸出是否進行表達式計算,同時進行對輸入選擇“1”“2”的處理,處理輸入字母造成的死循環(huán)問題。核心代碼:oe: printf("請選擇:");scanf("%s",c);getchar();if(!(c0='1'&&c1='0')|(c0='2'&&c1='
9、0') printf("輸入錯誤!請重新輸入!n"); goto oe; n=c0-'0'3) 表達式正誤判斷利用while 語句進行一個個字符的查看,利用if 語句判斷是否出錯,出錯即返回0,若到最后一個字符都沒有錯則返回1。難點在于函數(shù)和括號內(nèi)容的判斷。核心代碼:int panduan(char *x) /*自定義函數(shù)panduan表達式正誤判斷*/ int i=-1,j=0,a=b=0; /*定義整型變量*/ char tem4,tem15; /*定義數(shù)組存入函數(shù)名*/ while (x+i!='0') . (省略次要部分) i
10、f(xi>='a'&& xi<='z') tem0=xi; tem1=xi+1; tem2=xi+2; tem3='0' tem10=xi; /*將函數(shù)名存入數(shù)組*/ tem11=xi+1; tem12=xi+2; tem13=xi+3; tem14='0' if(strcmp(tem,"sin")&&strcmp(tem,"log")&& strcmp(tem,"tan")&&strcmp(te
11、m,"cos") if (!(strcmp(tem1,"fabs")&&strcmp(tem1,"sqrt") if(xi+4!='(') printf("tt函數(shù)名后非( 錯誤!n"); return 0;break; /*函數(shù)名后非( 錯誤*/ i=i+3;continue ; if(xi+3!='(') printf("tt函數(shù)名后非( 錯誤!n"); return 0;break; /*函數(shù)名后非( 錯誤*/ else return 0;b
12、reak; i=i+2; if(a!=b) printf("tt左括號數(shù)不等于右括號數(shù)錯誤!n"); return 0; /*左括號數(shù)不等于右括號數(shù)錯誤*/return 1; /*表達式正確返回1*/ 4) 中綴表達式轉(zhuǎn)為后綴表達式利用入棧原理將中綴表達式轉(zhuǎn)為后綴表達式,例如:3-5 變?yōu)椋?#5- 采用整體法思想把函數(shù)和括號內(nèi)容看做整體,例如:3+tan(5+8) 變?yōu)椋?#tan(5+8)+ 利用while 語句和switch語句進行對不同字符的處理。核心代碼1:定義字符棧struct char date MAXSIZE; int top ; op;核心代碼2:whil
13、e (*exp!='0') switch (*exp) case 's': case 'l': case 't':case 'f':case 'c': while (*exp>='a'&&*exp<='z') /*存取基本函數(shù)名*/ postexpi+=*exp; /*遇到字母則存入postexp*/ exp+; postexpi+=*exp;exp+; k=1; while (k) if (*exp='(')k+; if
14、(*exp=')') /*把函數(shù)括號內(nèi)內(nèi)容整體存入*/ k-; postexpi+=*exp; exp+; postexpi+='#' /*存入后用#隔開*/ break; /*將函數(shù)作為整體存入數(shù)組*/ case '(': postexpi+=*exp; exp+; k=1; while (k) if (*exp='(') /*將非函數(shù)括號沒的括號內(nèi)內(nèi)容整體存入*/ k+; if (*exp=')') k-; postexpi+=*exp; exp+; postexpi+='#' /*存入后用#隔
15、開*/ break; case '+': case '-': while(op.top!=-1) postexpi+=op.dateop.top; op.top-; /*進行加減號的處理*/ op.top+; op.dateop.top=*exp;exp+; break; case '*': case '/': while (op.dateop.top='*'| op.dateop.top='/') postexpi+=op.dateop.top; op.top-; op.top+; /*進行乘除的
16、處理*/ op.dateop.top=*exp; exp+; break; case ' ': exp+;break; /*空格跳過*/ default : while(*exp>='0'&&*exp<='9') |*exp='.') postexpi+=*exp; exp+; /*進行數(shù)字的處理*/ postexpi+='#' while (op.top!=-1) /*exp掃描完畢,棧非空時循環(huán)*/ postexpi+=op.dateop.top; /*數(shù)字后存入運算符*/ op.t
17、op-; 5) 后綴表達式的計算對后綴表達式進行計算,利用出棧原理,把計算的值存入數(shù)據(jù)棧中,采用先分計算后整計算的方式,例如:sqrt(9-8)#4+ 先進行9-8的運算,調(diào)用中綴表達式轉(zhuǎn)為后綴表達式函數(shù)trans(),變?yōu)?#8-得值為1,再進行sqrt(1)#4-的運算,利用遞歸思想。核心代碼1:數(shù)據(jù)棧的定義struct int top; float dateMAXSIZE; /*定義棧存入計算結(jié)果*/ st;核心代碼2:加減乘除的處理while (*postex!='0') switch (*postex) case '+': a=st.datest.to
18、p; /*進行加法運算*/ st.top-; b=st.datest.top; st.top-; c=a+b; st.top+; st.datest.top=c; break; case '-': a=st.datest.top; /*進行減法運算*/ st.top-; b=st.datest.top; st.top-; c=b-a;st.top+; st.datest.top=c; break; case '*': a=st.datest.top; /*進行乘法運算*/ st.top-; b=st.datest.top; st.top-; c=b*a;st.t
19、op+; st.datest.top=c; break; case '/': a=st.datest.top; /*進行除法運算*/ st.top-; b=st.datest.top; st.top-; if(a!=0) /*判斷分母是否為0*/ c=b/a;st.top+; st.datest.top=c; else printf ("ttIt is wrong分母不能為零n"); return 0;break; /*表達式出錯返回返回0*/ break; default : /*進行對數(shù)的處理,轉(zhuǎn)化為float型的數(shù)*/ d=0;i=0; while(*
20、postex>='0'&&*postex<='9')|*postex='.') while (*postex>='0'&&*postex<='9') d=10*d+(float) (*postex-'0'); postex+; if (*postex='.') postex+; while (*postex>='0'&&*postex<='9') /*進行對小數(shù)的處理*
21、/ i+; d=d+(float)pow(10,-i)*(*postex-'0'); postex+; st.top+; st.datest.top=d; break; postex+; return st.datest.top; /*返回表達式最后的值*/ 核心代碼3:括號和函數(shù)的處理switch (*postex) case 't':case 's':case 'f': case 'c':case 'l': w=postex; /*w指向函數(shù)的第一個字母*/ while(*postex>=
22、'a'&&*postex<='z') postex+; postex+; /*遇到函數(shù)名先跳過*/ k=1;q=p; /*q取p的首地址進行操作*/ while (k) if (*postex='(') k+; if (*postex=')') k-; *q=*postex; q+;postex+; q-; *q='0' /*把函數(shù)括號內(nèi)的內(nèi)容存入新的內(nèi)存p中組成新的字符串*/ trans(p,t); /*調(diào)用函數(shù)*/ e=compvalue(t); /*調(diào)用函數(shù)函數(shù)*/ st.top+; s
23、witch (*w) case 't': st.datest.top=(float)tan(e);break; /*進行tan()的運算*/ case 's': if (*(+w)='q') if (e<0) printf ("tt不符合函數(shù)取值范圍出錯!n"); /*不符合函數(shù)取值范圍出錯*/return 0;break; /*表達式出錯返回返回0*/ st.datest.top=(float)sqrt(e);break; /*進行sqrt()函數(shù)的運算*/ else st.datest.top=(float)sin(
24、e);break; /*進行san()函數(shù)的運算*/ case 'l': if (e<0) printf ("tt不符合函數(shù)取值范圍出錯!n"); /*不符合函數(shù)取值范圍出錯*/ return 0;break; /*表達式出錯返回返回0*/ st.datest.top=(float)log(e);break; /*進行l(wèi)og()函數(shù)的運算*/ case 'c': st.datest.top=(float)cos(e);break; /*進行cos()函數(shù)的運算*/ case 'f': if (e<0) printf
25、 ("tt不符合函數(shù)取值范圍出錯!n"); /*不符合函數(shù)取值范圍出錯*/ return 0;break; /*表達式出錯返回返回0*/ st.datest.top=(float)fabs(e);break; /*進行fabs()函數(shù)的運算*/ break; case '(': /*進行括號的運算,把括號內(nèi)的表達式看做整體采用先整后分*/ postex+; k=1;q=p; while (k) if (*postex='(') k+; if (*postex=')') k-; *q=*postex; /*把函數(shù)括號內(nèi)的內(nèi)容存入
26、新的內(nèi)存p中組成新的字符再 調(diào)用函數(shù)對p進行運算處理*/ q+;postex+; q-;*q='0' if (panduan(p)=0) printf ("tt表達式錯誤!n"); /*輸出錯誤提示*/4、 調(diào)試分析1) 調(diào)試過程中遇到的問題和解決方法第一,輸入選擇“1”“2”時輸入字母造成死循環(huán),解決方法:把輸入的內(nèi)容存入字符串?dāng)?shù)組中,進行判斷是否為字符“1”“2”,不是則利用goto函數(shù)返回重新輸入。第二,對于先有加減號的表達式不知道如何處理,解決方法:在表達式最前方加上一個字符0,構(gòu)成一個新的表達式來處理,例如:-9+8 變成0-9+8。第三,不知道如
27、何處理函數(shù)的計算,采用轉(zhuǎn)表達式整體法和計算先分后總的方法。2) 經(jīng)驗和體會對于本次課設(shè),題目“表達式計算”,開始拿到這個題目時覺得很簡單,自己很快就可以處理好,可真正開始寫代碼時,發(fā)現(xiàn)自己在機房發(fā)呆了幾節(jié)課,前幾節(jié)課都沒有寫出什么東西。因為自己都不知道怎么下手,所以開始幾堂課都在找資料,有看書的,也有百度。找到思路后,自己自學(xué)了一下數(shù)據(jù)結(jié)構(gòu)書中單向棧的知識,看了一個小例題,也知道如何下手了。這個課設(shè)花了我許多時間的,雖然是在規(guī)定的幾周上機時間完成的,通過課設(shè)的學(xué)習(xí),發(fā)現(xiàn)自己學(xué)到了不少,C語言的知識加強了不少,了解了棧的初步學(xué)習(xí),同時知道了對于寫一個代碼數(shù)量較多的程序,一定不能把一大堆代碼堆在一
28、起,而是要學(xué)會一小塊一小塊拼起來,確保小塊正確后來確保大塊的正確,那樣才更容易找出錯誤并改正。課設(shè)的學(xué)習(xí),讓我對C語言更有興趣,感覺到程序的實用性,自己也更喜歡寫代碼了,希望在以后的學(xué)習(xí)中,自己可以學(xué)到更多的知識,寫出更好地程序。5、 用戶使用說明1 本次運行程序的環(huán)境是:2 程序要包括兩次輸入,第一輸入“1”或“2” ,選擇是否進行表達式計算,輸入1計算,輸入2 退出,按回車鍵確認(rèn)輸入。若輸入1則進行表達式計算,輸入要計算的表達式,按回車鍵計算即可。6、 測試結(jié)果圖表 1.1 輸入提示圖表 2.1 輸入選擇錯誤圖表 3.1 正常表達式計算圖表 4.1表達式錯誤提示7、 參考文獻1 C語言程序
29、設(shè)計 (第二版)何欽銘,顏暉。2 數(shù)據(jù)結(jié)構(gòu) (C語言版) 嚴(yán)蔚敏,吳偉民。8、 附錄/*27. 表達式計算(難度:B) 要求:輸入一個表達式,輸出其結(jié)果。表達式由數(shù)字、運算符(+ - * / ( ) ) 常用數(shù)學(xué)函數(shù)組成。例如,輸入 3*(sqrt(64)+(4/3),輸出28。此外, 如果輸入的是錯誤的表達式,則提示錯誤。例如:2+*3則輸出:表達式輸入錯誤。*/ /*源代碼*/#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define MAXSIZE
30、 200 int n; /*定義全局變量n*/int panduan (char *x); /*自定義函數(shù)判斷表達式的正誤*/float compvalue (char *postex); /*中綴表達式轉(zhuǎn)為后綴表達式*/void trans(char *exp,char*postexp); /*進行后綴表達式的運算*/void tishishuru(); /*自定義函數(shù)提示輸入的內(nèi)容*/void tishishuru1(); void main () /*主函數(shù)*/ float r; /*用于存入表達式最后結(jié)果*/ char *exp; /*存放輸入的表達式*/ char *postexp;
31、 /*存放后綴表達式*/ exp=(char*)malloc(MAXSIZE*sizeof(char); postexp=(char*)malloc(MAXSIZE*sizeof(char);/*取內(nèi)存*/system("color 6");tishishuru(); /*提示輸入的內(nèi)容*/tishishuru1(); while (n=1) printf("請輸入的表達式:"); /*提示輸入表達式*/ gets(exp); /*輸入表達式*/ printf("n"); if (panduan(exp)=0) /*判斷表達式正誤*/
32、 printf ("tt表達式錯誤!n"); printf("*n"); /*清屏*/ else trans(exp,postexp); /*調(diào)用中綴表達式轉(zhuǎn)后綴表達式函數(shù)*/ printf("tt輸出后綴表達式:%sn",postexp); /*輸出后綴表達式*/ r=compvalue(postexp); /*調(diào)用函數(shù)*/ printf("n"); printf("tt輸出最后結(jié)果: %g",r); /*輸出計算結(jié)果*/ printf("n"); printf("*n"); /*清屏*/ tishishuru1(); printf("tt表達式計算結(jié)束n"); void trans (char*exps,char*postexp) /*進行對中綴表達式轉(zhuǎn)為后綴表達式*/ struct char date MAXSIZE; int top ; op; /*定義棧存放運算符*/ int k,i=0; /*定義整型變量*/ char *p ,*exp,*q; /*定義指針變量*/ exp=(char*)malloc(MAXSIZE*sizeof(char)
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年公共場所電梯定期養(yǎng)護服務(wù)合同
- 2025年勞動合同續(xù)簽規(guī)定全景解析
- 2025年光學(xué)儀器銷售合同樣本
- 踝足矯形器結(jié)構(gòu)優(yōu)化設(shè)計-深度研究
- 2025年上海商業(yè)地產(chǎn)轉(zhuǎn)租合同模板
- 自然語言理解框架-深度研究
- 政策工具與公共服務(wù)質(zhì)量-深度研究
- 網(wǎng)絡(luò)隔離與安全域劃分-深度研究
- 純合子遺傳變異研究-深度研究
- 果汁濃縮提取工藝優(yōu)化-深度研究
- 05PowerPoint 2016演示文稿軟件電子課件 計算機基礎(chǔ)知識(Windows 7+Office 2016)
- 妊娠期高血壓剖宮產(chǎn)術(shù)后護理教學(xué)查房
- 暫予監(jiān)外執(zhí)行
- 急性腎小球腎炎講稿
- 義務(wù)教育語文課程標(biāo)準(zhǔn)(2022)測試題帶答案(20套)
- 公共廁所工程報價明細(xì)表
- 股骨頸骨折ppt精品
- 2023年江蘇農(nóng)牧科技職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 毛澤東詩詞鑒賞分析
- 小學(xué)數(shù)學(xué)-納稅教學(xué)設(shè)計學(xué)情分析教材分析課后反思
評論
0/150
提交評論