版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)</p><p><b> C語(yǔ)言設(shè)計(jì)報(bào)告</b></p><p> 題目: 簡(jiǎn)單的加減乘除運(yùn)算</p><p> 學(xué)院: 化學(xué)工程學(xué)院</p><p> 專業(yè): 制藥工程專業(yè)</p><p><b> 一 . 選題背景&
2、lt;/b></p><p> 在現(xiàn)實(shí)生活中常需要對(duì)一些并不深?yuàn)W但較長(zhǎng)或繁瑣的數(shù)字進(jìn)行簡(jiǎn)單的計(jì)算,可大大提高工作效率,節(jié)約時(shí)間.該程序可運(yùn)用到C語(yǔ)言中的大部分知識(shí),并且簡(jiǎn)單易懂,在選擇分支下判斷符號(hào)的優(yōu)先級(jí)別,調(diào)用加減乘除的計(jì)算函數(shù)并轉(zhuǎn)化表達(dá)式即可完成程序的運(yùn)行.選擇該題目也有能力限制的原因,但不影響涵蓋廣泛的知識(shí)面.</p><p><b> 二 . 設(shè)計(jì)思路:<
3、;/b></p><p> 加減乘除的運(yùn)算均是雙目運(yùn)算,計(jì)算式涉及兩個(gè)數(shù)據(jù)和一個(gè)計(jì)算符號(hào),所以,首先定義兩個(gè)結(jié)構(gòu)體變量,在結(jié)構(gòu)體變量中再分別定義兩個(gè)棧, 所謂棧就是一個(gè)稍微復(fù)雜的數(shù)組,并且只能從后面加入數(shù)據(jù)和導(dǎo)出數(shù)據(jù),就是所謂的后到先出,好比堆東西,在最上面的東西是最后放入的,但是卻是最先取出的</p><p><b> struct</b></p&g
4、t;<p><b> {</b></p><p> float a[100];</p><p> int top; /*用來(lái)記錄棧頂?shù)淖兞?/ </p><p> }St; /*在外部定義了一個(gè)棧,好似定義了一個(gè)全局變量,此棧為數(shù)據(jù)棧*/</p><p>&l
5、t;b> struct</b></p><p><b> {</b></p><p> char b[100];</p><p> int top; //也是用來(lái)記錄棧頂?shù)淖兞?lt;/p><p> }Op; //同上,此棧為運(yùn)算符號(hào)棧</p>
6、<p> 為了方便起見(jiàn),選擇用指針做參數(shù)來(lái)記錄數(shù)據(jù)</p><p> void Pop_St(float *e) //用指針作參數(shù)直接記錄數(shù)據(jù),方便 </p><p> 在連續(xù)計(jì)算中涉及到計(jì)算符號(hào)優(yōu)先級(jí)別的比較,所以調(diào)用函數(shù)完成該比較.擴(kuò)號(hào)的優(yōu)先級(jí)別最高,其次是乘除,再次是加減,用>,=,<來(lái)表示優(yōu)先級(jí)別.</p><p>
7、 char Precede(char p)</p><p><b> {</b></p><p> char e; </p><p><b> switch(p)</b></p><p><b> {</b></p>&l
8、t;p><b> case '+':</b></p><p><b> case '-':</b></p><p> if (Op.top!=-1&&Op.b[Op.top]!='(') e='>';</p><p> el
9、se e='<';</p><p><b> break;</b></p><p><b> case '*':</b></p><p> case '/':{</p><p> if (Op.b[Op.top]=='*'
10、;||Op.b[Op.top]=='/'||Op.b[Op.top]==')') e='>';</p><p> else e='<';</p><p><b> break;</b></p><p><b> }</b></p>
11、<p><b> ……….</b></p><p> 然后調(diào)用函數(shù)進(jìn)行計(jì)算</p><p> 進(jìn)入程序的核心部分,把表達(dá)式轉(zhuǎn)化為逆波蘭表達(dá)式.</p><p> printf("Please input the expression:");</p><p> gets(str)
12、; //輸入表達(dá)式</p><p> printf ("the change exprission is ");</p><p> while (*p!='\0')</p><p><b> {</b></p><p> if(*p>=
13、'0'&&*p<='9') //如果輸入的是數(shù)字</p><p><b> {</b></p><p> while (*p>='0'&&*p<='9')</p><p><b> {</b>&l
14、t;/p><p> num=*p-'0'+num*10; //把用字符表示的數(shù)字轉(zhuǎn)化為實(shí)際意義的數(shù)字,并且把一串字符數(shù)字變成有實(shí)際意義的數(shù)字,如‘1’‘2’‘3’‘4’這是一串字符,轉(zhuǎn)化成1234,一千兩百三十四</p><p> putchar(*p);</p><p><b> p++;</b></p>&
15、lt;p><b> }</b></p><p> Push_St(num); //把轉(zhuǎn)化好的數(shù)字導(dǎo)入數(shù)據(jù)棧里</p><p><b> num=0;</b></p><p> putchar(' ');</p><p><b> }</b
16、></p><p> 最后再比較讀入符號(hào)的優(yōu)先級(jí)別,進(jìn)行計(jì)算,并返回計(jì)算函數(shù)的返回值,輸出計(jì)算結(jié)果</p><p> printf("\nthe resule is %.f\n",a);</p><p><b> 三,程序流程圖</b></p><p><b> 四 . 程序清
17、單:</b></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #define Null 0</p><p><b> struct</b></p><p><b&g
18、t; {</b></p><p> float a[100];</p><p> int top; /*用來(lái)記錄棧頂?shù)淖兞?/ </p><p> }St; /*在外部定義了一個(gè)棧,好似定義了一個(gè)全局變量,此棧為數(shù)據(jù)棧*/</p><p><b> struct<
19、/b></p><p><b> {</b></p><p> char b[100];</p><p> int top; /*也是用來(lái)記錄棧頂?shù)淖兞?/</p><p> }Op; /*同上,此棧為運(yùn)算符號(hào)棧*/</p><p> voi
20、d Push_St(float e)</p><p><b> {</b></p><p> if (St.top!=99) /*判斷棧頂是否滿了*/ </p><p><b> {</b></p><p> St.top++; /*沒(méi)滿的話棧頂向前
21、進(jìn)一個(gè)*/</p><p> St.a[St.top]=e; /*在棧頂處放入一個(gè)數(shù)據(jù)*/</p><p><b> }</b></p><p> else printf ("Stack is Full\n");</p><p> }
22、 /*把一個(gè)數(shù)據(jù)推入棧中*/ </p><p> void Pop_St(float e) </p><p><b> {</b></p><p> if ((St.top)!=-1) /*如果棧不是空的話*/</p><p><b> {</b>&
23、lt;/p><p> e=St.a[St.top]; /*把棧頂數(shù)據(jù)導(dǎo)出來(lái) */ </p><p> St.top--; /*棧頂向回退一個(gè)*/</p><p><b> }</b></p><p> else printf("Stack is empty\n");&l
24、t;/p><p> } /*從棧中取出數(shù)據(jù)*/</p><p> void Push_Op(char e) /*此函數(shù)同上Push_St(float e),只不過(guò)因?yàn)槭莾蓚€(gè)棧,所以需另編一個(gè)*/</p><p><b> {</b></p><p>
25、if (Op.top!=99)</p><p><b> {</b></p><p><b> Op.top++;</b></p><p> Op.b[Op.top]=e;</p><p><b> }</b></p><p> else pr
26、intf("Stack is Full\n");</p><p><b> }</b></p><p> void Pop_Op(char e) /*此函數(shù)同上Pop_St(float e),只不過(guò)因?yàn)槭莾蓚€(gè)棧,所以需另編一個(gè)*/</p><p><b> {</b></p&g
27、t;<p> if (Op.top!=-1)</p><p><b> {</b></p><p> *e=Op.b[Op.top];</p><p><b> Op.top--;</b></p><p><b> }</b></p>&l
28、t;p> else printf("Stack is Empty\n");</p><p><b> }</b></p><p> char Precede(char p) /*這里就是比較優(yōu)先級(jí)了,如果運(yùn)算符棧頂?shù)姆?hào)的優(yōu)先級(jí)比現(xiàn)在讀取的符號(hào)的優(yōu)先級(jí)高的話,就返回一個(gè)〉,反之返回一個(gè)〉。*/</p><
29、;p><b> {</b></p><p> char e; </p><p><b> switch(p)</b></p><p><b> {</b></p><p><b> case '+':&l
30、t;/b></p><p><b> case '-':</b></p><p> if (Op.top!=-1&&Op.b[Op.top]!='(') e='>';</p><p> else e='<';</p><p
31、><b> break;</b></p><p><b> case '*':</b></p><p> case '/':{</p><p> if (Op.b[Op.top]=='*'||Op.b[Op.top]=='/'||Op.b[Op
32、.top]==')') e='>';</p><p> else e='<';</p><p><b> break;</b></p><p><b> }</b></p><p><b> {</b><
33、/p><p> if (Op.b[Op.top]=='*'||Op.b[Op.top]=='/'||Op.b[Op.top]==')') e='>';</p><p> else e='<';</p><p><b> break;</b></p
34、><p><b> }</b></p><p><b> case '(':</b></p><p><b> {</b></p><p><b> e='<';</b></p><p>&
35、lt;b> break;</b></p><p><b> }</b></p><p><b> case ')':</b></p><p><b> {</b></p><p> if(Op.b[Op.top]=='(
36、9;) e='=';</p><p> else e='>';</p><p><b> break;</b></p><p><b> }</b></p><p> default: printf("Error\n");</p
37、><p><b> }</b></p><p><b> return e;</b></p><p><b> }</b></p><p> float Operate (float a,char e,float b) /*運(yùn)算*/</p><p&g
38、t;<b> {</b></p><p><b> float c;</b></p><p> switch (e) /*判斷符號(hào),選擇相應(yīng)的運(yùn)算*/</p><p><b> {</b></p><p> case
39、 '+': </p><p><b> {</b></p><p><b> c=a+b;</b></p><p><b> break;</b></p><p><b> }</b></p><p><
40、;b> case '-':</b></p><p><b> {</b></p><p><b> c=a-b;</b></p><p><b> break;</b></p><p><b> }</b><
41、;/p><p> case '*': </p><p><b> {</b></p><p><b> c=a*b;</b></p><p><b> break;</b></p><p><b> }</b>
42、</p><p> case '/': </p><p><b> {</b></p><p><b> c=a/b;</b></p><p><b> break;</b></p><p><b> }</b&
43、gt;</p><p> default: printf("error\n");</p><p><b> }</b></p><p><b> return c;</b></p><p><b> }</b></p><p>
44、; void trans(char str[]) /*這里是把我們習(xí)慣的運(yùn)算表達(dá)使轉(zhuǎn)化成逆波蘭表達(dá)式,這是本程序的核心。*/</p><p><b> {</b></p><p> char *p,x,theta;</p><p> float num=0,b,a,c;</p><p> S
45、t.top=-1;</p><p> Op.top=-1; /*初始化兩個(gè)棧,使兩個(gè)棧為空*/</p><p><b> p=str;</b></p><p> printf("Please input the expression:");</p><p>
46、 gets(str); /*輸入表達(dá)式*/</p><p> printf ("the change exprission is ");</p><p> while (*p!='\0')</p><p><b> {</b></p><p>
47、 if(*p>='0'&&*p<='9') /*如果輸入的是數(shù)字*/</p><p><b> {</b></p><p> while (*p>='0'&&*p<='9')</p><p><b>
48、 {</b></p><p> num=*p-'0'+num*10; /*把用字符表示的數(shù)字轉(zhuǎn)化為實(shí)際意義的數(shù)字,并且把一串字符數(shù)字變成有實(shí)際意義的數(shù)字,如‘1’‘2’‘3’‘4’這是一串字符,轉(zhuǎn)化成1234,一千兩百三十四*/</p><p> putchar(*p);</p><p><b> p++;</b&
49、gt;</p><p><b> }</b></p><p> Push_St(num); /*把轉(zhuǎn)化好的數(shù)字導(dǎo)入數(shù)據(jù)棧里*/</p><p><b> num=0;</b></p><p> putchar(' ');</p><p>
50、<b> }</b></p><p> if (*p!='\0') /*如果輸入的是運(yùn)算符,這里默認(rèn)輸入的除了數(shù)字就是運(yùn)算符*/</p><p><b> {</b></p><p> switch(Precede(*p)) /*這里就是判斷現(xiàn)在讀入的運(yùn)算符和運(yùn)算符棧里的運(yùn)算
51、符的優(yōu)先級(jí)*/</p><p><b> {</b></p><p> case '<': /*如果返回的是〈著把現(xiàn)在讀入的運(yùn)算符導(dǎo)入棧*/</p><p> Push_Op(*p);</p><p><b> p++;</b></p>
52、<p><b> break;</b></p><p> case '=': /*如果返回的是=的話,直接把運(yùn)算符棧頂?shù)倪\(yùn)算符扔了,就是直接導(dǎo)出不用任何有意義的變量去記錄,這里的x變量是無(wú)意的,可以認(rèn)為是垃圾桶*/</p><p> Pop_Op(&x);</p><p><
53、;b> p++;</b></p><p><b> break;</b></p><p> case '>': /*如果返回的是>的話,把運(yùn)算符棧頂?shù)倪\(yùn)算符導(dǎo)出來(lái),再把另一個(gè)數(shù)據(jù)棧里面的棧頂以及后面的兩個(gè)數(shù)據(jù)導(dǎo)出來(lái),進(jìn)行運(yùn)算*/</p><p> Pop_Op(&
54、;theta);</p><p> Pop_St(&b);</p><p> Pop_St(&a);</p><p> if (theta=='/'&&(b==0)) /*當(dāng)運(yùn)算符號(hào)為/時(shí)且a-b=0這時(shí)候是錯(cuò)誤所以c=-1;*/</p><p><b> {</
55、b></p><p><b> c=-1;</b></p><p><b> break;</b></p><p><b> }</b></p><p> else /*如果正常就輸出運(yùn)算符和數(shù)據(jù)并進(jìn)行運(yùn)算,把運(yùn)算結(jié)
56、果再次推入數(shù)據(jù)棧*/</p><p><b> {</b></p><p> printf("%c ",theta);</p><p> Push_St(Operate(a,theta,b));</p><p><b> break;</b></p><
57、;p><b> }</b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p&g
58、t;<p><b> }</b></p><p> if (c!=-1) /*這里如果c不等于-1那么把棧里面未輸出的符號(hào)挨個(gè)導(dǎo)出運(yùn)算*/</p><p><b> {</b></p><p> while(Op.top!=-1)</p><p><b>
59、 {</b></p><p> Pop_Op(&theta);</p><p> putchar(' ');</p><p> printf("%c",theta);</p><p> Pop_St(&b);</p><p> Pop_St(&a
60、mp;a);</p><p> if (theta=='/'&&(b==0)) /*注意,在導(dǎo)出棧里面未輸出時(shí)可能也會(huì)出現(xiàn)除數(shù)為零的可能*/</p><p><b> {</b></p><p> printf("\nerror expression\n"); /*這時(shí)c=-
61、1*/</p><p><b> c=-1;</b></p><p><b> break;</b></p><p><b> }</b></p><p> Push_St(Operate(a,theta,b));</p><p><b&g
62、t; }</b></p><p> if(c!=-1) /*如果c還不是-1時(shí)才會(huì)輸出結(jié)果*/</p><p><b> {</b></p><p> Pop_St(&a);</p><p> printf("\nthe resule i
63、s %.f\n",a);</p><p><b> }</b></p><p><b> }</b></p><p> else printf("error exprission");</p><p><b> }</b></p>
64、;<p> void main() /*因?yàn)槲覀儗W(xué)的是數(shù)據(jù)結(jié)構(gòu),強(qiáng)調(diào)數(shù)據(jù)封裝化,再主函數(shù)中應(yīng)盡力減少對(duì)數(shù)據(jù)的處理,而對(duì)數(shù)據(jù)的處理應(yīng)該用不同的函數(shù)去完成。*/</p><p><b> {</b></p><p> char str[100]={'\0'};</p><p> trans(str);&
65、lt;/p><p><b> }</b></p><p> 五 . 主要問(wèn)題的解決方法</p><p> 1. 主要問(wèn)題的解決方法及技術(shù)關(guān)鍵</p><p> 表達(dá)式向逆波蘭表達(dá)式轉(zhuǎn)化的問(wèn)題,定義出一個(gè)函數(shù)來(lái)完成這個(gè)轉(zhuǎn)化過(guò)程.</p><p> 對(duì)符號(hào)優(yōu)先級(jí)別的判斷,由選擇分支結(jié)構(gòu)來(lái)完成.&
66、lt;/p><p> 棧的技術(shù)由定義結(jié)構(gòu)體變量完成.</p><p><b> 2.技術(shù)關(guān)鍵</b></p><p> 函數(shù)調(diào)用,結(jié)構(gòu)體變量的定義使用</p><p> 六 . 設(shè)計(jì)結(jié)果說(shuō)明:</p><p><b> 1 . 設(shè)計(jì)優(yōu)點(diǎn):</b></p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)
- 計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)---黑白棋
- 計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)---解救人質(zhì)游戲
- 計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)---路邊吃數(shù)游戲
- 計(jì)算機(jī)技術(shù)基礎(chǔ)(c語(yǔ)言)課程設(shè)計(jì)--簡(jiǎn)單潛艇大戰(zhàn)
- 計(jì)算機(jī)技術(shù)基礎(chǔ)(c語(yǔ)言)課程設(shè)計(jì)---簡(jiǎn)單的彈球得分游戲
- 計(jì)算機(jī)文化基礎(chǔ)課程設(shè)計(jì)
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)課程設(shè)計(jì)
- 計(jì)算機(jī)科學(xué)基礎(chǔ)課程設(shè)計(jì)
- 計(jì)算機(jī)科學(xué)基礎(chǔ)課程設(shè)計(jì)
- 計(jì)算機(jī)技術(shù)基礎(chǔ)(c語(yǔ)言)課程設(shè)計(jì)--計(jì)算器
- 加減乘除混合運(yùn)算
- 計(jì)算機(jī)技術(shù)基礎(chǔ)(c語(yǔ)言)課程設(shè)計(jì)--尋寶游戲
- 匯編課程設(shè)計(jì)計(jì)算平臺(tái)長(zhǎng)度程序 加減乘除四則運(yùn)算
- 計(jì)算機(jī)技術(shù)基礎(chǔ)(c語(yǔ)言)課程設(shè)計(jì)--模擬銀行打印
- 計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)軟件技術(shù)基礎(chǔ)課程設(shè)計(jì)報(bào)告-計(jì)算器課程設(shè)計(jì)
- 計(jì)算機(jī)技術(shù)創(chuàng)新基礎(chǔ)課程設(shè)計(jì)--基于c++的學(xué)生成績(jī)管理系統(tǒng)
- 匯編語(yǔ)言課程設(shè)計(jì)--實(shí)現(xiàn)加減乘除四則運(yùn)算的計(jì)算器
- 《計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)課程設(shè)計(jì)》udp
評(píng)論
0/150
提交評(píng)論