




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、計(jì)算機(jī)科學(xué)與信息工程學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)設(shè)計(jì)題目:簡單計(jì)算器 專 業(yè)計(jì)算機(jī)軟件班 級 計(jì)軟2班小組成員 蔡松佐 陳吉院 王希 劉軍 符錦柏 曾祖濱 劉一霖指導(dǎo)教師張顯全2010 年 12 月 25 日數(shù)據(jù)結(jié)構(gòu)分工情況組長:蔡松佐組員:曾祖濱、陳吉院、符錦柏、劉軍、劉一霖、王希王希:負(fù)責(zé)設(shè)計(jì)程序的整體框架(定義數(shù)據(jù)結(jié)構(gòu),編寫主函數(shù))評分:90分符錦柏:負(fù)責(zé)編寫棧的代碼評分:95分蔡松佐:負(fù)責(zé)編寫計(jì)算算術(shù)表達(dá)式的代碼評分:95分陳吉院:負(fù)責(zé)編寫比較符號優(yōu)先級的代碼評分:90分曾祖濱:負(fù)責(zé)將所有代碼整合成一個完整的程序評分:88分劉軍:負(fù)責(zé)寫實(shí)驗(yàn)報(bào)告評分:90分劉一霖:負(fù)責(zé)測試程序,看其是否具有良好
2、的健壯性評分:88分簡單計(jì)算器一 基本功能描述簡單的計(jì)算器的功能是對基本的加、減、乘、除、四則運(yùn)算,可對輸入的操作數(shù),包括整數(shù),小數(shù)等進(jìn)行運(yùn)算。二 設(shè)計(jì)思路本程序主要是采用棧的理論知識,主要用到兩個結(jié)構(gòu)體棧,一個用來轉(zhuǎn)化表達(dá)式,一個用來計(jì)算表達(dá)式。區(qū)別就在于一個存儲字符,一個存儲浮點(diǎn)。首先,用一個字符數(shù)組來存儲用戶輸入的中綴表達(dá)式。然后用棧來把這個表達(dá)式轉(zhuǎn)化為后綴表達(dá)式,轉(zhuǎn)化時要進(jìn)行符號優(yōu)先級比較,這里將*/的優(yōu)先級定為2,+-定為1,括號和=定為0。具體思想如下:例如用戶輸入了1+2*3=,將其存放入一個字符數(shù)組中。先在棧的底部存放一個=號符,用作符號優(yōu)先級比較。首先將1存放到另外一個字符數(shù)
3、組s1中,再將+號入棧。入棧的同時與底部的=比較優(yōu)先級,+的優(yōu)先級高于=,所以不出棧,之后將2存放入s2中,然后再將*入棧,入棧的同時與+比較符號優(yōu)先級,*比+高,所以不出棧。再將3存入s2中。之后將棧中不是=的運(yùn)算符都彈出棧,并依次存入s2中。所以s2中的表達(dá)式為123*+。之后進(jìn)行計(jì)算,計(jì)算時用到浮點(diǎn)棧。首先將s2中的字符依次入棧,遇到運(yùn)算符時進(jìn)行計(jì)算。所以將123入棧后,再將*入棧的同時,將前面兩個數(shù)字進(jìn)行運(yùn)算,算出結(jié)果為6并存入棧中,之后再將+入棧,再與1進(jìn)行運(yùn)算,結(jié)果即為7,然后輸出結(jié)果。三 概要設(shè)計(jì)1,子函數(shù)功能struct Stack用來轉(zhuǎn)化表達(dá)式的機(jī)構(gòu)體棧。Struct FSt
4、ack用來計(jì)算表達(dá)式的結(jié)構(gòu)體棧void InitStack(Stack &s)初始化結(jié)構(gòu)體棧void InitFStack(FStack &s)初始化結(jié)構(gòu)體棧char GetTop(Stack s)獲取棧頂數(shù)據(jù)void IncrementStackSize(Stack &s)為棧擴(kuò)充ncrementsize個存儲空間void IncrementFStackSize(FStack &s)為棧擴(kuò)充ncrementsize個存儲空間void Push(Stack &s,char e)第一個棧入棧操作void PushF(FStack &s,float
5、e)第二個棧入棧操作bool Empty(Stack s)判斷第一個棧是否為空。bool EmptyF(FStack s)判斷第二個棧是否空char Pop(Stack &s)表達(dá)式出棧float PopF(FStack &s)計(jì)算的數(shù)據(jù)出棧int Precede(char op)確定優(yōu)先級的函數(shù)void Change(char *s1,char *s2)改變兩個字符串的儲存位置float Compute(char *s2)實(shí)現(xiàn)數(shù)據(jù)的運(yùn)算2 函數(shù)的調(diào)用主函數(shù)棧的建立Stack,F(xiàn)StackChange(str1,str2)計(jì)算表達(dá)式Compute(str2)InitFStack
6、(S);PushF(S,x)PopF(S)輸出cin.getline(str1,2);3 測試數(shù)據(jù)及測試結(jié)果(1)測試 1+2+3=6(2) 測試2*4=8(3)測試 3/2=1.5(4)測試(1+2)*3=9四 程序代碼#include <iostream.h>#include <fstream.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <strstrea.h>struct Stack /轉(zhuǎn)換表達(dá)式char *elem;int t
7、op;int stacksize;int incrementsize;struct FStack /計(jì)算float *elem;int top;int stacksize;int incrementsize;void InitStack(Stack &s)s.elem=new char100;s.top=-1;s.stacksize=100;s.incrementsize=10;void InitFStack(FStack &s)s.elem=new float100;s.top=-1;s.stacksize=100;s.incrementsize=10;char GetTop
8、(Stack s)return s.elems.top;void IncrementStackSize(Stack &s)char *a=new chars.stacksize+s.incrementsize;for(int i=0;i<=s.top;i+)ai=s.elemi;delete s.elem;s.elem=a;s.stacksize+=s.incrementsize;void IncrementFStackSize(FStack &s)float *a=new floats.stacksize+s.incrementsize;for(int i=0;i<
9、;=s.top;i+)ai=s.elemi;delete s.elem;s.elem=a;s.stacksize+=s.incrementsize;void Push(Stack &s,char e)if(s.top=(s.stacksize-1)IncrementStackSize(s);s.top+;s.elems.top=e;void PushF(FStack &s,float e)if(s.top=(s.stacksize-1)IncrementFStackSize(s);s.top+;s.elems.top=e;bool Empty(Stack s)return s.
10、top=-1;bool EmptyF(FStack s)return s.top=-1;char Pop(Stack &s) /表達(dá)式出棧return s.elems.top-;float PopF(FStack &s) /計(jì)算的數(shù)據(jù)出棧return s.elems.top-;int Precede(char op) /確定優(yōu)先級的函數(shù)switch (op)case '+':case '-':return 1; /定義加減運(yùn)算的優(yōu)先級為1case '*':case '/':return 2; /定義乘除運(yùn)算的優(yōu)先級
11、為2case '(':case '':case '':case '=':default:return 0; /定義在棧中的左括號和棧底字符的優(yōu)先級為0void Change(char *s1,char *s2)Stack R; /定義用于暫存運(yùn)算符的棧InitStack(R);Push(R,'='); /給棧底放入='字符,它具有最低優(yōu)先級0int i,j;i = 0; /用于指示掃描s1串中字符的位置,初值為0j = 0; /用于指示s2串中待存字符的位置,初值為0char ch = s1i;while
12、(ch != '=')if (ch = ' ')ch = s1+i; /對于空格字符不做任何處理/-else if (ch = '(') /對于左括號,直接進(jìn)棧Push(R,ch);ch = s1+i;else if (ch = ')') /對于右括號,使括號內(nèi)的仍停留在棧中的運(yùn)算符依次出棧并寫入到s2中while (GetTop(R) != '(')s2j+ = Pop(R);Pop(R); /刪除棧頂?shù)淖罄ㄌ朿h = s1+i; /-else if (ch = '') /對于左括號,直接進(jìn)棧Pu
13、sh(R,ch);ch = s1+i;else if (ch = '') /對于右括號,使括號內(nèi)的仍停留在棧中的運(yùn)算符依次 /出棧并寫入到s2中while (GetTop(R) != '')s2j+ = Pop(R);Pop(R); /刪除棧頂?shù)淖罄ㄌ朿h = s1+i; /-else if (ch = '') /對于左括號,直接進(jìn)棧Push(R,ch);ch = s1+i;else if (ch = '') /對于右括號,使括號內(nèi)的仍停留在棧中的運(yùn)算符依次 /出棧并寫入到s2中while (GetTop(R) != '&
14、#39;)s2j+ = Pop(R);Pop(R); /刪除棧頂?shù)淖罄ㄌ朿h = s1+i; /-else if (ch = '+' | ch = '-' | ch = '*' | ch = '/') /對于四則運(yùn)算符,使暫存在棧中的不低于ch優(yōu)先級 /的運(yùn)算符依次出棧并寫入到s2中char w = GetTop(R);while (Precede(w) > Precede(ch) /優(yōu)先級()函數(shù)返回運(yùn)算符形參的優(yōu)先級s2j+ = w;Pop(R);w = GetTop(R);Push(R,ch);ch = s1+i;el
15、se /此處為數(shù)字或小數(shù)點(diǎn)字符的處理while (isdigit(ch) | ch = '.')s2j+ = ch;ch = s1+i;s2j+ = ' ' /被轉(zhuǎn)換后的每個數(shù)值后放一個空格/-ch = Pop(R);while (ch != '=')s2j+ = ch;ch = Pop(R);s2j+ = '=' /加入字符串結(jié)束符s2j+ = '0'float Compute(char *s2)FStack S; /用S棧存儲操作數(shù)和中間計(jì)算結(jié)果InitFStack(S);istrstream ins(s2);
16、 /把s2定義為輸入字符串流對象inschar ch; /用于輸入字符float x; /用于輸入浮點(diǎn)數(shù)ins>>ch;while (ch != '=')switch (ch)case '+':x = PopF(S) + PopF(S);break;case '-':x = PopF(S);x = PopF(S) - x;break;case '*':x = PopF(S) * PopF(S);break;case '/':x = PopF(S);x = PopF(S) / x;break;defaul
17、t:ins.putback(ch);ins>>x;PushF(S,x);ins>>ch;if (!EmptyF(S)x = PopF(S);if (EmptyF(S) /如果棧中只有一個值那一定是結(jié)果return x;void main()/主程序FStack s;char a10;float b,c;char str150,str250; /暫時存儲表達(dá)式char j='y'cout<<" *歡迎使用本計(jì)算器*"<<endl<<endl;haha:while(j='Y'|j=
18、9;y')int i=0,m=0,n=0,k=0,l=0,q=0,p=0;cout<<" 請輸入一個以'='字符結(jié)束的中綴算術(shù)表達(dá)式:"<<endl<<endl;cin.getline(str1,sizeof(str1);while(str1i!='0')i+;if(str1i-1!='=')cout<<"表達(dá)式錯誤.請重新輸入."<<endl<<endl;goto haha;i=0;while(str1i!='0
19、9;)if(str1i='0'&&str1i-1='/')cout<<"表達(dá)式錯誤.請重新輸入."<<endl<<endl;goto haha;i+;i=0;while(str1i!='0')if(str1i='(')m+;if(str1i=')')n+;if(str1i='')k+;if(str1i='')l+;if(str1i='')q+;if(str1i='')p+;i+;if(m!=n | k!=l | q!=p)cout<<"表達(dá)式錯誤.請重新輸入."<
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 園林綠化工程承包合同
- 2024年份1月份民間戲曲劇團(tuán)巡演經(jīng)費(fèi)借貸協(xié)議
- 醫(yī)護(hù)人員的勞動合同范本
- 電工基礎(chǔ)習(xí)題(附參考答案)
- 無抵押別墅購房合同范本
- 個體經(jīng)營者合作合同樣本
- 公共場所廣告位租賃合同書范本
- 櫥柜金牌店長培訓(xùn)
- 旅行社與租車公司合同模板
- 茶旅游線路設(shè)計(jì)
- (一模)2025年廣州市普通高中畢業(yè)班綜合測試(一)英語試卷(含答案詳解)
- (二模)溫州市2025屆高三第二次適應(yīng)性考試歷史試卷(含答案)
- 全國高職單招時事政治歷史題庫
- 冷庫貨物儲存合同范本
- 專題06 機(jī)械能守恒定律 能量守恒定律(練習(xí))(解析版)-2025年高考物理二輪復(fù)習(xí)講練測(新高考用)
- 第15課《青春之光》課件-2024-2025學(xué)年統(tǒng)編版語文七年級下冊
- 2025年河南輕工職業(yè)學(xué)院單招職業(yè)技能測試題庫附答案
- 世界給予我的 課件-2024-2025學(xué)年高二下學(xué)期開學(xué)第一課主題班會
- 個體診所申請書范文
- LNG加氣站施工方案
- 互動式醫(yī)學(xué)課堂教學(xué)設(shè)計(jì)
評論
0/150
提交評論