數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告總結(jié)_第1頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告總結(jié)_第2頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告總結(jié)_第3頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告總結(jié)_第4頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告總結(jié)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、設(shè)計(jì)題目:模擬計(jì)算器程序?qū)W生姓名:謝先斌系別:計(jì)算機(jī)與通信工程學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級(jí):1班學(xué)號(hào):541007010144 指導(dǎo)教師:盧冰李曄XX 年 6 月 21 日鄭州輕工業(yè)學(xué)院課程設(shè)計(jì)任務(wù)書題目模擬計(jì)算器程序?qū)I(yè)、班級(jí)計(jì)算機(jī)科學(xué)與技術(shù)10-01班學(xué)號(hào) 541007010144 姓名謝先斌主要內(nèi)容:設(shè)計(jì)一個(gè)模擬計(jì)算器的程序,要求能對(duì)包含加、減、乘、除、括號(hào)運(yùn)算符及SQR和ABS函數(shù)的任意整型表達(dá)式進(jìn)行求解?;疽螅阂獧z查有關(guān)運(yùn)算的條件,并對(duì)錯(cuò)誤的條件產(chǎn)生報(bào)警。主要參考資料:嚴(yán)蔚敏吳偉民編著數(shù)據(jù)結(jié)構(gòu)(C語言版)清華大學(xué)出版社第44頁棧、第52頁表達(dá)式求值完成期限: XX年6月21日指

2、導(dǎo)教師簽名:課程負(fù)責(zé)人簽名:XX年 6月 21 日一、設(shè)計(jì)題目模擬計(jì)算器的程序設(shè)計(jì)一個(gè)模擬計(jì)算器的程序,要求能對(duì)包含加、減、乘、除、括號(hào)運(yùn)算符及SQR和ABS函數(shù)的任意整型表達(dá)式進(jìn)行求解。設(shè)計(jì)要求:要檢查有關(guān)運(yùn)算的條件,并對(duì)錯(cuò)誤的條件產(chǎn)生報(bào)警。二、算法設(shè)計(jì)的思想本程序設(shè)計(jì)主要是應(yīng)用了棧,利用棧的“先進(jìn)后出”原理,建立了兩個(gè)棧,分別為運(yùn)算符棧pOStack和運(yùn)算數(shù)棧pDStack。算法的基本思想(參考課本p53頁)是:(1) 首先置操作數(shù)棧為pDStack空棧,表達(dá)式起始符為“=”,位運(yùn)算符棧的棧底元素; (2) 依次讀入表達(dá)式中的每個(gè)字符,若是操作數(shù)則進(jìn)入pDStack棧,若是運(yùn)算符則和pOS

3、tack棧的棧定運(yùn)算符比較優(yōu)先權(quán)后作相應(yīng)操作,直到整個(gè)表達(dá)式求值完畢(即pOStack棧的棧定元素和當(dāng)前讀入的字符均為“=” )。三、算法的流程圖本程序的流程如下附圖1所示:附圖1 程序流程圖四、算法設(shè)計(jì)分析首先創(chuàng)建了兩個(gè)棧:typedef struct OPStack /定義運(yùn)算符棧 char opStack; int top; OPStack, *pOPStack; typedef struct DATAStack /定義運(yùn)算數(shù)棧 double stack; int top; DATAStack, *pDATAStack; 來分別存放運(yùn)算符和運(yùn)算數(shù)。在兩個(gè)結(jié)構(gòu)體中均有一個(gè)top數(shù)據(jù)域,當(dāng)t

4、op=-1時(shí),表示該站為空棧。定義一個(gè)Evaluateexpression_r()函數(shù)來完成函數(shù)運(yùn)算的主要功能:讀入表達(dá)式,并計(jì)算結(jié)果。以下是對(duì)該函數(shù)的分析:當(dāng)一次運(yùn)算開始時(shí),分別調(diào)用InitpOPStack(pOPStack &pOStack)函數(shù)和InitpDATAStack(pDATAStack &pDStack)函數(shù)分別對(duì)運(yùn)算符棧和運(yùn)算數(shù)棧進(jìn)行初始化。調(diào)用PushOPStack(pOStack, =)函數(shù)來完成運(yùn)算符棧棧低元素的設(shè)置。通過PushOPStack(pOPStack &pOStack, char ch)函數(shù)、PopOPStack(pOPStack &pOStack, cha

5、r &ch)函數(shù)、PushDATAStack(pDATAStack &pDStack, double d)函數(shù)和PopDATAStack(pDATAStack &pDStack, double &d)函數(shù)來分別完成運(yùn)算符和運(yùn)輸數(shù)的進(jìn)出棧操作。getToppOPStack(pOPStack &pOStack)函數(shù)和getToppDATAStack(pDATAStack &pDStack) 函數(shù)主要是進(jìn)行得到棧定元素的作用,特別是在對(duì)運(yùn)算符棧優(yōu)先級(jí)的比較中十分重要,其中還會(huì)調(diào)用IsOP(char &ch) 函數(shù)來區(qū)分讀入的是運(yùn)算符還是運(yùn)算數(shù)。ChangeChar(char &c)函數(shù)當(dāng)每次讀入一個(gè)

