版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 計(jì)算機(jī)科學(xué)與信息工程學(xué)院</p><p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p> 設(shè)計(jì)題目:簡(jiǎn)單計(jì)算器</p><p> 2010 年 12 月 25 日</p><p><b> 簡(jiǎn)單計(jì)算器</b></p><p><b&g
2、t; 一 基本功能描述</b></p><p> 簡(jiǎn)單的計(jì)算器的功能是對(duì)基本的加、減、乘、除、四則運(yùn)算,可對(duì)輸入的操作數(shù),包括整數(shù),小數(shù)等進(jìn)行運(yùn)算。</p><p><b> 二 設(shè)計(jì)思路</b></p><p> 本程序主要是采用棧的理論知識(shí),主要用到兩個(gè)結(jié)構(gòu)體棧,一個(gè)用來(lái)轉(zhuǎn)化表達(dá)式,一個(gè)用來(lái)計(jì)算表達(dá)式。區(qū)別就在于一個(gè)存儲(chǔ)
3、字符,一個(gè)存儲(chǔ)浮點(diǎn)。首先,用一個(gè)字符數(shù)組來(lái)存儲(chǔ)用戶(hù)輸入的中綴表達(dá)式。然后用棧來(lái)把這個(gè)表達(dá)式轉(zhuǎn)化為后綴表達(dá)式,轉(zhuǎn)化時(shí)要進(jìn)行符號(hào)優(yōu)先級(jí)比較,這里將‘*’‘/’的優(yōu)先級(jí)定為2,‘+’‘-’定為1,括號(hào)和‘=’定為0。具體思想如下:例如用戶(hù)輸入了1+2*3=,將其存放入一個(gè)字符數(shù)組中。先在棧的底部存放一個(gè)‘=’號(hào)符,用作符號(hào)優(yōu)先級(jí)比較。首先將1存放到另外一個(gè)字符數(shù)組s1中,再將‘+’號(hào)入棧。入棧的同時(shí)與底部的‘=’比較優(yōu)先級(jí),‘+’的優(yōu)先級(jí)高于
4、‘=’,所以不出棧,之后將2存放入s2中,然后再將‘*’入棧,入棧的同時(shí)與‘+’比較符號(hào)優(yōu)先級(jí),‘*’比‘+’高,所以不出棧。再將3存入s2中。之后將棧中不是‘=’的運(yùn)算符都彈出棧,并依次存入s2中。所以s2中的表達(dá)式為123*+。之后進(jìn)行計(jì)算,計(jì)算時(shí)用到浮點(diǎn)棧。首先將s2中的字符依次入棧,遇到運(yùn)算符時(shí)進(jìn)行計(jì)算。所以將123入棧后,再將‘*’入棧的同時(shí),將前面兩個(gè)數(shù)字進(jìn)行運(yùn)算,算出結(jié)果為6并存入棧中,之后再將‘+’入棧,再與1進(jìn)行運(yùn)算,
5、結(jié)果即為7</p><p><b> 三 概要設(shè)計(jì)</b></p><p><b> 1,子函數(shù)功能</b></p><p> struct Stack{……}</p><p> 用來(lái)轉(zhuǎn)化表達(dá)式的機(jī)構(gòu)體棧。</p><p> Struct FStack{……}<
6、;/p><p> 用來(lái)計(jì)算表達(dá)式的結(jié)構(gòu)體棧</p><p> void InitStack(Stack &s)</p><p><b> 初始化結(jié)構(gòu)體棧</b></p><p> void InitFStack(FStack &s)</p><p><b> 初始化
7、結(jié)構(gòu)體棧</b></p><p> char GetTop(Stack s)</p><p><b> 獲取棧頂數(shù)據(jù)</b></p><p> void IncrementStackSize(Stack &s)</p><p> 為棧擴(kuò)充ncrementsize個(gè)存儲(chǔ)空間</p>
8、<p> void IncrementFStackSize(FStack &s)</p><p> 為棧擴(kuò)充ncrementsize個(gè)存儲(chǔ)空間</p><p> void Push(Stack &s,char e)</p><p><b> 第一個(gè)棧入棧操作</b></p><p>
9、 void PushF(FStack &s,float e)</p><p><b> 第二個(gè)棧入棧操作</b></p><p> bool Empty(Stack s)</p><p> 判斷第一個(gè)棧是否為空。</p><p> bool EmptyF(FStack s)</p><
10、p><b> 判斷第二個(gè)棧是否空</b></p><p> char Pop(Stack &s)</p><p><b> 表達(dá)式出棧</b></p><p> float PopF(FStack &s)</p><p><b> 計(jì)算的數(shù)據(jù)出棧</b
11、></p><p> int Precede(char op)</p><p><b> 確定優(yōu)先級(jí)的函數(shù)</b></p><p> void Change(char *s1,char *s2)</p><p> 改變兩個(gè)字符串的儲(chǔ)存位置</p><p> float Compu
12、te(char *s2)</p><p><b> 實(shí)現(xiàn)數(shù)據(jù)的運(yùn)算</b></p><p><b> 2 函數(shù)的調(diào)用</b></p><p> 3 測(cè)試數(shù)據(jù)及測(cè)試結(jié)果</p><p> (1)測(cè)試 1+2+3=6</p><p> (2) 測(cè)試2*4=8</p
13、><p> (3)測(cè)試 3/2=1.5</p><p> (4)測(cè)試(1+2)*3=9</p><p><b> 四 程序代碼</b></p><p> #include <iostream.h></p><p> #include <fstream.h></p
14、><p> #include <string.h></p><p> #include <ctype.h></p><p> #include <stdlib.h></p><p> #include <strstrea.h></p><p> struct Sta
15、ck{ //轉(zhuǎn)換表達(dá)式</p><p> char *elem;</p><p><b> int top;</b></p><p> int stacksize;</p><p> int incrementsize;</p><p><b> };&
16、lt;/b></p><p> struct FStack{ //計(jì)算</p><p> float *elem;</p><p><b> int top;</b></p><p> int stacksize;</p><p> int incrementsi
17、ze;</p><p><b> };</b></p><p> void InitStack(Stack &s)</p><p><b> {</b></p><p> s.elem=new char[100];</p><p><b> s.t
18、op=-1;</b></p><p> s.stacksize=100;</p><p> s.incrementsize=10;</p><p><b> }</b></p><p> void InitFStack(FStack &s)</p><p><b&
19、gt; {</b></p><p> s.elem=new float[100];</p><p><b> s.top=-1;</b></p><p> s.stacksize=100;</p><p> s.incrementsize=10;</p><p><b&
20、gt; }</b></p><p> char GetTop(Stack s)</p><p><b> {</b></p><p> return s.elem[s.top];</p><p><b> }</b></p><p> void Inc
21、rementStackSize(Stack &s)</p><p><b> {</b></p><p> char *a=new char[s.stacksize+s.incrementsize];</p><p> for(int i=0;i<=s.top;i++)</p><p> a[i]=
22、s.elem[i];</p><p> delete []s.elem;</p><p><b> s.elem=a;</b></p><p> s.stacksize+=s.incrementsize;</p><p><b> }</b></p><p> vo
23、id IncrementFStackSize(FStack &s)</p><p><b> {</b></p><p> float *a=new float[s.stacksize+s.incrementsize];</p><p> for(int i=0;i<=s.top;i++)</p><p&
24、gt; a[i]=s.elem[i];</p><p> delete []s.elem;</p><p><b> s.elem=a;</b></p><p> s.stacksize+=s.incrementsize;</p><p><b> }</b></p><
25、;p> void Push(Stack &s,char e)</p><p><b> {</b></p><p> if(s.top==(s.stacksize-1))</p><p> IncrementStackSize(s);</p><p><b> s.top++;<
26、/b></p><p> s.elem[s.top]=e;</p><p><b> }</b></p><p> void PushF(FStack &s,float e)</p><p><b> {</b></p><p> if(s.top=
27、=(s.stacksize-1))</p><p> IncrementFStackSize(s);</p><p><b> s.top++;</b></p><p> s.elem[s.top]=e;</p><p><b> }</b></p><p> bo
28、ol Empty(Stack s)</p><p><b> {</b></p><p> return s.top==-1;</p><p><b> }</b></p><p> bool EmptyF(FStack s)</p><p><b> {
29、</b></p><p> return s.top==-1;</p><p><b> }</b></p><p> char Pop(Stack &s) //表達(dá)式出棧</p><p><b> {</b></p><p>
30、return s.elem[s.top--];</p><p><b> }</b></p><p> float PopF(FStack &s) //計(jì)算的數(shù)據(jù)出棧</p><p><b> {</b></p><p> return s.elem[s.top--];<
31、;/p><p><b> }</b></p><p> int Precede(char op) //確定優(yōu)先級(jí)的函數(shù)</p><p><b> {</b></p><p> switch (op)</p><p><b> {</b>&l
32、t;/p><p><b> case '+':</b></p><p><b> case '-':</b></p><p> return 1; //定義加減運(yùn)算的優(yōu)先級(jí)為1</p><p><b> case '*':&
33、lt;/b></p><p><b> case '/':</b></p><p> return 2; //定義乘除運(yùn)算的優(yōu)先級(jí)為2</p><p><b> case '(':</b></p><p><b> case
34、9;[':</b></p><p><b> case '{':</b></p><p><b> case '=':</b></p><p><b> default:</b></p><p> return 0;
35、 //定義在棧中的左括號(hào)和棧底字符的優(yōu)先級(jí)為0</p><p><b> }</b></p><p><b> }</b></p><p> void Change(char *s1,char *s2)</p><p><b> {</b></p>
36、;<p> Stack R; //定義用于暫存運(yùn)算符的棧</p><p> InitStack(R);</p><p> Push(R,'='); //給棧底放入‘='字符,它具有最低優(yōu)先級(jí)0</p><p><b> int i,j;</b></p><
37、p> i = 0; //用于指示掃描s1串中字符的位置,初值為0</p><p> j = 0; //用于指示s2串中待存字符的位置,初值為0</p><p> char ch = s1[i];</p><p> while (ch != '=')</p><p><b>
38、 {</b></p><p> if (ch == ' ')</p><p><b> {</b></p><p> ch = s1[++i]; //對(duì)于空格字符不做任何處理</p><p><b> }</b></p><p>
39、 //-------------------------------------------------------------</p><p> else if (ch == '(')</p><p> { //對(duì)于左括號(hào),直接進(jìn)棧</p><p> Push(R,ch);<
40、;/p><p> ch = s1[++i];</p><p><b> }</b></p><p> else if (ch == ')')</p><p> { //對(duì)于右括號(hào),使括號(hào)內(nèi)的仍停留在棧中的運(yùn)算符依次出棧并寫(xiě)入到s2中&
41、lt;/p><p> while (GetTop(R) != '(')</p><p><b> {</b></p><p> s2[j++] = Pop(R);</p><p><b> }</b></p><p> Pop(R);
42、 //刪除棧頂?shù)淖罄ㄌ?hào)</p><p> ch = s1[++i];</p><p><b> }</b></p><p> //-------------------------------------------------</p><p> else if (ch == '
43、[')</p><p> { //對(duì)于左括號(hào),直接進(jìn)棧</p><p> Push(R,ch);</p><p> ch = s1[++i];</p><p><b> }</b></p><p> else if
44、 (ch == ']')</p><p> { //對(duì)于右括號(hào),使括號(hào)內(nèi)的仍停留在棧中的運(yùn)算符依次</p><p> //出棧并寫(xiě)入到s2中</p><p> while (GetTop(R) != '[')</p><p><b&g
45、t; {</b></p><p> s2[j++] = Pop(R);</p><p><b> }</b></p><p> Pop(R); //刪除棧頂?shù)淖罄ㄌ?hào)</p><p> ch = s1[++i];</p><p>&
46、lt;b> }</b></p><p> //---------------------------------------------</p><p> else if (ch == '{')</p><p> { //對(duì)于左括號(hào),直接進(jìn)棧</p>
47、<p> Push(R,ch);</p><p> ch = s1[++i];</p><p><b> }</b></p><p> else if (ch == '}')</p><p> { //對(duì)于右括號(hào),使括號(hào)
48、內(nèi)的仍停留在棧中的運(yùn)算符依次</p><p> //出棧并寫(xiě)入到s2中</p><p> while (GetTop(R) != '{')</p><p><b> {</b></p><p> s2[j++] = Pop(R);</p><p><b> }&
49、lt;/b></p><p> Pop(R); //刪除棧頂?shù)淖罄ㄌ?hào)</p><p> ch = s1[++i];</p><p><b> }</b></p><p> //---------------------------------------------
50、------</p><p> else if (ch == '+' || ch == '-' || ch == '*' || ch == '/')</p><p> { //對(duì)于四則運(yùn)算符,使暫存在棧中的不低于c
51、h優(yōu)先級(jí)</p><p> //的運(yùn)算符依次出棧并寫(xiě)入到s2中</p><p> char w = GetTop(R);</p><p> while (Precede(w) > Precede(ch))</p><p> { //
52、優(yōu)先級(jí)()函數(shù)返回運(yùn)算符形參的優(yōu)先級(jí)</p><p> s2[j++] = w;</p><p><b> Pop(R);</b></p><p> w = GetTop(R);</p><p><b> }</b></p><p> Push(R,ch);<
53、/p><p> ch = s1[++i];</p><p><b> }</b></p><p><b> else</b></p><p> { //此處為數(shù)字或小數(shù)點(diǎn)字符的處理</p&g
54、t;<p> while (isdigit(ch) || ch == '.')</p><p><b> {</b></p><p> s2[j++] = ch;</p><p> ch = s1[++i];</p><p><b> }</b></p&
55、gt;<p> s2[j++] = ' '; //被轉(zhuǎn)換后的每個(gè)數(shù)值后放一個(gè)空格</p><p><b> }</b></p><p><b> }</b></p><p> //----------------------
56、-----------------------------------</p><p> ch = Pop(R);</p><p> while (ch != '=')</p><p><b> {</b></p><p> s2[j++] = ch;</p><p>
57、ch = Pop(R);</p><p><b> }</b></p><p> s2[j++] = '='; //加入字符串結(jié)束符</p><p> s2[j++] = '\0';</p><p><
58、;b> }</b></p><p> float Compute(char *s2)</p><p><b> {</b></p><p> FStack S; //用S棧存儲(chǔ)操作數(shù)和中間計(jì)算結(jié)果</p><p>
59、 InitFStack(S);</p><p> istrstream ins(s2); //把s2定義為輸入字符串流對(duì)象ins</p><p> char ch; //用于輸入字符</p><p> float x;
60、 //用于輸入浮點(diǎn)數(shù)</p><p><b> ins>>ch;</b></p><p> while (ch != '=')</p><p><b> {</b></p><p> switch
61、 (ch)</p><p><b> {</b></p><p><b> case '+':</b></p><p> x = PopF(S) + PopF(S);</p><p><b> break;</b></p><p>
62、;<b> case '-':</b></p><p> x = PopF(S);</p><p> x = PopF(S) - x;</p><p><b> break;</b></p><p><b> case '*':</b>
63、</p><p> x = PopF(S) * PopF(S);</p><p><b> break;</b></p><p><b> case '/':</b></p><p> x = PopF(S);</p><p> x = PopF(S
64、) / x;</p><p><b> break;</b></p><p><b> default:</b></p><p> ins.putback(ch);</p><p><b> ins>>x;</b></p><p>&
65、lt;b> }</b></p><p> PushF(S,x);</p><p><b> ins>>ch;</b></p><p><b> }</b></p><p> if (!EmptyF(S))</p><p><b&g
66、t; {</b></p><p> x = PopF(S);</p><p> if (EmptyF(S)) //如果棧中只有一個(gè)值那一定是結(jié)果</p><p><b> {</b></p><p><b> return x;</b>&l
67、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void main()//主程序</p><p><b> {</b></p>
68、<p><b> FStack s;</b></p><p> char a[10];</p><p> float b,c;</p><p> char str1[50],str2[50]; //暫時(shí)存儲(chǔ)表達(dá)式</p><p> char j='y';</p>&l
69、t;p> cout<<" ***************************歡迎使用本計(jì)算器***************************"<<endl<<endl;</p><p><b> haha:</b></p><p> while(j=='Y'||j==
70、'y')</p><p><b> {</b></p><p> int i=0,m=0,n=0,k=0,l=0,q=0,p=0;</p><p> cout<<" 請(qǐng)輸入一個(gè)以'='字符結(jié)束的中綴算術(shù)表達(dá)式:"<<endl&l
71、t;<endl;</p><p> cin.getline(str1,sizeof(str1));</p><p> while(str1[i]!='\0')</p><p><b> i++;</b></p><p> if(str1[i-1]!='=')</p>
72、;<p><b> {</b></p><p> cout<<"表達(dá)式錯(cuò)誤..請(qǐng)重新輸入.."<<endl<<endl;</p><p> goto haha;</p><p><b> }</b></p><p>&l
73、t;b> i=0;</b></p><p> while(str1[i]!='\0')</p><p><b> {</b></p><p> if(str1[i]=='0'&&str1[i-1]=='/')</p><p><
74、;b> {</b></p><p> cout<<"表達(dá)式錯(cuò)誤..請(qǐng)重新輸入.."<<endl<<endl;</p><p> goto haha;</p><p><b> }</b></p><p><b> i++;&l
75、t;/b></p><p><b> }</b></p><p><b> i=0;</b></p><p> while(str1[i]!='\0')</p><p><b> {</b></p><p> if(str
76、1[i]=='(')</p><p><b> m++;</b></p><p> if(str1[i]==')')</p><p><b> n++;</b></p><p> if(str1[i]=='[')</p><
77、p><b> k++;</b></p><p> if(str1[i]==']')</p><p><b> l++;</b></p><p> if(str1[i]=='{')</p><p><b> q++;</b><
78、/p><p> if(str1[i]=='}')</p><p><b> p++;</b></p><p><b> i++;</b></p><p><b> }</b></p><p> if(m!=n || k!=l ||
79、q!=p)</p><p><b> {</b></p><p> cout<<"表達(dá)式錯(cuò)誤..請(qǐng)重新輸入.."<<endl<<endl;</p><p> goto haha;</p><p><b> }</b></p>
80、;<p> Change(str1,str2); //處理結(jié)果</p><p> cout<<"\n求值結(jié)果為: "<<str1<<Compute(str2)<<endl;</p><p> cout<<"是否繼續(xù) :(Y/N)"<<endl;</p
81、><p><b> cin>>j;</b></p><p> cin.getline(str1,2);</p><p><b> }</b></p><p> cout<<endl<<" *********************
82、感謝使用本計(jì)算器*********************"<<endl;</p><p><b> }</b></p><p><b> 五 課程設(shè)計(jì)總結(jié)</b></p><p><b> 1 收獲</b></p><p> 通過(guò)這次課程設(shè)計(jì),更
83、進(jìn)一步了解了棧的原理和應(yīng)用,同時(shí)也鍛煉了數(shù)據(jù)結(jié)構(gòu)在實(shí)際中的熟練運(yùn)用。</p><p><b> 2 心得體會(huì)</b></p><p> 在這次數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)中遇到了很多實(shí)際性的問(wèn)題,在實(shí)際設(shè)計(jì)中才發(fā)現(xiàn),書(shū)本上理論性的東西與在實(shí)際運(yùn)用中的還是有一定的出入的,所以有些問(wèn)題要不斷地更正以前的錯(cuò)誤思維。通過(guò)這次設(shè)計(jì),我懂得了學(xué)習(xí)的重要性,了解到理論知識(shí)與實(shí)踐相結(jié)合的重要意義
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)--模擬簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--多項(xiàng)式計(jì)算器
- 計(jì)算器java課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(二)表達(dá)式求值(計(jì)算器)
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)
- c++簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- c++課程設(shè)計(jì)報(bào)告--簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單的計(jì)算器課程設(shè)計(jì)
- 課程設(shè)計(jì)---簡(jiǎn)單的計(jì)算器
- vb課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單的計(jì)算器課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告一元稀疏多項(xiàng)式計(jì)算器
- 《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》報(bào)告---一元稀疏多項(xiàng)式計(jì)算器
- 課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器的設(shè)計(jì)
- 課程設(shè)計(jì)--簡(jiǎn)單的計(jì)算器設(shè)計(jì)
- 課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器的設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-一元多項(xiàng)式計(jì)算器
- 課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告--簡(jiǎn)單的計(jì)算器設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論