版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù) 據(jù) 結(jié) 構(gòu)</b></p><p><b> 課程設(shè)計報告</b></p><p> 設(shè)計題目: 算術(shù)表達(dá)式的計算 </p><p> 院 系: 經(jīng)濟(jì)管理學(xué)院 </p><p> 專業(yè)班級: 電子商務(wù)
2、 </p><p> 學(xué)生姓名: </p><p> 指導(dǎo)教師: </p><p><b> 2013年7月5日</b></p><p><b> 目 錄</b></p><p
3、><b> 1.設(shè)計內(nèi)容1</b></p><p><b> 1.1問題描述1</b></p><p><b> 1.2設(shè)計要求1</b></p><p><b> 1.3開發(fā)環(huán)境1</b></p><p><b> 1.
4、4研究思路1</b></p><p><b> 2.設(shè)計步驟3</b></p><p><b> 2.1需求分析3</b></p><p><b> 2.2概要設(shè)計5</b></p><p><b> 2.3詳細(xì)設(shè)計7</b>
5、</p><p> 2.4調(diào)試分析15</p><p> 2.5測試結(jié)果18</p><p> 3.設(shè)計成果展示23</p><p> 3.1用戶手冊23</p><p> 3.2程序運(yùn)行部分截圖23</p><p> 4.總結(jié)與心得體會26</p><
6、;p><b> 附 錄29</b></p><p><b> 1.設(shè)計內(nèi)容</b></p><p><b> 1.1問題描述</b></p><p> 利用棧來實(shí)現(xiàn)當(dāng)用戶輸入一個合法的算術(shù)表達(dá)式后,能夠返回正確的結(jié)果。能夠計算的運(yùn)算符包括:加、減、乘、除、括號;能夠計算的操作數(shù)要求在
7、實(shí)數(shù)范圍內(nèi);對于異常表達(dá)式能給出錯誤提示。</p><p><b> 1.2設(shè)計要求</b></p><p> ?。?)從鍵盤輸入一個表達(dá)式,如(23-(4×5.2-2.8))/5#</p><p> ?。?)支持運(yùn)算符的優(yōu)先級;</p><p> ?。?)支持括號的嵌套;</p><p&
8、gt; ?。?)支持小數(shù)點(diǎn)及負(fù)數(shù);</p><p> ?。?)有查錯功能,如非法字符,小數(shù)點(diǎn)過多(如3.44.3),括號不匹配等錯誤;</p><p> ?。?)必須利用棧來實(shí)現(xiàn)算術(shù)表達(dá)式的計算。</p><p><b> 1.3開發(fā)環(huán)境</b></p><p> Visual C++ 6.0</p>
9、<p><b> 1.4研究思路</b></p><p><b> 基本設(shè)計思想:</b></p><p> 為了實(shí)現(xiàn)算符優(yōu)先算法。可以使用兩個工作棧。一個稱為OPTR,用以寄存運(yùn)算符,另一個稱做OPND,用以寄存操作數(shù)或運(yùn)算結(jié)果。</p><p> 1.首先置操作數(shù)棧為空棧,表達(dá)式起始符”#”為運(yùn)算符棧
10、的棧底元素;</p><p> 2.依次讀入表達(dá)式,若是操作數(shù)即進(jìn)OPND棧,若是運(yùn)算符則和OPTR棧的棧頂運(yùn)算符比較優(yōu)先權(quán)后作相應(yīng)的操作,直至整個表達(dá)式求值完畢(即OPTR棧的棧頂元素和當(dāng)前讀入的字符均為”#”)。</p><p><b> 2.設(shè)計步驟</b></p><p><b> 2.1需求分析</b>&l
11、t;/p><p> 利用棧來實(shí)現(xiàn)當(dāng)用戶輸入一個合法的算術(shù)表達(dá)式后,能夠返回正確的結(jié)果。能夠計算的運(yùn)算符包括:加、減、乘、除、括號;能夠計算的操作數(shù)要求在實(shí)數(shù)范圍內(nèi);對于異常表達(dá)式能給出錯誤提示。</p><p> ?。?)輸入的形式為由數(shù)據(jù)(實(shí)數(shù)范圍內(nèi))和運(yùn)算符包括+,—,*,/,( ),構(gòu)成的算術(shù)表達(dá)式,輸出結(jié)束時以#作為標(biāo)志。</p><p> 由于本算法主要是
12、返回算術(shù)表達(dá)式的結(jié)果,故符合要求的算術(shù)表達(dá)式輸出的應(yīng)該是一個實(shí)數(shù)。</p><p> ?。?)當(dāng)用戶進(jìn)入操作頁面之后輸出:請輸入一個算術(shù)表達(dá)式(以#符結(jié)束);</p><p> 當(dāng)輸入的算術(shù)表達(dá)式不符合要求時輸出:輸入的表達(dá)式有誤,請重新輸入;</p><p> 例如:輸入一個不合法的表達(dá)式:wrong*8+6/1</p><p> 當(dāng)
13、輸入的表達(dá)式正確無誤時輸出一個實(shí)數(shù)(此實(shí)數(shù)即為算數(shù)表達(dá)式的結(jié)果),并出現(xiàn)提示語句:請選擇是否繼續(xù)計算(y/n)(選擇之后的操作,退出或者繼續(xù)輸入新的算術(shù)表達(dá)式進(jìn)行下面的運(yùn)算);</p><p> 例如:輸入一個合法的表達(dá)式:(56*(9+16)/2)+8#</p><p> 當(dāng)被除數(shù)為0的時候,輸出:被除數(shù)為0,不合法;</p><p> 例如:(65+65)
14、/0#</p><p> ?。?)本程序可以實(shí)現(xiàn)對于由符合要求的數(shù)據(jù)以及運(yùn)算符構(gòu)成的算術(shù)表達(dá)式的簡單運(yùn)算,并且在輸入超出實(shí)數(shù)范圍內(nèi)的不符合要求的數(shù)據(jù)和運(yùn)算符時出錯誤提示。</p><p> (4)測試數(shù)據(jù)(截圖):例子:(6+(36+5)/5)+1.2#</p><p><b> 2.2概要設(shè)計</b></p><p&g
15、t; 主程序中函數(shù)StStack是定義關(guān)于數(shù)值的棧,用來存儲表達(dá)式的相關(guān)數(shù)值,StStack_c是定義關(guān)于字符的棧,用來存儲表達(dá)式中的字符。</p><p> 定義的抽象數(shù)據(jù)類型有:</p><p> typedef struct /*定義一個結(jié)構(gòu)體類型*/</p><p> typedef struct StStack</p>
16、<p><b> {</b></p><p> float *base; /*在棧構(gòu)造之前和銷毀之后,base的值為0*/</p><p> float *top; /*棧頂指針*/</p><p> int size; /*當(dāng)前已分配的存儲空間,以元素為單位*/<
17、;/p><p> } StStack;</p><p> typedef struct StStack_c</p><p><b> {</b></p><p> char *base;</p><p> char *top;</p><p><b>
18、 int size;</b></p><p> } StStack_c;</p><p><b> 還需要如下函數(shù):</b></p><p><b> 2.3詳細(xì)設(shè)計 </b></p><p><b> 1.程序流程圖</b></p>&
19、lt;p><b> N</b></p><p><b> N</b></p><p><b> N</b></p><p> 2.函數(shù)的調(diào)用關(guān)系圖</p><p><b> main</b></p><p> 3.
20、在上述流程圖中用到的主要子程序的偽碼算法如下:</p><p> (1) 核心函數(shù)Operating,/*用以實(shí)現(xiàn)表達(dá)式的運(yùn)算過程*/</p><p> Operating(char *c,StStack *OPND,StStack_c *OPTR)</p><p><b> {char ch;</b></p><p&
21、gt; int k=0,i=0;</p><p> float a,b,e;</p><p> if(c[0]=='-'&&(!In_c(c[1]))) /*判斷首數(shù)是負(fù)數(shù)則進(jìn)棧*/</p><p> {k=changeN(OPND,&c[1]);</p><p> i+=k+1;
22、 /*首數(shù)是負(fù)數(shù)保存其位數(shù)*/</p><p> Pop(OPND,&e);</p><p> e=-1*e; /*保存負(fù)數(shù)*/</p><p> Push(OPND,e);</p><p><b> }</b><
23、/p><p><b> do{</b></p><p> if(!In_c(c[i])) /*不是運(yùn)算符則轉(zhuǎn)換為數(shù)值并進(jìn)棧*/</p><p> {k=changeN(OPND,&c[i]);</p><p> i+=k-1; /*
24、下一個字符在串中的下標(biāo)*/</p><p><b> }</b></p><p><b> else</b></p><p> {if(k=DealNeg(OPND,&c[i])) i+=k; /*判斷是負(fù)數(shù)則進(jìn)棧*/</p><p><b> else<
25、/b></p><p> {switch(Precede(GetTop_c(OPTR),c[i])){</p><p> case '<': Push_c(OPTR,c[i]); /*棧頂元素優(yōu)先權(quán)低*/</p><p><b> break;</b></p><p>
26、; case '=': Pop_c(OPTR,&ch); /*脫括號并接收下一字符*/</p><p><b> break;</b></p><p> case '>': Pop_c(OPTR,&ch); /*退棧并將輸出結(jié)果入棧*/</p><p
27、> Pop(OPND,&b);</p><p> Pop(OPND,&a);</p><p> e=operate(a,ch,b); /*將運(yùn)算結(jié)果存入e中*/</p><p> if(GetTop_c(OPTR)=='-') /*若結(jié)果前為'-'則取其相反數(shù)*/<
28、;/p><p> {Pop_c(OPTR,&ch);</p><p> Push_c(OPTR,'+');</p><p><b> e=-1*e;</b></p><p><b> }</b></p><p> Push(OPND,e);<
29、;/p><p> if(c[i]!='#'&&c[i]!=')') /*當(dāng)前符號不是'#'則入棧*/</p><p> Push_c(OPTR,c[i]);</p><p><b> else i--;</b></p><p> }
30、/*switch()*/</p><p> }/*if-else-1*/</p><p> }/*if-else-2*/</p><p><b> i++;</b></p><p> }while(GetTop_c(OPTR)!='#'||c[i]!='#'); /*
31、判斷表達(dá)式是否結(jié)束*/</p><p><b> }</b></p><p> (2) Precede函數(shù): /*用來判斷運(yùn)算符的優(yōu)先級 */</p><p><b> 核心代碼如下:</b></p><p> switch(x){</p><p> case &
32、#39;+': if(y=='*'||y=='/'||y=='(') return '<';else return '>';</p><p> case '-': if(y=='*'||y=='/'||y=='(') return '<
33、';else return '>';</p><p> case '*': if(y=='(') return '<'; else return '>';</p><p> case '/': if(y=='(') return '<
34、;'; else return '>';</p><p> case '(': if(y==')') return '='; else return '<';</p><p> case ')': if(y!='(') return '&g
35、t;';</p><p> case '#': if(y=='#') return '='; else if(y!=')') return '<';</p><p><b> }</b></p><p> (3)operate函數(shù):/*用來實(shí)習(xí)
36、基本運(yùn)算 */</p><p> 注意:當(dāng)除數(shù)為零時,作為特殊情況處理。例如:</p><p> operate(float x,char c,float y){</p><p> /*基本運(yùn)算的實(shí)現(xiàn)*/</p><p> switch(c){</p><p> case '+': retur
37、n x+y;</p><p> case '-': return x-y;</p><p> case '*': return x*y;</p><p> case '/': if(y!=0) return x/y; /*被除數(shù)不為0*/</p><p><b> else
38、</b></p><p> {printf("\n被除數(shù)為0,不合法!\n");</p><p><b> exit(1);}</b></p><p> ?。?)check_ch函數(shù): /*用來判斷輸入是否符合表達(dá)式的要求*/</p><p><b> 代碼如下
39、:</b></p><p> check_ch(char *ch){</p><p> while(*ch!='#')</p><p> {if(*ch=='.'||*ch>='0'&&*ch<='9'||In_c(*ch)) /*表達(dá)式的限制條件*/&
40、lt;/p><p> {if(*ch>='0'&&*ch<='9') {ch++;continue;}</p><p> if(*ch=='.') /*小數(shù)點(diǎn)前后不是數(shù)字的處理*/</p><p> {if(In_c(*(++ch))) re
41、turn FALSE;</p><p> else ch--;</p><p> if(In_c(*(--ch))) return FALSE;</p><p> else ch++;</p><p><b> }/*if-2*/</b></p><p><b> else&
42、lt;/b></p><p> {if(In_c(*(++ch))&&In_c(*(--ch))) /*相鄰的兩運(yùn)算符的處理*/</p><p> {if(*(++ch)=='(') continue; /*在'('前的運(yùn)算符情況處理*/</p><p> else
43、ch--;</p><p> if(*(++ch)=='-'&&*(--ch)=='(') {ch++; continue;} /*()內(nèi)第一位數(shù)為負(fù)的運(yùn)算符處理*/</p><p> else ch--;</p><p> if(*(++ch)!='#'&&*(--ch)==
44、')') {ch++; continue;} /*在')'后的運(yùn)算符情況處理*/ </p><p> else if(*ch--!='#') return FALSE;</p><p><b> }/*if-3*/</b></p><p> else ch--;</p>&
45、lt;p> }/*if-else2*/</p><p><b> ch++;</b></p><p><b> }/*if-1*/</b></p><p> else return FALSE;</p><p> }/*while*/</p><p> if
46、(*ch=='#') return TRUE; }</p><p> (5)changeN函數(shù) /*負(fù)責(zé)將字符轉(zhuǎn)換為數(shù)值*/</p><p><b> 實(shí)現(xiàn)代碼如下:</b></p><p> changeN(StStack *S,char *ch){</p><p> int j,h,k=0;
47、</p><p> float m,n=0;</p><p><b> char c;</b></p><p> while(*ch>='0'&&*ch<='9'||*ch=='.')</p><p> {n=n*10+(*ch-48);
48、 /*將字符轉(zhuǎn)換為數(shù)值存入n中*/</p><p> k++; /*k記錄數(shù)值的位數(shù)*/</p><p><b> ch++;</b></p><p> if(*ch=='.') /*若有小數(shù),將n,k存入m,h,并初始化方便小數(shù)的轉(zhuǎn)換*/</
49、p><p><b> {m=n;n=0;</b></p><p><b> h=k;k=0;</b></p><p> c=*ch;ch++; /*將'.'存入c,對下一個字符進(jìn)行操作*/</p><p><b> }</b></p><
50、;p> if(c=='.'&&In_c(*ch)==TRUE) /*對小數(shù)部分的處理*/</p><p> {for(j=0;j<k;j++)</p><p><b> n=n/10;</b></p><p><b> n+=m;</b></p>&
51、lt;p><b> k=++k+h;</b></p><p><b> }</b></p><p> }/*while*/</p><p> Push(S,n); /*將轉(zhuǎn)換好的數(shù)值入棧*/</p><p> return k;
52、 /*返回數(shù)值的位數(shù)*/ }</p><p> ?。?)函數(shù) DealNeg /*對括號內(nèi)負(fù)數(shù)的處理*/ </p><p> DealNeg(StStack *S,char *ch){</p><p> int k=0,i=0;</p><p> float e,n=0;&l
53、t;/p><p> if(*(--ch)=='('&&*(++ch)=='-') /*判斷字符是否是“-”*/</p><p> {k=changeN(S,++ch);</p><p> Pop(S,&e);</p><p><b> n=-1*e;</b&
54、gt;</p><p> Push(S,n);</p><p> return k; }</p><p> else return FALSE } </p><p> ?。?)main 函數(shù):首先初始化棧,讓后用scanf接收一個字符串,然后進(jìn)行字符串的轉(zhuǎn)化以及相關(guān)的運(yùn)算。</p><p> int main(
55、)</p><p> {char str[40],*c,ch;</p><p> float i=0,n,f;</p><p><b> FILE *fp;</b></p><p> StStack s1,*OPND; /*定義關(guān)于數(shù)值的棧*/</p><p&g
56、t; StStack_c s2,*OPTR; /*定義關(guān)于字符的棧*/</p><p><b> OPND=&s1;</b></p><p><b> OPTR=&s2;</b></p><p><b> c=str;</b></p>
57、<p><b> do{</b></p><p> InitStack_c(OPTR);</p><p> Push_c(OPTR,'#');</p><p> InitStack(OPND);</p><p><b> do{</b></p>&l
58、t;p> printf("\n請輸入一個算術(shù)表達(dá)式(以#符結(jié)束):\n ");</p><p> scanf("%s",c);getchar();</p><p> if(check_ch(c)) f=1;</p><p><b> else</b></p><p>
59、 {printf("\nWarning: 輸入的表達(dá)式有誤,請重新輸入!!\n");</p><p><b> f=0;</b></p><p><b> }</b></p><p> }while(f!=1); /*表達(dá)式若不符合要求則重新輸入*/</p><
60、;p> Operating(c,OPND,OPTR);</p><p> n=GetTop(OPND);</p><p> printf("\n算術(shù)表達(dá)式的結(jié)果為: %.2f.\n",n);</p><p> printf("\n請選擇是否繼續(xù)計算(y/n): ");</p><p>
61、 ch=getchar(); getchar();</p><p> }while(ch=='y'||ch=='Y'); } </p><p><b> 2.4調(diào)試分析</b></p><p> ?。?)在我們找到的程序里存在比較多的問題,開始的時候程序錯誤很多,而且不能生成exe運(yùn)行文
62、件,如下圖所示:</p><p> 經(jīng)過大量的調(diào)試、以及修正主要存在以下問題:</p><p> 程序中存在未使用的定義變量。</p><p> 有些變量沒有定義就直接使用,甚至是混用。</p><p> 程序格式不規(guī)范,可閱讀行不高。</p><p> 缺少一些關(guān)鍵字符,如分號,大括號,如圖所示:</
63、p><p> 經(jīng)過一段時間的調(diào)試程序終于能夠運(yùn)行,如圖所示:</p><p> 經(jīng)過一段時間的調(diào)試程序終于能夠運(yùn)行,如圖所示:</p><p> 但經(jīng)過一次又一次的測試發(fā)現(xiàn)程序中對除法的處理不夠完整,而且當(dāng)除數(shù)為零的時候計算結(jié)果錯誤,調(diào)試結(jié)果如下所示:</p><p> 經(jīng)過分析可知,代碼中缺少對除數(shù)為零的控制編碼,代碼未修改以前,如圖所
64、示:</p><p> 對其進(jìn)行調(diào)整修改,得到如下代碼:</p><p> 經(jīng)過調(diào)試之后程序運(yùn)行正常:</p><p> 程序正常之后,發(fā)現(xiàn)另外一個問題,程序中存在fopen文件創(chuàng)建函數(shù),每次文件運(yùn)行之后都會生成一個date.exe文本文件,代碼如下:</p><p> 刪除之后文件運(yùn)行正常,詳細(xì)代碼見附錄。</p>&
65、lt;p> 經(jīng)驗(yàn)體會:在對程序的不斷完善與分析之中,我們發(fā)現(xiàn)了比較多的問題,并且在解決的時候也查找了很多的資料,咨詢了很多的前輩,最終在不懈努力之下終于找出了程序中存在的不足并加以改正,我們在函數(shù)調(diào)用以及數(shù)據(jù)類型轉(zhuǎn)換方面欠缺的較多,經(jīng)過這次對于程序的修改,我們了解到了在細(xì)微之處的一個小改變往往就能把原來的死程序救活。</p><p><b> 2.5測試結(jié)果</b></p&g
66、t;<p> ?。?)運(yùn)行程序后出現(xiàn):</p><p> ?。?)輸入符合要求的算術(shù)表達(dá)式:123*(23.4-34/17)+12#</p><p><b> 得到以下結(jié)果:</b></p><p> ?。?)輸入不符合要求的算術(shù)表達(dá)式:123%3*(54-2/3.54+23)#</p><p><
67、b> 得到以下結(jié)果:</b></p><p> ?。?)輸入除數(shù)為0的算術(shù)表達(dá)式:9/0+2.45*3#</p><p><b> 得到以下結(jié)果:</b></p><p> (5)輸入含有兩個括號的算術(shù)表達(dá)式:12+(7.8+8+(8*7))#</p><p><b> 結(jié)果如下:&l
68、t;/b></p><p> (6)輸入實(shí)數(shù)范圍外的數(shù)據(jù):12*a-12+4/2#</p><p><b> 得到以下結(jié)果:</b></p><p> ?。?)輸入含有負(fù)數(shù)的算術(shù)表達(dá)式:((-9)+8*7)+8.5#</p><p><b> 得到如下結(jié)果:</b></p>
69、<p><b> 3.設(shè)計成果展示</b></p><p><b> 3.1用戶手冊</b></p><p> ?。?)用戶需在 Visual C++ 6.0的環(huán)境下,雙擊exe程序以打開運(yùn)行。</p><p> (2)程序運(yùn)行后,用戶在系統(tǒng)提示下輸入需要計算的算術(shù)表達(dá)式并以#作為結(jié)束標(biāo)志,如果輸入的數(shù)據(jù)
70、超出實(shí)數(shù)范圍,系統(tǒng)會給予提示,如果輸入的運(yùn)算符不在+,—,*,/,( )之內(nèi),則給予提示,如若輸入算術(shù)表達(dá)式為0,則系統(tǒng)給予提示,提醒用戶重新輸入。</p><p> ?。?)用戶輸入符合要求的算數(shù)表達(dá)式并得到正確的結(jié)果之后,會出現(xiàn)提示語句,用戶根據(jù)提示選擇退出程序或者繼續(xù)進(jìn)行運(yùn)算。</p><p> 3.2程序運(yùn)行部分截圖</p><p><b>
71、4.總結(jié)與心得體會</b></p><p> 本次課程設(shè)計是完成算數(shù)表達(dá)式計算的求值,表達(dá)式的求值是程序設(shè)計語言編譯中的一個最基本的問題,它的實(shí)現(xiàn)是棧的應(yīng)用的一個典型的例子,包含了加、減、乘、除等基本符號的運(yùn)算。</p><p> 課程設(shè)計是把我們所學(xué)的理論知識進(jìn)行系統(tǒng)的總結(jié)并應(yīng)用于實(shí)踐的良好機(jī)會,有利于加強(qiáng)我們用知識理論來分析問題的能力,進(jìn)而加強(qiáng)我們隊(duì)對于知識的實(shí)踐度。并
72、為走向社會打下一個良好的基礎(chǔ)。</p><p> 在這次課程設(shè)計中我們也遇到很多問題和麻煩,得到了其他同學(xué)的幫助和指導(dǎo),才能夠使得這次課程設(shè)計順利的進(jìn)行下去并順利完成。</p><p><b> ——共同感想</b></p><p> 兩個星期的課程設(shè)計結(jié)束了,在我看來,這次課程設(shè)計過程中,我對于c語言有了更深的理解,充分認(rèn)識到學(xué)好c語言
73、的作用,如果以后要在程序設(shè)計方面有所發(fā)展,c語言是絕對的基礎(chǔ),只有打好了基礎(chǔ),以后才能走的更遠(yuǎn)。</p><p> 我們的題目是算數(shù)表達(dá)式的計算,是數(shù)據(jù)結(jié)構(gòu)棧的運(yùn)算中比較經(jīng)典的一個問題,所以在前期我們無論是在網(wǎng)絡(luò)論壇上還是在圖書館里都找到了不少的資料,雖然沒有具體的程序,但都有一定的思路。期間,除去課本上已經(jīng)學(xué)過的知識以外,還有好多是我們沒有學(xué)過的。所以需要我們一點(diǎn)一點(diǎn)的去查資料,問別人,把程序一句一句的讀明白
74、。完成以后,我們對于棧的運(yùn)用有了更加深入了了解,對于一個程序軟件的開發(fā)過程也有了一定的了解,總體來說,還是收獲很多的。</p><p> 可能我們現(xiàn)在還沒有能力把一個程序完完整整的一點(diǎn)點(diǎn)讀出來,但經(jīng)過這次的課程設(shè)計,相信我們每個人的能力都有了不同程度的提高,對于編程有了一個新的認(rèn)識,不再是局限于改錯,而是在保證程序正確運(yùn)行的基礎(chǔ)上,站在用戶的角度去考慮,盡量把程序優(yōu)化好</p><p>
75、<b> ——xxx</b></p><p> 經(jīng)過兩個星期的共同努力,我們組終于在規(guī)定的時間把程序做好改好了。這其中的艱辛和快樂也只有我們自己知道,當(dāng)然收獲也是不言而喻的。明白僅僅掌握課本上的知識是遠(yuǎn)遠(yuǎn)不能夠很好的應(yīng)用到實(shí)際的編程中去的。在這個過程中還需要我們更多的去考慮到實(shí)際條件的種種限制和約束。</p><p> 由于我自身編程能力不是特別好,所以在我們組
76、里,我主要負(fù)責(zé)查資料、整理報告以及檢查程序的錯誤。</p><p> 最初,我們拿到這個題目的時候,覺得比起其他組,我們的程序并不是特別麻煩,但還是沒什么頭緒,不知道從哪開始。所以決定大家先一起搜集資料,然后把自己了解到的告訴其他兩個人,做一下信息的匯總。</p><p> 我們所編寫的這個程序以C語言的棧的相關(guān)知識為基礎(chǔ),通過控制兩個棧(運(yùn)算數(shù)棧和運(yùn)算符棧)的進(jìn)出的棧操作,來實(shí)現(xiàn)對包
77、含加、減、乘、除、括號運(yùn)算符的運(yùn)用,并作出相應(yīng)的運(yùn)算。</p><p> 總之,經(jīng)過本次專業(yè)課程設(shè)計,讓我了解了開發(fā)應(yīng)用軟件的基本流程,運(yùn)用所學(xué)編程技能的基本技巧,也讓我初步了解了軟件設(shè)計的基本方法,提高進(jìn)行工程設(shè)計的基本技能及分析、解決實(shí)際問題的能力。相信通過這次的課程設(shè)計,我對所學(xué)的我也會積極吸取本次課程設(shè)計的經(jīng)驗(yàn),在以后的程序設(shè)計方面有很大的幫助。</p><p><b>
78、; ——xxx</b></p><p> 課程設(shè)計終于結(jié)束了,我們的程序也在最后的努力下完成了。</p><p> 作為我們小組的組長,主要負(fù)責(zé)分工與協(xié)調(diào)。一個人主要負(fù)責(zé)找資料,一個人負(fù)責(zé)程序的修改,剩下的一個人負(fù)責(zé)報告。當(dāng)然在實(shí)際工作過程中,每一項(xiàng)工作大家也都有涉及??傮w來說我們的合作還是很愉快的,我們的氛圍也是很和諧的,很少會有爭吵,都會為彼此著想。</p>
79、;<p> 除此之外,對于課程設(shè)計本身來說,經(jīng)過這次經(jīng)驗(yàn)以后,我對于程序的開發(fā)有了一定的了解。知道了基本的步驟,先對用戶的需求,這里就是題目的要求進(jìn)行分析,然后開始設(shè)計思路,然后開始寫程序、調(diào)試、運(yùn)行,最后作出相應(yīng)的調(diào)整。</p><p> 但唯一不足的是,我們的能力有限,無法將程序一點(diǎn)一點(diǎn)自己寫出來,只能通過查資料以后對別人的程序進(jìn)行修改。不過,相信通過我們的努力,以后我們也可以寫出自己的程序
80、來,我們一起加油!</p><p><b> ——xxx</b></p><p><b> 附 錄</b></p><p> 一、主程序的關(guān)鍵代碼如下:</p><p> int main()</p><p><b> {</b></p&
81、gt;<p> char str[40],*c,ch;</p><p> float i=0,n,f;</p><p><b> FILE *fp;</b></p><p> StStack s1,*OPND; </p><p> StStack_c s2,*OPT
82、R; </p><p><b> OPND=&s1;</b></p><p><b> OPTR=&s2;</b></p><p><b> c=str;</b></p><p><b> do{</b>
83、</p><p> InitStack_c(OPTR);</p><p> Push_c(OPTR,'#');</p><p> InitStack(OPND);</p><p><b> do{</b></p><p> printf("\n請輸入一個算術(shù)表達(dá)
84、式(以#符結(jié)束):\n ");</p><p> scanf("%s",c);getchar();</p><p> if(check_ch(c)) f=1;</p><p><b> else</b></p><p> {printf("\nWarning: 輸入的表達(dá)式
85、有誤,請重新輸入!!\n");</p><p><b> f=0;</b></p><p><b> }</b></p><p> }while(f!=1); </p><p> Operating(c,OPND,OPTR);</p><p>
86、; n=GetTop(OPND);</p><p> printf("\n算術(shù)表達(dá)式的結(jié)果為: %.2f.\n",n);</p><p> printf("\n請選擇是否繼續(xù)計算(y/n): ");</p><p> ch=getchar(); getchar();</p><p> }wh
87、ile(ch=='y'||ch=='Y');</p><p><b> }</b></p><p> 二、關(guān)鍵運(yùn)算程序部分代碼如下:</p><p><b> ?、俦磉_(dá)式運(yùn)算過程:</b></p><p> void Operating(char *c,StSt
88、ack *OPND,StStack_c *OPTR)</p><p><b> {char ch;</b></p><p> int k=0,i=0;</p><p> float a,b,e;</p><p> if(c[0]=='-'&&(!In_c(c[1])))
89、</p><p> {k=changeN(OPND,&c[1]);</p><p> i+=k+1; </p><p> Pop(OPND,&e);</p><p> e=-1*e; </p><p>
90、; Push(OPND,e);</p><p><b> }</b></p><p><b> do{</b></p><p> if(!In_c(c[i])) </p><p> {k=changeN(OPND,&c[i]);</p>&
91、lt;p> i+=k-1; </p><p><b> }</b></p><p><b> else</b></p><p> {if(k=DealNeg(OPND,&c[i])) i+=k; </p><p><
92、b> else</b></p><p> {switch(Precede(GetTop_c(OPTR),c[i])){</p><p> case '<': Push_c(OPTR,c[i]); </p><p><b> break;</b></p><
93、p> case '=': Pop_c(OPTR,&ch); </p><p><b> break;</b></p><p> case '>': Pop_c(OPTR,&ch); </p><p> Pop(OPND,&
94、amp;b);</p><p> Pop(OPND,&a);</p><p> e=operate(a,ch,b); </p><p> if(GetTop_c(OPTR)=='-') </p><p> {Pop_c(OPTR,&ch);</p>
95、<p> Push_c(OPTR,'+');</p><p><b> e=-1*e;</b></p><p><b> }</b></p><p> Push(OPND,e);</p><p> if(c[i]!='#'&&c[
96、i]!=')') </p><p> Push_c(OPTR,c[i]);</p><p><b> else i--;</b></p><p><b> }</b></p><p><b> } </b></p>&l
97、t;p><b> }</b></p><p><b> i++;</b></p><p> }while(GetTop_c(OPTR)!='#'||c[i]!='#'); </p><p><b> }</b></p><p
98、><b> ?、诨具\(yùn)算的實(shí)現(xiàn):</b></p><p> float operate(float x,char c,float y)</p><p><b> {</b></p><p> switch(c){</p><p> case '+': return x+
99、y;</p><p> case '-': return x-y;</p><p> case '*': return x*y;</p><p> case '/': if(y!=0) return x/y; </p><p><b> else</b&g
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 算術(shù)表達(dá)式求值課程設(shè)計
- vc++課程設(shè)計《算術(shù)表達(dá)式》
- 算術(shù)表達(dá)式求值演示-課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---算術(shù)表達(dá)式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計帶括號的算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(表達(dá)式計算)
- 課程設(shè)計--表達(dá)式翻譯
- 課程設(shè)計--計算帶變量的數(shù)學(xué)表達(dá)式程序
- c++課程設(shè)計---中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的實(shí)現(xiàn)
- 基于表達(dá)式計算器的編譯原理課程設(shè)計
- 課程設(shè)計報告-表達(dá)式類型的實(shí)現(xiàn)
- 編譯原理課程設(shè)計--算術(shù)表達(dá)式的語法分析及語義分析程序設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達(dá)式求值
- 利用棧求表達(dá)式課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---表達(dá)式求值
評論
0/150
提交評論