6、字符是都會(huì)調(diào)用一次,主要的作用就是完成不用區(qū)分A、S的大小的功能。Precede(char op1, char op2)函數(shù)主要是通過一個(gè)二維字符串?dāng)?shù)組來存放9種運(yùn)算符的優(yōu)先級(jí)比較的結(jié)果,每當(dāng)讀到一個(gè)運(yùn)算符后就進(jìn)行與運(yùn)算符棧頂元素比較,通過返回的“、=”結(jié)果來進(jìn)行下一步的操作:表示運(yùn)算符和運(yùn)算數(shù)各退棧一次并調(diào)用Operate(double a, char theta, double b)函數(shù)(主要是對(duì)出棧的運(yùn)算符和運(yùn)算數(shù)進(jìn)行計(jì)算),最后將運(yùn)算結(jié)果壓入運(yùn)算數(shù)棧pDStack。當(dāng)操作結(jié)束時(shí)運(yùn)算數(shù)棧的棧頂元素就是計(jì)算結(jié)果,分別調(diào)用ClearpOPStack(pOStack)函數(shù)清空運(yùn)算符棧、Clea

7、rpDATAStack(pDStack)函數(shù)清空運(yùn)算數(shù)棧以待下一次繼續(xù)進(jìn)行相關(guān)操作。print_user()函數(shù)和exit_E()函數(shù)開始和結(jié)束時(shí)個(gè)調(diào)用一次,分別完成歡迎界面和退出界面的布置。main()是本程序的主函數(shù),主要通過while語句和switch語句來完成本程序的運(yùn)行,當(dāng)輸入Y(y)時(shí)調(diào)用Evaluateexpression_r()函數(shù)完成計(jì)算,當(dāng)輸入N(n)時(shí),調(diào)用exit_E()函數(shù)退出本程序的運(yùn)行。本程序還考慮到各種異常的處理,如運(yùn)算時(shí)除數(shù)為0、被開方數(shù)為0等情況的出現(xiàn),最終的處理是直接退出程序的運(yùn)行。五、運(yùn)行結(jié)果分析1. 程序開始界面,如附圖2:附圖2 開始界面2.如下附圖

8、3,附圖4分別是選擇進(jìn)入和退出程序界面:附圖3(在以下界面輸入計(jì)算式即可運(yùn)行出計(jì)算結(jié)果如附圖5) 附圖4退出界面附圖5 運(yùn)行界面2. 對(duì)異常的處理a) 對(duì)異常1除數(shù)為0,如輸入“1 2/0=”程序?qū)⒅苯油顺?,如附圖6:附圖6 異常1除數(shù)為0 b) 對(duì)異常2被開方數(shù)為負(fù)數(shù),如輸入“3 S(-9)=”程序?qū)⒅苯油顺?,如附圖7:附圖7 異常2被開方數(shù)為負(fù)數(shù)3.以下是對(duì)各種簡(jiǎn)單運(yùn)算的運(yùn)行結(jié)果,如附圖8:附圖8 簡(jiǎn)單運(yùn)算3. 綜合運(yùn)算:如式子“1/2 A(7-8)-S(9*8)=”運(yùn)行結(jié)果如附圖9 附圖9 綜合運(yùn)算六、收獲及體會(huì)本程序以C語言的棧的相關(guān)知識(shí)為基礎(chǔ),通過控制兩個(gè)棧(運(yùn)算數(shù)棧和運(yùn)算符棧)的進(jìn)

9、出的棧操作,來實(shí)現(xiàn)對(duì)包含加、減、乘、除、括號(hào)運(yùn)算符及SQRT和ABS函數(shù)的任意整型表達(dá)式的求解運(yùn)算。從程序的編寫來看,感覺這次自己真的學(xué)到了好多,特別是對(duì)程序的開發(fā)流程。從最初的選定程序,到最終的程序運(yùn)行成功,讓我感到如果是僅僅掌握課本上的知識(shí)是遠(yuǎn)遠(yuǎn)不能夠很好的應(yīng)用到實(shí)際的編程中去的。在這個(gè)過程中還需要我們更多的去考慮到實(shí)際條件的種種限制和約束。我在寫本程序的過程中也遇到了很多的問題,當(dāng)然本程序的核心問題就是對(duì)兩個(gè)棧的壓出棧操作,需要做優(yōu)先級(jí)判斷,并要考慮什么時(shí)候進(jìn)棧,什么時(shí)候出棧等操作。我采用了課本上第52-54頁講的通過一個(gè)二維字符串?dāng)?shù)組來控制比較“ -*、()AS=”共9個(gè)運(yùn)算符的優(yōu)先級(jí)

