版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計</p><p> 課程設計名稱: 數(shù)據(jù)結(jié)構(gòu)課程設計 </p><p> 專 業(yè) 班 級 : </p><p> 學 生 姓 名 : </p><p> 學 號 :
2、 </p><p> 指 導 教 師 : </p><p> 課程設計時間: </p><p> 計算機科學與技術專業(yè)課程設計任務書</p><p><b> 1.需求分析</b></
3、p><p> 24點游戲主要有兩個功能:</p><p> (1)用戶記算24點</p><p> 程序隨機產(chǎn)生四個1-13的數(shù),分別代表4張牌, 提示用戶輸入算式。如果用戶認為程序給出的一組數(shù)字不能算出24點(如1,1,2,2),則輸入‘?’,然后程序?qū)λ膫€數(shù)字進行計算,如果真的不能算出24點,則輸出用戶正確的信息,否則給出一個正確的算式,并顯示用戶錯誤的信息。
4、</p><p> (2).程序計算24點</p><p> 用戶輸入四個1-13的數(shù),代表4張牌,程序需要通過一定的規(guī)則添加括號和運算符來使算式的值等于24,如果用戶給出的四個數(shù)字不能算出24點,則輸出錯誤信息!</p><p><b> 2.概要設計</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)生四個隨機數(shù)</p><p> EvaluateExpression(char* MyExpression) </p><p> //課本算法3.4---計算表達式的值</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ù)字是給出的四個數(shù)字</p><p&g
8、t; Operate(int a,int theta, int b) //計算</p><p> precede(char Aop, char Bop) //求運算符優(yōu)先級</p><p> ReturnOpOrd(char op,char* TestOp) //返回運算符優(yōu)先級</p><p> CalcOneExpress(int expressi
9、on[][2])</p><p> //課本算法3.4--計算表達式的值</p><p> Calc24(int number[2][4])</p><p> //包含下面五個函數(shù),即表達式的五種形式</p><p> CalcArray1(int iNumInput[2][4])</p><p> // a
10、 * b * c * d //7 個字符</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 運行環(huán)境</b></p><p><b> 硬件環(huán)境:PC機</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 詳細設計</b></p>
15、<p> (1)全局變量和棧,鏈表的定義</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)先關系:</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時,num-ch是數(shù)字;bol是1時num_ch是運算符</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)由程序計算24點的算法分析:</p><p> 用戶輸入四個1-13的數(shù),代表4張牌,程序算24點。這要考慮到各種情況。首先是
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 種情況加入運算符。</p><p> 對于每種不同的算式形式,先在固定的位置加入括號。程序通過4層循環(huán)對四個數(shù)字進行賦值,并對循環(huán)加以控制,使每個數(shù)字只用一次,
27、然后再通過三層循環(huán)對三個位置的運算符賦值。每一次循環(huán)都會產(chǎn)生一個數(shù)組,別調(diào)用下面的CalcOneExpress函數(shù)求算式的值!結(jié)果可能算出24點,或者算不出24點 (如圖2,圖3)。</p><p> 以下兩段代碼是對針對第一種形式的算式求24點。過程為:對四個數(shù)字和三個運算符賦值(CalcArray1(int iNumInput[2][4]))----計算算式的值(CalcOneExpress(int exp
28、ression[][2]))---驗證是否等于24---輸出結(jié)果:</p><p><b> 代碼1. </b></p><p> // a * b * c * d7 個字符</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、對每一個算式求值,直到算出24點</p><p> if(Equal24(dRes))</p><p> //判定表達式的值是否為24</p><p><b> {</b></p><p> printf("可以這樣運算:%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---計算 算式的值</p><p> in
41、t CalcOneExpress(int expression[][2])</p><p><b> {</b></p><p> // 算術表達式求值的算符優(yōu)先算法。</p><p> // 設OPTR和&&OPND分別為運算符棧和運算數(shù)棧,OP為運算符集合。</p><p> int inde
42、x=0,result,c,theta,a,b;</p><p> sqstack OPTR; // 運算符棧,字符元素</p><p> sqstack OPND; // 運算數(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、 } // 不是運算符則進棧</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 '>': // 退棧并將運算結(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("沒有這個運算符\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> (4)由用戶計算24點的算法分析:</p><p> 先由程序產(chǎn)生4個隨機數(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> 如果用戶認為程序產(chǎn)生的四個隨機數(shù)不能算出24點則輸入‘?’,程序接收到該字符后,則進行步驟(3)的操作,如果真的不能算出24點,則輸出用戶正確的信息,否者輸出用戶錯誤的信
55、息,并輸出一個正確的算式。(請看圖4,圖5,圖6)</p><p> 如果用戶認為可以算出24點,則輸入算式,程序?qū)Υ怂闶角笾?,若結(jié)果為24,程序輸出用戶正確的信息,否則輸出用戶錯誤的信息。</p><p> 此過程中,程序先將用戶輸入的算式轉(zhuǎn)化成單鏈表的形式,其功能和步驟(2)中的數(shù)組是基本一樣的。然后檢驗用戶輸入的算式中是否有非法字符,若有這輸出錯誤信息并結(jié)束;若沒有則計算算式的值
56、,驗證是否等于24,并輸出正確或錯誤的信息!</p><p><b> 部分重要代碼:</b></p><p><b> 代碼1.</b></p><p> 算法 3.4 計算表達式的值:</p><p> EvaluateExpression(char* MyExpression) <
57、;/p><p><b> {</b></p><p> // 算術表達式求值的算符優(yōu)先算法。</p><p> // 設OPTR和&&OPND分別為運算符棧和運算數(shù)棧</p><p> int result;</p><p> sqstack OPTR; // 運算符
58、棧,字符元素</p><p> sqstack OPND; // 運算數(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)//將表達式轉(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> } // 不是運算符則進棧</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 '>': // 退棧并將運算結(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("沒有這個運算符!\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("你的輸入有錯誤!\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不是有效的運算符!\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、個問題之前一定要把算法想清楚,考慮到全局,以免造成大量不必要的改動。</p><p> 2.用scanf輸入數(shù)據(jù)時,一定要注意格式,否則就會出錯!</p><p> 3.在函數(shù)調(diào)用時,參數(shù)類型一定要一致,否者會產(chǎn)生警告信息,甚至導致結(jié)果出錯。</p><p> 4.如果不使用time函數(shù),則產(chǎn)生的隨機數(shù)是重復出現(xiàn)的。</p><p>
85、 5.用戶輸入的算式,也可以轉(zhuǎn)化為數(shù)組進行操作,但算式的形式不確定,轉(zhuǎn)化為鏈表似乎省去了很多麻煩。</p><p> 6.剛開始沒有對CalcArray(int iNumInput[2][4])函數(shù)中的循環(huán)加以控制,結(jié)果造成數(shù)字重復使用。</p><p> 7.在單鏈表形成之后,在其中取數(shù)據(jù)元素,要從q->next開始,其頭結(jié)點中不含要用的數(shù)據(jù),應跳過,否則結(jié)果不可預料。<
86、/p><p> 8.如果想通過調(diào)用函數(shù)來改變幾個變量的值,那么用指針應該是很方便的。</p><p> 9.要改變指針值,需要使用二級指針</p><p> 10.由于在C語言中函數(shù)都是全局作用域的,因此不要使用和庫中的函數(shù)名相同的標識符,否則會出現(xiàn)錯誤。包括宏標識符也有這樣的問題。</p><p><b> 7.測試結(jié)果圖&l
87、t;/b></p><p><b> (1)用戶界面</b></p><p><b> 圖1</b></p><p> ?。?)用戶輸入數(shù)據(jù),程序算出結(jié)果</p><p><b> 圖2</b></p><p> ?。?)用戶輸入的數(shù)據(jù)算不出
88、24點</p><p><b> 圖3</b></p><p> ?。?)程序給出數(shù)字,用戶認為算不出24點</p><p><b> 圖4</b></p><p><b> ?。?)用戶計算出錯</b></p><p><b> 圖5&
89、lt;/b></p><p> ?。?)程序給出數(shù)字,用戶算出正確結(jié)果</p><p><b> 圖6</b></p><p><b> 8.參考文獻</b></p><p> 1 張鳳琴,張青鳳.數(shù)據(jù)結(jié)構(gòu)學習指導與習題詳解,清華大學出版社,2007</p><p&g
90、t; 2 嚴蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版). 清華大學出版社,2008</p><p> 3 潭浩強.C語言程序設計(第三版). 清華大學出版社,2005</p><p> 4 潭浩強.C語言程序設計題解與上機指導(第三版). 清華大學出版社,2005</p><p> 5張 曼,朱小谷,呂士俊.數(shù)據(jù)結(jié)構(gòu)習題與解答 . 北京希望電子出版社.2005<
91、;/p><p><b> 課程設計總結(jié)</b></p><p> 源代碼:(此為可運行的源代碼直接復制粘貼過來的,如直接復制不能運行,可粘貼到文本中進行字符過濾,然后自粘貼到編譯器中)</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 時,num-ch是一個數(shù)字;bol 是 1 時 num_ch 運算符</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)先關系</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ù)字是給出的四個數(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不是有效的運算符!\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 不在給出的四個數(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不是有效的運算符!\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){//計算</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("???出棧錯誤!\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----計算表達式的值</p><p> // 算術表達式求值的算符優(yōu)先算法。</p><p> // 設OPTR和&&OPND分別為運算符棧和運算數(shù)棧</p><p> int result;</p><p> sqstack
141、 OPTR; // 運算符棧,字符元素</p><p> sqstack OPND; // 運算數(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> } // 不是運算符則進棧</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 '>': // 退棧并將運算結(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("沒有這個運算符!\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("你的輸入有錯誤!\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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空客運訂票系統(tǒng)數(shù)據(jù)結(jié)構(gòu)課程設計源代碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計(含代碼)
- 迷宮游戲數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計——紙牌游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設計--紙牌游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設計-紙牌游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設計“紙牌游戲”
- 大話數(shù)據(jù)結(jié)構(gòu)源代碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計報告-紙牌游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設計---走迷宮游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設計---走迷宮游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設計---走迷宮游戲
- 運動會分數(shù)統(tǒng)計數(shù)據(jù)結(jié)構(gòu)課程設計(含源代碼)
- 圖書管理系統(tǒng)(含源代碼)c語言_數(shù)據(jù)結(jié)構(gòu)課程設計報告
- 數(shù)據(jù)結(jié)構(gòu)迷宮求解(代碼參數(shù))課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計--數(shù)據(jù)結(jié)構(gòu)課程設計----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計--漢諾塔游戲
- 黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設計
- 【c語言數(shù)據(jù)結(jié)構(gòu)課程設計】庫存管理系統(tǒng)的設計與實現(xiàn)(含源代碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設計--flash 迷宮小游戲
評論
0/150
提交評論