版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 通達學院算法與數(shù)據(jù)結(jié)構(gòu)設(shè)計報告</p><p> ?。?2014/2015學年 第 二 學期 )</p><p> 題 目: 模擬簡單計算器 </p><p><b> 一、課題內(nèi)容和要求</b></p><p> 利用所學的數(shù)據(jù)結(jié)構(gòu)的基本知識,設(shè)計一個計算器(90)<
2、;/p><p> 輸入:帶有括號、+,-,X,/ 的表達式;</p><p><b> 輸出:運算結(jié)果</b></p><p> 實例:輸入:(4*3-(2+1))*2</p><p><b> 輸出: 18</b></p><p><b> 要求:</
3、b></p><p> 1)對不合法輸入進行檢測并提示;</p><p> 2)對合法輸入求出正確解;</p><p><b> 二、需求分析</b></p><p> 本程序主要是采用棧的理論知識,主要用到兩個結(jié)構(gòu)體棧,一個用來轉(zhuǎn)化表達式,一個用來計算表達式。</p><p>&l
4、t;b> 三、概要設(shè)計</b></p><p><b> 1設(shè)計理念 </b></p><p> 首先,用一個字符數(shù)組來存儲用戶輸入的中綴表達式。然后用棧來把這個表達式轉(zhuǎn)化為后綴表達式,轉(zhuǎn)化時要進行符號優(yōu)先級比較,這里將‘*’‘/’的優(yōu)先級定為2,‘+’‘-’定為1,括號和‘=’定為0。具體思想如下:例如用戶輸入了1+2*3=,將其存放入一個字
5、符數(shù)組中。先在棧的底部存放一個‘=’號符,用作符號優(yōu)先級比較。首先將1存放到另外一個字符數(shù)組s1中,再將‘+’號入棧。入棧的同時與底部的‘=’比較優(yōu)先級,‘+’的優(yōu)先級高于‘=’,所以不出棧,之后將2存放入s2中,然后再將‘*’入棧,入棧的同時與‘+’比較符號優(yōu)先級,‘*’比‘+’高,所以不出棧。再將3存入s2中。之后將棧中不是‘=’的運算符都彈出棧,并依次存入s2中。所以s2中的表達式為123*+。之后進行計算,計算時用到浮點棧。首先
6、將s2中的字符依次入棧,遇到運算符時進行計算。所以將123入棧后,再將‘*’入棧的同時,將前面兩個數(shù)字進行運算,算出結(jié)果為6并存入棧中,之后再將‘+’入棧,再與1進行運算,結(jié)果即為7,然后輸出結(jié)果。</p><p><b> 2.子函數(shù)功能</b></p><p> pseqstack1 init_seqstack1(void)</p><p&
7、gt;<b> {</b></p><p> pseqstack1 S;</p><p> S=(pseqstack1)malloc(sizeof(pseqstack1));</p><p><b> if(S)</b></p><p> S->top1=-1;</p>
8、<p><b> return S;</b></p><p><b> }初始化棧</b></p><p> int empty_seqstack1(pseqstack1 S)</p><p><b> {</b></p><p> if(S->to
9、p1==-1)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p>&
10、lt;b> 判斷棧是否為空</b></p><p> int push_seqstack1(pseqstack1 S,datatype1 X</p><p><b> 進棧</b></p><p> int pop_seqstack1(pseqstack1 S,datatype1 *X)</p><
11、p><b> 出棧</b></p><p> int GetTop(seqstack *s) </p><p><b> 取棧頂元素</b></p><p> int PP(char op,char c) </p><p> 比較棧頂元素與當前讀入的運算符的優(yōu)先級</p&
12、gt;<p> int Ope(int a,char m,int b) </p><p> 從數(shù)字棧中取出的兩個數(shù)的計算</p><p> int priority(char op)</p><p><b> 優(yōu)先級判斷函數(shù)</b></p><p> int infix_exp_value(cha
13、r *infixexp,char *postfixexp</p><p> 將指針infixexp指向的中綴表達式轉(zhuǎn)換為指針postfixexp指向的后綴表達式</p><p> double postfix_exp(char *A)</p><p><b> 求后綴表達式的值</b></p><p><b&
14、gt; 3.函數(shù)的調(diào)用</b></p><p><b> 四、詳細設(shè)計</b></p><p> # include <stdio.h></p><p> # include <malloc.h></p><p> # include <conio.h></
15、p><p> # define maxsize 100</p><p> typedef double datatype1;</p><p> typedef char datatype2;</p><p> typedef struct stack1 </p><p><b> {</b&
16、gt;</p><p> datatype1 data1[maxsize];</p><p> int top1;/*棧頂元素*/</p><p> }seqstack1,*pseqstack1; /*順序棧*/</p><p> typedef struct stack2 </p><p><b
17、> {</b></p><p> datatype2 data2[maxsize];</p><p> int top2;/*棧頂元素*/</p><p> }seqstack2,*pseqstack2; /*順序棧*/</p><p><b> /*棧的初始化*/</b></p
18、><p> pseqstack1 init_seqstack1(void)</p><p><b> {</b></p><p> pseqstack1 S;</p><p> S=(pseqstack1)malloc(sizeof(pseqstack1));</p><p><b>
19、; if(S)</b></p><p> S->top1=-1;</p><p><b> return S;</b></p><p><b> }</b></p><p> pseqstack2 init_seqstack2(void)</p><p
20、><b> {</b></p><p> pseqstack2 S;</p><p> S=(pseqstack2)malloc(sizeof(pseqstack2));</p><p><b> if(S)</b></p><p> S->top2=-1;</p>
21、<p><b> return S;</b></p><p><b> }</b></p><p><b> /*判斷棧空*/</b></p><p> int empty_seqstack1(pseqstack1 S)</p><p><b>
22、 {</b></p><p> if(S->top1==-1)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p&
23、gt;<b> }</b></p><p> int empty_seqstack2(pseqstack2 S)</p><p><b> {</b></p><p> if(S->top2==-1)</p><p><b> return 1;</b><
24、/p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> /*X入棧*/</b></p><p> int push_seq
25、stack1(pseqstack1 S,datatype1 X)</p><p><b> {</b></p><p> if(S->top1==maxsize-1)</p><p><b> {</b></p><p> printf("棧滿,無法入棧!\n");
26、</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> S->top1++;&
27、lt;/p><p> S->data1[S->top1]=X;</p><p> return 1;</p><p><b> }</b></p><p><b> }</b></p><p> int push_seqstack2(pseqstack2
28、S,datatype2 X)</p><p><b> {</b></p><p> if(S->top2==maxsize-1)</p><p><b> {</b></p><p> printf("棧滿,無法入棧!\n");</p><p&
29、gt;<b> return 0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> S->top2++;</p><p&g
30、t; S->data2[S->top2]=X;</p><p> return 1;</p><p><b> }</b></p><p><b> }</b></p><p><b> /*X出棧*/</b></p><p>
31、 int pop_seqstack1(pseqstack1 S,datatype1 *X)</p><p><b> {</b></p><p> if(empty_seqstack1(S))</p><p><b> return 0;</b></p><p><b> else
32、</b></p><p><b> {</b></p><p> *X=S->data1[S->top1];</p><p> S->top1--;</p><p> return 1;</p><p><b> }</b></
33、p><p><b> }</b></p><p> int pop_seqstack2(pseqstack2 S,datatype2 *X)</p><p><b> {</b></p><p> if(empty_seqstack2(S))</p><p><b&
34、gt; return 0;</b></p><p><b> else</b></p><p><b> {</b></p><p> *X=S->data2[S->top2];</p><p> S->top2--;</p><p>
35、 return 1;</p><p><b> }</b></p><p><b> }</b></p><p><b> /*求棧頂元素*/</b></p><p> int gettop_seqstack1(pseqstack1 S,datatype1 *X)&
36、lt;/p><p><b> {</b></p><p> if(empty_seqstack1(S))</p><p> return 0; </p><p><b> else</b></p><p> *X=S->data1[S->
37、top1];</p><p> return 1;</p><p><b> }</b></p><p> int gettop_seqstack2(pseqstack2 S,datatype2 *X)</p><p><b> {</b></p><p> i
38、f(empty_seqstack2(S))</p><p> return 0; </p><p><b> else</b></p><p> *X=S->data2[S->top2];</p><p> return 1;</p><p><b
39、> }</b></p><p> /*判斷字符是否為操作數(shù)。若是返回1,否則返回0*/</p><p> int isnum(char c)</p><p><b> {</b></p><p> if(c>='0' && c<='9'
40、;)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> /*求后
41、綴表達式的值*/</p><p> double postfix_exp(char *A)</p><p><b> {</b></p><p> pseqstack1 S;/*定義棧S*/</p><p> double operand=0;</p><p> double resu
42、lt;/*存放棧頂元素*/</p><p> double a;/*運算符ch前的操作數(shù)出棧存入a*/</p><p> double b;/*運算符ch后的操作數(shù)出棧存入b*/</p><p> double c;/*c==a ch b*/</p><p> char ch;/*存放讀取到的表達式(A)的字符*/<
43、/p><p> ch=*A++;/*讀表達式字符=>A*/</p><p> S=init_seqstack1();/*初始化棧*/</p><p> while(ch!='#')/*遇到元素!='#'時*/</p><p><b> {</b></p><
44、;p> if(isnum(ch))/*判斷ch是否為數(shù)字字符,計算出操作數(shù)*/</p><p> operand=operand*10+(ch-'0');</p><p> else/*否則*/</p><p><b> {</b></p><p> if(operand)</p&
45、gt;<p><b> {</b></p><p> push_seqstack1(S,operand);/*當前字符不是數(shù)字,操作數(shù)結(jié)束,要入棧*/</p><p> operand=0;</p><p><b> }</b></p><p> if(ch!='@&
46、#39; && ch!=' ')</p><p><b> {</b></p><p> pop_seqstack1(S,&b);/*運算符ch后的操作數(shù)出棧存入b*/</p><p> pop_seqstack1(S,&a);/*運算符ch前的操作數(shù)出棧存入a*/</p>
47、;<p> switch(ch)/*求 a ch b==? ,將結(jié)果賦給 c */</p><p><b> {</b></p><p> case '+' : </p><p><b> c=a+b;</b></p><p><b> break
48、;</b></p><p> case '-' : </p><p><b> c=a-b;</b></p><p><b> break;</b></p><p> case '*' : </p><p><b>
49、; c=a*b;</b></p><p><b> break;</b></p><p> case '/' :</p><p><b> if(b!=0)</b></p><p><b> c=a/b;</b></p>&l
50、t;p><b> else</b></p><p> printf("分母為零!");</p><p><b> }</b></p><p> push_seqstack1(S,c);/*將c壓入棧中*/</p><p><b> }</b>
51、;</p><p><b> }</b></p><p> ch=*A++;/*指針向下移動一位*/</p><p> }/*遇到'#'循環(huán)結(jié)束*/</p><p> gettop_seqstack1(S,&result);/*此時棧頂元素即為計算結(jié)果result*/</p>
52、<p> return result;</p><p><b> }</b></p><p> /*優(yōu)先級判斷函數(shù)*/</p><p> int priority(char op)</p><p><b> {</b></p><p> switch
53、(op)</p><p><b> {</b></p><p> case '#': return 1;</p><p> case ')': return 2;</p><p> case '+': </p><p> case '
54、;-': return 3;</p><p> case '*': </p><p> case '/': return 4;</p><p> case '(': return 5;</p><p> default : return 0;</p><p&
55、gt;<b> } </b></p><p><b> }</b></p><p> /*將指針infixexp指向的中綴表達式轉(zhuǎn)換為指針postfixexp指向的后綴表達式*/</p><p> int infix_exp_value(char *infixexp,char *postfixexp)</
56、p><p><b> {</b></p><p> pseqstack2 S;/*定義棧S*/</p><p> int count=0;</p><p> char w;/*存放讀取到的表達式(infixexp)的字符*/</p><p> char c;/*存放棧頂元素*/<
57、/p><p> char topelement;/*存出棧元素*/</p><p> S=init_seqstack2();/*初始化棧*/</p><p> if(!S)/*棧的初始化判斷*/</p><p><b> {</b></p><p> printf("棧初始化失
58、敗!");</p><p><b> return 0;</b></p><p><b> }</b></p><p> push_seqstack2(S,'#');/*將結(jié)束符'# '加入運算符棧S中*/</p><p> w=*i
59、nfixexp;/*讀表達式字符=>w*/</p><p> while((gettop_seqstack2(S,&c),c)!='#'||w!='#')/*<3>棧頂元素不等于'#'或w不等于'#'時循環(huán)*/</p><p><b> {</b></p>&
60、lt;p> if(isnum(w))/*判斷w是否為操作數(shù),若是直接輸出,讀下一個字符=>w,轉(zhuǎn)<3>*/</p><p><b> {</b></p><p><b> if(count)</b></p><p><b> {</b></p><p
61、> *postfixexp='@';</p><p> postfixexp++;</p><p><b> count=0;</b></p><p><b> }</b></p><p> *postfixexp=w;</p><p> p
62、ostfixexp++;</p><p> w=*(++infixexp);</p><p><b> }</b></p><p> else/*w若是運算符分類如下*/</p><p><b> {</b></p><p><b> count=1;&
63、lt;/b></p><p> if( (gettop_seqstack2(S,&c),c)=='(' && w==')' )</p><p> {/*如果棧頂為'('并且w為')'則'('出棧不輸出,讀下一個字符=>w,轉(zhuǎn)<3>*/</p>&
64、lt;p> pop_seqstack2(S,&topelement); /*將'('出棧存入topelement*/</p><p> w=*(++infixexp);</p><p><b> }</b></p><p><b> else</b></p><p
65、> if( (gettop_seqstack2(S,&c),c)=='(' || priority( (gettop_seqstack2(S,&c),c) ) < priority(w) )</p><p> {/*如果棧頂為'('或者棧頂優(yōu)先級小于w優(yōu)先級,則w入棧,讀下一個字符=>w,轉(zhuǎn)<3>*/</p><
66、p> push_seqstack2(S,w);</p><p> w=*(++infixexp);</p><p><b> }</b></p><p> else/*否則*/</p><p> {/*從運算符棧中出棧并輸出,轉(zhuǎn)<3>*/</p><p> pop_s
67、eqstack2(S,&topelement);</p><p> *postfixexp=topelement;</p><p> postfixexp++;</p><p><b> }</b></p><p><b> }</b></p><p&g
68、t;<b> }</b></p><p> *postfixexp='#';/*在指針postfixexp指向的后綴表達式結(jié)尾追加字符'#'*/</p><p> *(++postfixexp)='\0';/*在指針postfixexp指向的后綴表達式最后追加結(jié)束符'\0'*/</p>
69、<p><b> return 1;</b></p><p><b> }</b></p><p><b> /*主函數(shù)*/</b></p><p> int main()</p><p><b> { </b></p>
70、<p><b> int i=0;</b></p><p> char A[maxsize];</p><p> char B[maxsize];</p><p> printf("請輸入表達式,如:11+22#,必須以#號結(jié)尾!\n"); </p><p> /* 1+2*(
71、9+7)-4/2# 23+((12*3-2)/4+34*5/7)+108/9# */</p><p> A[i]=getchar();</p><p> while(A[i++]!='#')</p><p><b> {</b></p><p> A[i]=getchar();</p>
72、;<p><b> }</b></p><p> A[i]='\0';</p><p> infix_exp_value(A,B);</p><p> printf("A==%s\n",A);</p><p> printf("B==%s\n"
73、;,B);</p><p> printf("上式的結(jié)果為: ");</p><p> printf("%g\n",postfix_exp(B));</p><p><b> return 0;</b></p><p><b> getch();</b>
74、;</p><p><b> }</b></p><p><b> 五、測試及結(jié)果分析</b></p><p><b> 加法測試</b></p><p><b> 1+2+3=6</b></p><p><b>
75、 減法測試</b></p><p><b> 5-2-1=2</b></p><p><b> 乘法測試</b></p><p><b> 1*2*3=6</b></p><p><b> 除法測試</b></p>&l
76、t;p><b> 9/3/2=1.5</b></p><p><b> 混合運算</b></p><p><b> 1*(3+2)</b></p><p> 六、調(diào)試過程中的問題</p><p> 函數(shù)double postfix_exp(char *A)修改前
77、后對比</p><p> 函數(shù)int infix_exp_value(char *infixexp,char *postfixexp)修改前后對比</p><p><b> 七、課程設(shè)計總結(jié)</b></p><p> 通過這一周的課程設(shè)計,模擬簡單計算器算法有了初步的了解。這次實驗雖然時間不長,但是,我還是收獲了許多,首先,要完成一個課程
78、設(shè)計師需要我們有嚴謹?shù)目茖W態(tài)度和扎實的理論知識作為基礎(chǔ)和后盾的;其次,還要將理論知識與實際課題相結(jié)合,融會貫通。雖然我們之前對數(shù)據(jù)結(jié)構(gòu)和C語言的聯(lián)合使用并不熟悉,但通過老師的詳細講解和指導、及同學的互相幫助,最終完成了本次課程設(shè)計。在這次課程設(shè)計中,我們還存在著有待改進和完善的地方,還需要我們更加深入的去學習和了解這方面的知識,用更加完善的知識儲備和自己的思考能力相結(jié)合,相信能夠?qū)⒋舜握n程設(shè)計做的更好,也能更好的提高自己的綜合素質(zhì)和能力
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--簡單計算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--多項式計算器
- 計算器java課程設(shè)計--簡單計算器
- 簡單計算器課程設(shè)計
- 簡單計算器課程設(shè)計報告
- 簡單的計算器課程設(shè)計
- 課程設(shè)計---簡單的計算器
- vb課程設(shè)計--簡單計算器
- 簡單的計算器課程設(shè)計
- 簡單計算器課程設(shè)計報告
- 課程設(shè)計--簡單計算器的設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告(二)表達式求值(計算器)
- 課程設(shè)計--簡單的計算器設(shè)計
- 課程設(shè)計--簡單計算器的設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-一元多項式計算器
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計
- 算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- c++課程設(shè)計--簡單計算器
- 課程設(shè)計計算器模擬
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計
評論
0/150
提交評論