10、控制。對(duì)異常,如除數(shù)為0、被開方數(shù)小于0等異常也進(jìn)行了精心的處理。對(duì)操作過程中要用到的Y、N、A、S等字符也進(jìn)行了改進(jìn),最終本程序可以不區(qū)分大小寫就完成相關(guān)操作??傊?,經(jīng)過本次專業(yè)課程設(shè)計(jì),讓我掌握了開發(fā)應(yīng)用軟件的基本流程,運(yùn)用所學(xué)編程技能的基本技巧,也讓我初步了解了軟件設(shè)計(jì)的基本方法,提高進(jìn)行工程設(shè)計(jì)的基本技能及分析、解決實(shí)際問題的能力,為以后畢業(yè)設(shè)計(jì)和工程實(shí)踐等打下良好的基礎(chǔ)。相信通過這次的課程設(shè)計(jì),我對(duì)所學(xué)的數(shù)據(jù)結(jié)構(gòu)(C語言版)和各種編程語言都有了一個(gè)全新的認(rèn)識(shí)。我也會(huì)積極吸取本次課程設(shè)計(jì)的經(jīng)驗(yàn),繼續(xù)研究數(shù)據(jù)結(jié)構(gòu)和所學(xué)的各種編程語言。七、源代碼# include # include #

11、include # include # define MAX_OPERATOR_NUM 100 /運(yùn)算符棧數(shù)組長(zhǎng)度# define MAX_DATA_NUM 100 /運(yùn)算數(shù)棧數(shù)組長(zhǎng)度typedef struct OPStack /定義運(yùn)算符棧 char opStack; int top; OPStack, *pOPStack; typedef struct DATAStack /定義運(yùn)算數(shù)棧 double stack; int top; DATAStack, *pDATAStack; void InitpOPStack(pOPStack &pOStack) /初始化運(yùn)算符棧 if( !(pO

