版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計(jì)</p><p> 課程設(shè)計(jì)名稱: 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) </p><p> 專 業(yè) 班 級 : </p><p> 學(xué) 生 姓 名 : </p><p> 學(xué) 號 :
2、 </p><p> 指 導(dǎo) 教 師 : </p><p> 課程設(shè)計(jì)時(shí)間: </p><p> 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)課程設(shè)計(jì)任務(wù)書</p><p><b> 1.需求分析</b></
3、p><p> 24點(diǎn)游戲主要有兩個(gè)功能:</p><p> (1)用戶記算24點(diǎn)</p><p> 程序隨機(jī)產(chǎn)生四個(gè)1-13的數(shù),分別代表4張牌, 提示用戶輸入算式。如果用戶認(rèn)為程序給出的一組數(shù)字不能算出24點(diǎn)(如1,1,2,2),則輸入‘?’,然后程序?qū)λ膫€(gè)數(shù)字進(jìn)行計(jì)算,如果真的不能算出24點(diǎn),則輸出用戶正確的信息,否則給出一個(gè)正確的算式,并顯示用戶錯(cuò)誤的信息。
4、</p><p> (2).程序計(jì)算24點(diǎn)</p><p> 用戶輸入四個(gè)1-13的數(shù),代表4張牌,程序需要通過一定的規(guī)則添加括號和運(yùn)算符來使算式的值等于24,如果用戶給出的四個(gè)數(shù)字不能算出24點(diǎn),則輸出錯(cuò)誤信息!</p><p><b> 2.概要設(shè)計(jì)</b></p><p><b> 抽象數(shù)據(jù)結(jié)構(gòu)定
5、義:</b></p><p><b> ADT{</b></p><p> 數(shù)據(jù)對象:D={a|a為大于0小于14的整數(shù)}</p><p> push(sqstack *s,int e) //壓棧</p><p> gettop(sqstack *s) //取得棧頂元素</p>&l
6、t;p> pop(sqstack *s,int *e) //出棧</p><p> randomm() //產(chǎn)生四個(gè)隨機(jī)數(shù)</p><p> EvaluateExpression(char* MyExpression) </p><p> //課本算法3.4---計(jì)算表達(dá)式的值</p><p> init_sq(sqlis
7、t *l) //初始化鏈表</p><p> insert_sq(sqlist **p,int e,int bl) //鏈表插入操作</p><p> chang(char *s,sqlist *l) //將用戶的輸入轉(zhuǎn)化為單鏈表</p><p> check(sqlist l) //保證輸入的數(shù)字是給出的四個(gè)數(shù)字</p><p&g
8、t; Operate(int a,int theta, int b) //計(jì)算</p><p> precede(char Aop, char Bop) //求運(yùn)算符優(yōu)先級</p><p> ReturnOpOrd(char op,char* TestOp) //返回運(yùn)算符優(yōu)先級</p><p> CalcOneExpress(int expressi
9、on[][2])</p><p> //課本算法3.4--計(jì)算表達(dá)式的值</p><p> Calc24(int number[2][4])</p><p> //包含下面五個(gè)函數(shù),即表達(dá)式的五種形式</p><p> CalcArray1(int iNumInput[2][4])</p><p> // a
10、 * b * c * d //7 個(gè)字符</p><p> CalcArray2(int iNumInput[2][4])</p><p> // (a * b) * c * d //9 number</p><p> CalcArray3(int iNumInput[2][4])</p><p> // (a * b * c)
11、 * d //9 number</p><p> CalcArray4(int iNumInput[2][4])</p><p> // (a * b) * (c * d) //11 numbers</p><p> CalcArray5(int iNumInput[2][4])</p><p> // ((a * b) * c
12、) * d //11 numbers</p><p> Equal24(int n) //判定結(jié)果是否等于24</p><p> gameinformation() //游戲介紹</p><p> menu() //菜單</p><p> main() //主函數(shù)</p><p><b>
13、 }ADT</b></p><p><b> 模塊劃分</b></p><p><b> 3 運(yùn)行環(huán)境</b></p><p><b> 硬件環(huán)境:PC機(jī)</b></p><p> 軟件環(huán)境:Windows XP</p><p>
14、Microsoft Visual C++ 6.0</p><p> 4 開發(fā)工具和編程語言</p><p> 開發(fā)工具:Microsoft Visual C++ 6.0 </p><p><b> 編程語言:C語言</b></p><p><b> 5 詳細(xì)設(shè)計(jì)</b></p>
15、<p> ?。?)全局變量和棧,鏈表的定義</p><p> int number[2][4];</p><p><b> enum{</b></p><p> eNumber = 0,//操作數(shù)</p><p> eOperator = 1//算子</p><p><b
16、> };</b></p><p> int oper[7]={43,45,42,47,40,41,35};</p><p> 課本 表3.1 算符間的優(yōu)先關(guān)系:</p><p> unsigned char Prior[7][7] = {</p><p> '>','>'
17、,'<','<','<','>','>',</p><p> '>','>','<','<','<','>','>',</p><
18、p> '>','>','>','>','<','>','>',</p><p> '>','>','>','>','<','>&
19、#39;,'>',</p><p> '<','<','<','<','<','=',' ',</p><p> '>','>','>','>&
20、#39;,' ','>','>',</p><p> '<','<','<','<','<',' ','='</p><p><b> };</b></p&g
21、t;<p><b> 線性表的定義:</b></p><p> typedef struct sqlist{ </p><p> int bol; //bol是0時(shí),num-ch是數(shù)字;bol是1時(shí)num_ch是運(yùn)算符</p><p> int num_ch;</p><p> struct s
22、qlist *next;</p><p><b> }sqlist;</b></p><p><b> 棧的定義:</b></p><p> typedef struct sqstack{ </p><p> int *base;</p><p><b>
23、 int *top;</b></p><p> int stacksize;</p><p> }sqstack; </p><p> ?。?)main()函數(shù)及用戶界面</p><p> void main(){</p><p> gameinformation(); //輸出作者信息</
24、p><p> menu(); //輸出功能菜單,游戲開始</p><p><b> }</b></p><p> 用戶界面如 圖1 所示。</p><p> (3)由程序計(jì)算24點(diǎn)的算法分析:</p><p> 用戶輸入四個(gè)1-13的數(shù),代表4張牌,程序算24點(diǎn)。這要考慮到各種情況。首先是
25、加入括號,有以下5種可能的形式:</p><p> . a b c d</p><p> . (a b) c d</p><p> 同 a b (c d) 和 a (b c) d</p><p> . (a b c) d</p><p> . (a
26、 b) (c d)</p><p> . ( (a b) c) d</p><p> 同 (a (b c)) d</p><p> 然后根據(jù)上述 5 種情況加入運(yùn)算符。</p><p> 對于每種不同的算式形式,先在固定的位置加入括號。程序通過4層循環(huán)對四個(gè)數(shù)字進(jìn)行賦值,并對循環(huán)加以控制,使每個(gè)數(shù)字只用一次,
27、然后再通過三層循環(huán)對三個(gè)位置的運(yùn)算符賦值。每一次循環(huán)都會(huì)產(chǎn)生一個(gè)數(shù)組,別調(diào)用下面的CalcOneExpress函數(shù)求算式的值!結(jié)果可能算出24點(diǎn),或者算不出24點(diǎn) (如圖2,圖3)。</p><p> 以下兩段代碼是對針對第一種形式的算式求24點(diǎn)。過程為:對四個(gè)數(shù)字和三個(gè)運(yùn)算符賦值(CalcArray1(int iNumInput[2][4]))----計(jì)算算式的值(CalcOneExpress(int exp
28、ression[][2]))---驗(yàn)證是否等于24---輸出結(jié)果:</p><p><b> 代碼1. </b></p><p> // a * b * c * d7 個(gè)字符</p><p> int CalcArray1(int iNumInput[2][4])</p><p><b> {<
29、/b></p><p> int expression[8][2],ii,jj,kk;</p><p> int i,j,k,l,dRes;</p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> for(j=0;j<
30、4;j++)</p><p><b> {</b></p><p> if(j==i) continue;</p><p> for(k=0;k<4;k++)</p><p><b> {</b></p><p> if(k==i||k==j) conti
31、nue;</p><p> for(l=0;l<4;l++)</p><p><b> {</b></p><p> if(l==i||l==j||l==k) continue;</p><p> expression[0][0]=iNumInput[0][i];</p><p>
32、 expression[2][0]=iNumInput[0][j];</p><p> expression[4][0]=iNumInput[0][k];</p><p> expression[6][0]=iNumInput[0][l];</p><p> expression[0][1]=eNumber;</p><p> ex
33、pression[2][1]=eNumber;</p><p> expression[4][1]=eNumber;</p><p> expression[6][1]=eNumber;</p><p> for (ii=0;ii<4;ii++)</p><p><b> {</b></p>
34、<p> for (jj=0;jj<4;jj++)</p><p><b> {</b></p><p> for (kk=0;kk<4;kk++)</p><p><b> {</b></p><p> expression[1][0] = oper[ii];<
35、;/p><p> expression[1][1] = eOperator;</p><p> expression[3][0] = oper[jj];</p><p> expression[3][1] = eOperator;</p><p> expression[5][0] = oper[kk];</p><p
36、> expression[5][1] = eOperator;</p><p> expression[7][0] = oper[6];</p><p> expression[7][1] = eOperator;</p><p> dRes = CalcOneExpress(expression);</p><p> //
37、對每一個(gè)算式求值,直到算出24點(diǎn)</p><p> if(Equal24(dRes))</p><p> //判定表達(dá)式的值是否為24</p><p><b> {</b></p><p> printf("可以這樣運(yùn)算:%d%c%d%c%d%c%d\n",expression[0][0],o
38、per[ii],</p><p> expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]);</p><p><b> return 1;</b></p><p><b> }</b></p><p><
39、b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b>
40、 }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 代碼2.</b></p><p> //課本算法3.4---計(jì)算 算式的值</p><p> in
41、t CalcOneExpress(int expression[][2])</p><p><b> {</b></p><p> // 算術(shù)表達(dá)式求值的算符優(yōu)先算法。</p><p> // 設(shè)OPTR和&&OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧,OP為運(yùn)算符集合。</p><p> int inde
42、x=0,result,c,theta,a,b;</p><p> sqstack OPTR; // 運(yùn)算符棧,字符元素</p><p> sqstack OPND; // 運(yùn)算數(shù)棧,實(shí)數(shù)元素</p><p> initstack(&OPTR);</p><p> push(&OPTR, 35);</p&g
43、t;<p> initstack (&OPND);</p><p> c=expression[index][0];</p><p> while (c!= 35 || gettop(&OPTR)!=35)</p><p><b> {</b></p><p> if(expres
44、sion[index][1]!=1)</p><p><b> {</b></p><p> push(&OPND, c);</p><p><b> index++;</b></p><p> c=expression[index][0];</p><p>
45、 } // 不是運(yùn)算符則進(jìn)棧</p><p><b> else</b></p><p><b> {</b></p><p> switch ( precede((char)gettop(&OPTR), (char)c) )</p><p><b> {</b&g
46、t;</p><p> case '<': // 棧頂元素優(yōu)先權(quán)低</p><p> push(&OPTR, c);</p><p><b> index++;</b></p><p> c=expression[index][0];</p><p>&l
47、t;b> break;</b></p><p> case '=': // 脫括號并接收下一字符</p><p> pop(&OPTR, &c); </p><p><b> index++;</b></p><p> c=expression[index]
48、[0]; </p><p><b> break;</b></p><p> case '>': // 退棧并將運(yùn)算結(jié)果入棧</p><p> pop(&OPTR, &theta);</p><p> pop(&OPND, &b); </p>
49、<p> pop(&OPND, &a);</p><p> push(&OPND, Operate(a, theta, b));</p><p><b> break;</b></p><p><b> default:</b></p><p> pri
50、ntf("沒有這個(gè)運(yùn)算符\n");</p><p><b> return 0;</b></p><p> } // switch</p><p><b> }//else</b></p><p> } // while</p><p> res
51、ult=gettop(&OPND);</p><p> return result;</p><p> } // end CalcOneExpress</p><p> ?。?)由用戶計(jì)算24點(diǎn)的算法分析:</p><p> 先由程序產(chǎn)生4個(gè)隨機(jī)數(shù);</p><p> int randomm()<
52、/p><p><b> {</b></p><p><b> int i=0;</b></p><p> srand((unsigned)time(NULL));</p><p> for(;i<4;i++){</p><p> number[0][i]=0;&l
53、t;/p><p> number[0][i]=rand();</p><p> number[0][i]%=13;</p><p> number[0][i]++;</p><p> number[1][i]=0;</p><p><b> }</b></p><p>
54、; return number[2][4];</p><p><b> }</b></p><p><b> 用戶判定</b></p><p> 如果用戶認(rèn)為程序產(chǎn)生的四個(gè)隨機(jī)數(shù)不能算出24點(diǎn)則輸入‘?’,程序接收到該字符后,則進(jìn)行步驟(3)的操作,如果真的不能算出24點(diǎn),則輸出用戶正確的信息,否者輸出用戶錯(cuò)誤的信
55、息,并輸出一個(gè)正確的算式。(請看圖4,圖5,圖6)</p><p> 如果用戶認(rèn)為可以算出24點(diǎn),則輸入算式,程序?qū)Υ怂闶角笾?,若結(jié)果為24,程序輸出用戶正確的信息,否則輸出用戶錯(cuò)誤的信息。</p><p> 此過程中,程序先將用戶輸入的算式轉(zhuǎn)化成單鏈表的形式,其功能和步驟(2)中的數(shù)組是基本一樣的。然后檢驗(yàn)用戶輸入的算式中是否有非法字符,若有這輸出錯(cuò)誤信息并結(jié)束;若沒有則計(jì)算算式的值
56、,驗(yàn)證是否等于24,并輸出正確或錯(cuò)誤的信息!</p><p><b> 部分重要代碼:</b></p><p><b> 代碼1.</b></p><p> 算法 3.4 計(jì)算表達(dá)式的值:</p><p> EvaluateExpression(char* MyExpression) <
57、;/p><p><b> {</b></p><p> // 算術(shù)表達(dá)式求值的算符優(yōu)先算法。</p><p> // 設(shè)OPTR和&&OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧</p><p> int result;</p><p> sqstack OPTR; // 運(yùn)算符
58、棧,字符元素</p><p> sqstack OPND; // 運(yùn)算數(shù)棧,實(shí)數(shù)元素</p><p> int c,bl,a,b,theta,top;</p><p> sqlist *q,l;</p><p> char *s=MyExpression;</p><p> init_sq(&
59、;l);</p><p> if(chang(s,&l)!=0)//將表達(dá)式轉(zhuǎn)為鏈表</p><p><b> {</b></p><p><b> q=&l;</b></p><p> initstack(&OPTR);</p><p>
60、push(&OPTR, 35);</p><p> initstack (&OPND);</p><p> q=q->next;</p><p> c=q->num_ch;</p><p> bl=q->bol;</p><p> while ((c!= 35 || gett
61、op(&OPTR)!=35)){</p><p> if (bl!=1){</p><p> push(&OPND, c);</p><p> q=q->next;</p><p> c=q->num_ch;</p><p> bl=q->bol;</p>&l
62、t;p> } // 不是運(yùn)算符則進(jìn)棧</p><p><b> else{</b></p><p> top=gettop(&OPTR);</p><p> switch (precede((char)top, (char)c)){</p><p> case '<':
63、// 棧頂元素優(yōu)先權(quán)低</p><p> push(&OPTR, c);</p><p> q=q->next;</p><p> c=q->num_ch;</p><p> bl=q->bol;</p><p><b> break;</b></p>
64、;<p> case '=': // 脫括號并接收下一字符</p><p> pop(&OPTR, &c);</p><p> q=q->next;</p><p> c=q->num_ch;</p><p> bl=q->bol;</p><p
65、><b> break;</b></p><p> case '>': // 退棧并將運(yùn)算結(jié)果入棧</p><p> pop(&OPTR, &theta);</p><p> pop(&OPND, &b);</p><p> pop(&OP
66、ND, &a);</p><p> push(&OPND, Operate(a, theta, b));</p><p><b> break;</b></p><p><b> default :</b></p><p> printf("沒有這個(gè)運(yùn)算符!\n&q
67、uot;);</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> result=gett
68、op(&OPND);</p><p> return result;</p><p><b> }</b></p><p><b> else {</b></p><p> printf("你的輸入有錯(cuò)誤!\n");</p><p><
69、;b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 代碼2. </b></p><p> 將用戶的輸入轉(zhuǎn)化為單鏈表:</p><p> i
70、nt chang(char *s,sqlist *l){ </p><p><b> int t=0;</b></p><p> unsigned int i=0;</p><p> int bl,ch;</p><p> int a1,a2,a;</p><p> sqlist *p=
71、l;</p><p> for (;i<strlen(s);i++)</p><p><b> {</b></p><p> if(s[i]>47&&s[i]<58&&t==0){</p><p> a1=(int)s[i]-48;</p><
72、p><b> t++;</b></p><p><b> }</b></p><p> else if(s[i]>47&&s[i]<58&&t==1){</p><p> a2=(int)s[i]-48;</p><p> a=a1*10+
73、a2;</p><p><b> t++;</b></p><p><b> }</b></p><p> else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){</p><p><b>
74、; if(t==1){</b></p><p><b> bl=0;</b></p><p> insert_sq(&p,a1,bl);</p><p><b> t=0;</b></p><p><b> }</b></p><
75、;p> else if(t==2){</p><p><b> bl=0;</b></p><p> insert_sq(&p,a,bl);</p><p><b> t=0;</b></p><p><b> }</b></p><
76、p><b> bl=1;</b></p><p> ch=(int)s[i];</p><p> insert_sq(&p,ch,bl);</p><p><b> t=0;</b></p><p><b> }</b></p><p
77、><b> else {</b></p><p> printf("%c不是有效的運(yùn)算符!\n",s[i]);</p><p><b> }</b></p><p><b> }</b></p><p> i=strlen(s)-1;<
78、/p><p> if(s[i]>47&&s[i]<58){</p><p> if(s[i-1]>47&&s[i-1]<58){</p><p><b> bl=0;</b></p><p> insert_sq(&p,a,bl);</p>
79、<p><b> }</b></p><p><b> else {</b></p><p><b> bl=0;</b></p><p> insert_sq(&p,a1,bl);</p><p><b> }</b><
80、;/p><p><b> }</b></p><p><b> bl=1;</b></p><p><b> a=35;</b></p><p> insert_sq(&p,a,bl);</p><p> return (check(*l)
81、);</p><p><b> }</b></p><p><b> 代碼3. </b></p><p><b> 鏈表插入操作:</b></p><p> int insert_sq(sqlist **p,int e,int bl){ </p><
82、p> sqlist *q;</p><p> q=(sqlist*)malloc(sizeof(sqlist));</p><p> q->num_ch=e;</p><p> q->bol=bl;</p><p> q->next=NULL;</p><p> (*p)->n
83、ext=q;</p><p> (*p)=(*p)->next;</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> 6.調(diào)式分析</b></p><p> 1.在解決某一
84、個(gè)問題之前一定要把算法想清楚,考慮到全局,以免造成大量不必要的改動(dòng)。</p><p> 2.用scanf輸入數(shù)據(jù)時(shí),一定要注意格式,否則就會(huì)出錯(cuò)!</p><p> 3.在函數(shù)調(diào)用時(shí),參數(shù)類型一定要一致,否者會(huì)產(chǎn)生警告信息,甚至導(dǎo)致結(jié)果出錯(cuò)。</p><p> 4.如果不使用time函數(shù),則產(chǎn)生的隨機(jī)數(shù)是重復(fù)出現(xiàn)的。</p><p>
85、 5.用戶輸入的算式,也可以轉(zhuǎn)化為數(shù)組進(jìn)行操作,但算式的形式不確定,轉(zhuǎn)化為鏈表似乎省去了很多麻煩。</p><p> 6.剛開始沒有對CalcArray(int iNumInput[2][4])函數(shù)中的循環(huán)加以控制,結(jié)果造成數(shù)字重復(fù)使用。</p><p> 7.在單鏈表形成之后,在其中取數(shù)據(jù)元素,要從q->next開始,其頭結(jié)點(diǎn)中不含要用的數(shù)據(jù),應(yīng)跳過,否則結(jié)果不可預(yù)料。<
86、/p><p> 8.如果想通過調(diào)用函數(shù)來改變幾個(gè)變量的值,那么用指針應(yīng)該是很方便的。</p><p> 9.要改變指針值,需要使用二級指針</p><p> 10.由于在C語言中函數(shù)都是全局作用域的,因此不要使用和庫中的函數(shù)名相同的標(biāo)識符,否則會(huì)出現(xiàn)錯(cuò)誤。包括宏標(biāo)識符也有這樣的問題。</p><p><b> 7.測試結(jié)果圖&l
87、t;/b></p><p><b> ?。?)用戶界面</b></p><p><b> 圖1</b></p><p> ?。?)用戶輸入數(shù)據(jù),程序算出結(jié)果</p><p><b> 圖2</b></p><p> ?。?)用戶輸入的數(shù)據(jù)算不出
88、24點(diǎn)</p><p><b> 圖3</b></p><p> (4)程序給出數(shù)字,用戶認(rèn)為算不出24點(diǎn)</p><p><b> 圖4</b></p><p><b> ?。?)用戶計(jì)算出錯(cuò)</b></p><p><b> 圖5&
89、lt;/b></p><p> ?。?)程序給出數(shù)字,用戶算出正確結(jié)果</p><p><b> 圖6</b></p><p><b> 8.參考文獻(xiàn)</b></p><p> 1 張鳳琴,張青鳳.數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)指導(dǎo)與習(xí)題詳解,清華大學(xué)出版社,2007</p><p&g
90、t; 2 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版). 清華大學(xué)出版社,2008</p><p> 3 潭浩強(qiáng).C語言程序設(shè)計(jì)(第三版). 清華大學(xué)出版社,2005</p><p> 4 潭浩強(qiáng).C語言程序設(shè)計(jì)題解與上機(jī)指導(dǎo)(第三版). 清華大學(xué)出版社,2005</p><p> 5張 曼,朱小谷,呂士俊.數(shù)據(jù)結(jié)構(gòu)習(xí)題與解答 . 北京希望電子出版社.2005<
91、;/p><p><b> 課程設(shè)計(jì)總結(jié)</b></p><p> 源代碼:(此為可運(yùn)行的源代碼直接復(fù)制粘貼過來的,如直接復(fù)制不能運(yùn)行,可粘貼到文本中進(jìn)行字符過濾,然后自粘貼到編譯器中)</p><p> #include<stdio.h></p><p> #include<string.h>
92、</p><p> #include<stdlib.h></p><p> #include<time.h></p><p> #define OPSETSIZE 7</p><p> #define STACK_INIF_SIZE 50</p><p> #define STACKI
93、NCREMENT 10</p><p> int number[2][4];</p><p><b> enum</b></p><p><b> {</b></p><p> eNumber = 0,//操作數(shù)</p><p> eOperator = 1//
94、算子</p><p><b> };</b></p><p> int oper[7]={43,45,42,47,40,41,35};</p><p> char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , &
95、#39;)' , '#'};</p><p> typedef struct sqlist{</p><p> int bol;//bol 是 0 時(shí),num-ch是一個(gè)數(shù)字;bol 是 1 時(shí) num_ch 運(yùn)算符</p><p> int num_ch;</p><p> struct sqlist *ne
96、xt;</p><p> }sqlist;//線性表</p><p> typedef struct sqstack{</p><p> int *base;</p><p><b> int *top;</b></p><p> int stacksize;</p>&l
97、t;p> }sqstack;//棧的定義</p><p> unsigned char Prior[7][7] = {// 課本 表3.1 算符間的優(yōu)先關(guān)系</p><p> '>','>','<','<','<','>','>
98、9;,</p><p> '>','>','<','<','<','>','>',</p><p> '>','>','>','>','&
99、lt;','>','>',</p><p> '>','>','>','>','<','>','>',</p><p> '<','<',
100、'<','<','<','=',' ',</p><p> '>','>','>','>',' ','>','>',</p><p>
101、9;<','<','<','<','<',' ','='</p><p><b> };</b></p><p> int init_sq(sqlist *l){//初始化鏈表</p><p> l=(sq
102、list*)malloc(sizeof(sqlist));</p><p> if(l==NULL){</p><p><b> exit(-2);</b></p><p><b> }</b></p><p> l->next=NULL;</p><p>&l
103、t;b> return 1;</b></p><p><b> }</b></p><p> int insert_sq(sqlist **p,int e,int bl){//鏈表插入操作</p><p> sqlist *q;</p><p> q=(sqlist*)malloc(sizeo
104、f(sqlist));</p><p> q->num_ch=e;</p><p> q->bol=bl;</p><p> q->next=NULL;</p><p> (*p)->next=q;</p><p> (*p)=(*p)->next;</p><
105、;p><b> return 1;</b></p><p><b> }</b></p><p> int check(sqlist l)//保證輸入的數(shù)字是給出的四個(gè)數(shù)字</p><p><b> {</b></p><p> int right=1,find
106、=0,i;</p><p> sqlist *q=&l;</p><p> q=q->next ;</p><p> for (;q->next!=NULL;q=q->next){</p><p> if(q->bol==1){</p><p> if(q->num_ch
107、 <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){</p><p><b> right=0;</b></p><p> printf("%c不是有效的運(yùn)算符!\n");</p><p><b> }</b><
108、/p><p><b> }</b></p><p><b> else {</b></p><p><b> find=0;</b></p><p> for(i=0;i<4;i++){</p><p> if(number[1][i]==0
109、&&number[0][i]==q->num_ch ){</p><p> number[1][i]=1;</p><p><b> find=1;</b></p><p><b> break;</b></p><p><b> }</b><
110、;/p><p><b> }</b></p><p> if(find==0){</p><p> printf("%d 不在給出的四個(gè)數(shù)字中!\n",q->num_ch );</p><p><b> right=0;</b></p><p>
111、<b> }</b></p><p><b> }</b></p><p> }//end for</p><p> for (i=0;i<4;i++){</p><p> if(number[1][i]==0){</p><p> printf("
112、;%d沒有用上!\n",number[0][i]);</p><p><b> right=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> return right;</p><p
113、><b> }</b></p><p> int chang(char *s,sqlist *l){//將用戶的輸入轉(zhuǎn)化為單鏈表</p><p><b> int t=0;</b></p><p> unsigned int i=0;</p><p> int bl,ch;</
114、p><p> int a1,a2,a;</p><p> sqlist *p=l;</p><p> for (;i<strlen(s);i++)</p><p><b> {</b></p><p> if(s[i]>47&&s[i]<58&&am
115、p;t==0){</p><p> a1=(int)s[i]-48;</p><p><b> t++;</b></p><p><b> }</b></p><p> else if(s[i]>47&&s[i]<58&&t==1){</p&
116、gt;<p> a2=(int)s[i]-48;</p><p> a=a1*10+a2;</p><p><b> t++;</b></p><p><b> }</b></p><p> else if(s[i]<48&&s[i]>39&
117、;&s[i]!=44&&s[i]!=46){</p><p><b> if(t==1){</b></p><p><b> bl=0;</b></p><p> insert_sq(&p,a1,bl);</p><p><b> t=0;</
118、b></p><p><b> }</b></p><p> else if(t==2){</p><p><b> bl=0;</b></p><p> insert_sq(&p,a,bl);</p><p><b> t=0;</b
119、></p><p><b> }</b></p><p><b> bl=1;</b></p><p> ch=(int)s[i];</p><p> insert_sq(&p,ch,bl);</p><p><b> t=0;</b&
120、gt;</p><p><b> }</b></p><p><b> else {</b></p><p> printf("%c不是有效的運(yùn)算符!\n",s[i]);</p><p><b> }</b></p><p>
121、 } //end for</p><p> i=strlen(s)-1;</p><p> if(s[i]>47&&s[i]<58){</p><p> if(s[i-1]>47&&s[i-1]<58){</p><p><b> bl=0;</b>&
122、lt;/p><p> insert_sq(&p,a,bl);</p><p><b> }</b></p><p><b> else {</b></p><p><b> bl=0;</b></p><p> insert_sq(&
123、;p,a1,bl);</p><p><b> }</b></p><p><b> }</b></p><p><b> bl=1;</b></p><p><b> a=35;</b></p><p> insert_
124、sq(&p,a,bl);</p><p> return (check(*l));</p><p><b> }</b></p><p> int Operate(int a,int theta, int b){//計(jì)算</p><p> switch(theta) {</p><p&
125、gt; case 43: return a+b;</p><p> case 45: return a-b;</p><p> case 42: return a*b;</p><p><b> case 47:</b></p><p><b> {</b></p><
126、p><b> if(b==0){</b></p><p> return -2000;</p><p><b> }</b></p><p> if (a%b==0){</p><p> return a/b;</p><p><b> }<
127、/b></p><p> else {//printf("不能為小數(shù)\n");</p><p> return -10000;</p><p><b> }</b></p><p><b> }</b></p><p> default :
128、 return 0;</p><p><b> }</b></p><p><b> }</b></p><p> int ReturnOpOrd(char op,char* TestOp)// precede()函數(shù)調(diào)用求優(yōu)先級</p><p><b> {</b>&
129、lt;/p><p><b> int i;</b></p><p> for(i=0; i< OPSETSIZE; i++)</p><p><b> {</b></p><p> if (op == TestOp[i]) return i;</p><p><
130、;b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> char precede(char Aop, char Bop)</p><p><b> {</b></p>
131、;<p> return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];</p><p><b> }</b></p><p> int initstack(sqstack *s)</p><p><b> {</b></p>
132、<p> (s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));</p><p> if((s)->base==NULL) exit(-2);</p><p> (s)->top=(s)->base;</p><p> (s)->stacksize = STACK
133、_INIF_SIZE;</p><p> return 1;</p><p><b> }</b></p><p> int gettop(sqstack *s){ //取得棧頂元素</p><p><b> int e;</b></p><p> if(s-&g
134、t;top==s->base){</p><p> printf("???無法取得棧頂元素!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p> e=*(s->top-1);</p>
135、;<p><b> return e;</b></p><p><b> }</b></p><p> int push(sqstack *s,int e){ //壓棧</p><p> if(s->top-s->base>=s->stacksize)</p>
136、<p><b> {</b></p><p> s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));</p><p> if(!s->base) exit(-2);</p><p> s->stacks
137、ize+= STACKINCREMENT;</p><p><b> }</b></p><p> *(s->top++)=e;</p><p><b> return 1;</b></p><p><b> }</b></p><p>
138、 int pop(sqstack *s,int *e){ //出棧</p><p> if(s->top==s->base)</p><p><b> {</b></p><p> printf("???出棧錯(cuò)誤!\n");</p><p><b> return 0;
139、</b></p><p><b> }</b></p><p> *e=*(--s->top);</p><p><b> return 1;</b></p><p><b> }</b></p><p> int Evalu
140、ateExpression(char* MyExpression) { // 算法3.4----計(jì)算表達(dá)式的值</p><p> // 算術(shù)表達(dá)式求值的算符優(yōu)先算法。</p><p> // 設(shè)OPTR和&&OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧</p><p> int result;</p><p> sqstack
141、 OPTR; // 運(yùn)算符棧,字符元素</p><p> sqstack OPND; // 運(yùn)算數(shù)棧,實(shí)數(shù)元素</p><p> int c,bl,a,b,theta,top;</p><p> sqlist *q,l;</p><p> char *s=MyExpression;</p><p&g
142、t; init_sq(&l);</p><p> if(chang(s,&l)!=0){</p><p><b> q=&l;</b></p><p> initstack(&OPTR);</p><p> push(&OPTR, 35);</p><
143、p> initstack (&OPND);</p><p> q=q->next;</p><p> c=q->num_ch;</p><p> bl=q->bol;</p><p> while ((c!= 35 || gettop(&OPTR)!=35)){</p><
144、p> if (bl!=1){</p><p> push(&OPND, c);</p><p> q=q->next;</p><p> c=q->num_ch;</p><p> bl=q->bol;</p><p> } // 不是運(yùn)算符則進(jìn)棧</p>&l
145、t;p><b> else{</b></p><p> top=gettop(&OPTR);</p><p> switch (precede((char)top, (char)c)){</p><p> case '<': // 棧頂元素優(yōu)先權(quán)低</p><p> push
146、(&OPTR, c);</p><p> q=q->next;</p><p> c=q->num_ch;</p><p> bl=q->bol;</p><p><b> break;</b></p><p> case '=': // 脫
147、括號并接收下一字符</p><p> pop(&OPTR, &c);</p><p> q=q->next;</p><p> c=q->num_ch;</p><p> bl=q->bol;</p><p><b> break;</b></p&
148、gt;<p> case '>': // 退棧并將運(yùn)算結(jié)果入棧</p><p> pop(&OPTR, &theta);</p><p> pop(&OPND, &b);</p><p> pop(&OPND, &a);</p><p> pus
149、h(&OPND, Operate(a, theta, b));</p><p><b> break;</b></p><p><b> default :</b></p><p> printf("沒有這個(gè)運(yùn)算符!\n");</p><p><b>
150、return 0;</b></p><p> } // switch</p><p><b> }//else</b></p><p> } // while</p><p> result=gettop(&OPND);</p><p> return result;
151、</p><p><b> }</b></p><p><b> else {</b></p><p> printf("你的輸入有錯(cuò)誤!\n");</p><p><b> return 0;</b></p><p><
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空客運(yùn)訂票系統(tǒng)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)源代碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(含代碼)
- 迷宮游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)——紙牌游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--紙牌游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-紙牌游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)“紙牌游戲”
- 大話數(shù)據(jù)結(jié)構(gòu)源代碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-紙牌游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---走迷宮游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---走迷宮游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---走迷宮游戲
- 運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(含源代碼)
- 圖書管理系統(tǒng)(含源代碼)c語言_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)迷宮求解(代碼參數(shù))課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--漢諾塔游戲
- 黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 【c語言數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)】庫存管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(含源代碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--flash 迷宮小游戲
評論
0/150
提交評論