數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告簡單計(jì)算器_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告簡單計(jì)算器_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告簡單計(jì)算器_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告簡單計(jì)算器_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告簡單計(jì)算器_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論