12、Stack = (pOPStack)malloc(sizeof(OPStack) /為運(yùn)算符棧分配空間 printf(分配內(nèi)存空間失敗! ); exit(-1); pOStack-top = -1; void InitpDATAStack(pDATAStack &pDStack) /初始化運(yùn)算數(shù)棧 if( !(pDStack = (pDATAStack)malloc(sizeof(DATAStack) /為運(yùn)算數(shù)棧分配空間 printf(分配內(nèi)存空間失敗! ); exit(-1); pDStack-top = -1; void PushOPStack(pOPStack &pOStack, ch

13、ar ch) /運(yùn)算符進(jìn)棧 pOStack-opStack = ch; void PopOPStack(pOPStack &pOStack, char &ch) /運(yùn)算符出棧 ch = pOStack-opStack; pOStack-top-; void PushDATAStack(pDATAStack &pDStack, double d) /運(yùn)算數(shù)進(jìn)棧 (pDStack-top); pDStack-stack = d; void PopDATAStack(pDATAStack &pDStack, double &d) /運(yùn)算數(shù)出棧 d = pDStack-stack; pDStack-t

14、op-; void ClearpOPStack(pOPStack &pOStack) /清空運(yùn)算符棧 pOStack-top = -1; void ClearpDATAStack(pDATAStack &pDStack) /清空運(yùn)算數(shù)棧 pDStack-top = -1; char GetToppOPStack(pOPStack &pOStack) /獲取運(yùn)算符棧頂元素 return pOStack-opStack; double GetToppDATAStack(pDATAStack &pDStack) /獲取運(yùn)算數(shù)棧頂元素 return pDStack-stack; bool IsOP(c

15、har &ch) /區(qū)分運(yùn)算符和運(yùn)算數(shù)的函數(shù),是運(yùn)算符時(shí)返回true,否則返回false /判斷是否為符號(hào)if ( (ch = ) | (ch = -) | (ch = *) | (ch = /) | (ch = =) | (ch = A) | (ch = S) | (ch = a) | (ch = s) | (ch = () | (ch = ) ) return true; else return false; char Precede(char op1, char op2) /參考數(shù)據(jù)結(jié)構(gòu)(C語言版)第53頁表達(dá)式求值表 char tab; /定義字符串的二維數(shù)組來存放運(yùn)算符優(yōu)先級(jí)的關(guān)系s

16、trcpy( tab, ); strcpy( tab, ); strcpy( tab, ); strcpy( tab, ); strcpy( tab, strcpy( tab, E ); strcpy( tab, ); strcpy( tab, ); strcpy( tab, printf( | *歡迎您的下次使用!謝謝!* | ); /退出使用printf( | ); double Operate(double a, char theta, double b) /對(duì)出棧的運(yùn)算符和運(yùn)算數(shù)進(jìn)行計(jì)算 double s; switch(theta) case : s = a b; break; ca

17、se -: s = a - b; break; case *: s = a * b; break; case /: if ( b != 0 ) /判斷除數(shù)是否為0,若為0,退出程序 s = a/b; break; else printf( # 除數(shù)為0,非法運(yùn)算。程序終止! # ); exit_E(); /打印結(jié)束菜單exit(-1); case A: s = fabs(b); /調(diào)用FABS()函數(shù)break; case S: if( b = 0) /判斷被開方數(shù)是否為0,若為0,退出程序 s = sqrt(b); /調(diào)用SQRT()函數(shù)break; else printf( # 求負(fù)數(shù)的平

18、方根是非法運(yùn)算。程序終止! # ); exit_E(); /打印結(jié)束菜單exit(-1); return s; char ChangeChar(char &c) /通過ChangeChar函數(shù)來把a(bǔ)、s的小寫字母改為大寫的 if( c = a ) c = A; else if( c = s ) c = S; return c; /參考數(shù)據(jù)結(jié)構(gòu)(C語言版)第53頁表達(dá)式求值算法 Evaluateexpression_r()函數(shù)void Evaluateexpression_r() /計(jì)算函數(shù):讀入表達(dá)式,并計(jì)算結(jié)果 pOPStack pOStack; /聲明運(yùn)算符棧pDATAStack pDSt

19、ack; /聲明運(yùn)算數(shù)棧double result; /存運(yùn)算的結(jié)果char x, theta, c; /c存放讀取的字符,x、theta存放運(yùn)算符棧的棧頂元素int flag, data; /標(biāo)識(shí)符,用來讀入連續(xù)的數(shù)字double s; double getd; /存放GetTop*的結(jié)果double a, b, cc; /a,b存放數(shù)據(jù)棧出棧的棧頂元素, c存放運(yùn)算結(jié)果flag = 0; /初始化標(biāo)識(shí)符,用來判斷字符串中的連續(xù)數(shù)字data = 0; / InitpOPStack(pOStack); /初始化運(yùn)算符棧InitpDATAStack(pDStack); /初始化運(yùn)算數(shù)棧PushO

20、PStack(pOStack, =); /在運(yùn)算符棧底放入= printf( &請(qǐng)輸入表達(dá)式以=結(jié)束:); c = get); /讀入字符ChangeChar(c); /通過調(diào)用函數(shù)來實(shí)現(xiàn)把小寫的a、s改為大寫的A、S while( c != = | GetToppOPStack(pOStack) != =) if( !IsOP(c) ) /不是運(yùn)算符進(jìn)棧 s = c - 0; /把字符轉(zhuǎn)化為數(shù)字if ( flag = 1 ) PopDATAStack(pDStack, getd); s = getd*10 s; PushDATAStack(pDStack, s); flag = 1; c =

21、 get); ChangeChar(c); else flag = 0; switch( Precede(GetToppOPStack(pOStack), c) ) /輸入元素和運(yùn)算符棧頂元素比較 case PushOPStack(pOStack, c); c = get); ChangeChar(c); break; case =: /托括號(hào)并接受下一個(gè)字符PopOPStack(pOStack, x); c = get); ChangeChar(c); break; case : /退棧并將運(yùn)算結(jié)果進(jìn)棧PopOPStack(pOStack, theta); PopDATAStack(pDSt

22、ack, b); PopDATAStack(pDStack, a); cc = Operate(a, theta, b); PushDATAStack(pDStack, cc); break; /switch /else /while result = GetToppDATAStack(pDStack); /運(yùn)算結(jié)束時(shí),運(yùn)算數(shù)棧的棧底元素就是計(jì)算結(jié)果ClearpOPStack(pOStack); /清空運(yùn)算符棧ClearpDATAStack(pDStack); /清空運(yùn)算數(shù)棧printf( -計(jì)算結(jié)果為:%.2f , result); /輸出運(yùn)算結(jié)果return ; void print_user() /歡迎界面 printf( 歡迎使用C語言版模擬計(jì)算器 )

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論