實(shí)驗(yàn)四:通過(guò)棧設(shè)計(jì)一個(gè)計(jì)算器程序:._第1頁(yè)
實(shí)驗(yàn)四:通過(guò)棧設(shè)計(jì)一個(gè)計(jì)算器程序:._第2頁(yè)
實(shí)驗(yàn)四:通過(guò)棧設(shè)計(jì)一個(gè)計(jì)算器程序:._第3頁(yè)
實(shí)驗(yàn)四:通過(guò)棧設(shè)計(jì)一個(gè)計(jì)算器程序:._第4頁(yè)
實(shí)驗(yàn)四:通過(guò)棧設(shè)計(jì)一個(gè)計(jì)算器程序:._第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)驗(yàn)四:通過(guò)棧設(shè)計(jì)一個(gè)計(jì)算器程序?qū)W 院 理學(xué)院 專 業(yè) 空間信息與數(shù)字技術(shù)   班 級(jí) 空數(shù)131 學(xué) 號(hào) 1307010160、1307010177、1307010179、1307010182 姓 名 吳廷友、佘艷云、周志妹、晏子先 實(shí)驗(yàn)時(shí)間: 2015年11月5日 一、 實(shí)驗(yàn)?zāi)康模?.熟悉棧的表示和實(shí)現(xiàn)方法,基于相應(yīng)的表示實(shí)現(xiàn);2.基于棧的各種操作,做一個(gè)簡(jiǎn)單的計(jì)算機(jī)軟件。3.掌握棧各種操作,并能進(jìn)行迷宮求解;二、 實(shí)驗(yàn)環(huán)境:軟件環(huán)境:Windows XP,VC +;硬件環(huán)境:XXX計(jì)算機(jī);三、 實(shí)驗(yàn)要求與提示:要求:1. 實(shí)現(xiàn)棧的初始化、入棧和出棧等基本操作。2. 基

2、于棧的各種操作,以及棧的表示和存儲(chǔ),設(shè)計(jì)一個(gè)簡(jiǎn)單的計(jì)算器應(yīng)用程序。該程序能夠?qū)崿F(xiàn)計(jì)算一個(gè)表達(dá)式的值,例如能夠計(jì)算類似于2.5+(3.1-1.3)*6這一類的表達(dá)式的值。最后要求使用圖形化界面程序,將計(jì)算器應(yīng)用程序打包成一個(gè).exe文件。提示:基于棧的操作,計(jì)算表達(dá)式的值的算法思想: 1.對(duì)棧進(jìn)行初始化操作;2.分別將表達(dá)式的值和符號(hào)放入兩個(gè)棧,通過(guò)四則運(yùn)算的優(yōu)先級(jí)進(jìn)行算法設(shè)計(jì)。即:若一個(gè)表達(dá)式為2.5+3.2*1.4,將數(shù)值和符號(hào)分別同時(shí)入棧,當(dāng)遇到乘法時(shí),就將棧頂元素以及棧頂元素的上一個(gè)元素進(jìn)行出棧操作,然后將計(jì)算結(jié)果再入棧。圖形化界面程序需要利用C+來(lái)實(shí)現(xiàn),VC6.0中的MFC就是用來(lái)開(kāi)發(fā)

3、圖形化界面的。四、 算法設(shè)計(jì)及源碼分析#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 10#define STACKINCREMENT 10char op7='+','-','*','/','(',')','n'/運(yùn)算符集合typedef struct /定義操作符結(jié)構(gòu)體int *base;int *top;int stacksize;SqStack;typedef struct /定義操作

4、數(shù)結(jié)構(gòu)體double *base;double *top;int stacksize;DoubleStack;void InitStack(SqStack *s)/構(gòu)造一個(gè)裝操作符的空棧s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int);s->top=s->base;s->stacksize=STACK_INIT_SIZE;void InitDoubleStack(DoubleStack *s)/構(gòu)造一個(gè)裝操作數(shù)的空棧s->base=(double *)malloc(STACK_INIT_SIZE*sizeof(do

5、uble);s->top=s->base;s->stacksize=STACK_INIT_SIZE;char GetTop(SqStack *s) /返回線頂元素if(s->top=s->base)printf("棧為空!");return;return *(s->top-1);double GetTopDouble(DoubleStack *s)if(s->top=s->base)printf("棧為空!");return 0;return *(s->top-1);void Push(SqStack

6、 *s,int e)/操作符的入棧的函數(shù)if(s->top-s->base>=s->stacksize)s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int);s->top=s->base+s->stacksize;s->stacksize+=STACKINCREMENT;*(s->top)=e;s->top+;void PushDouble(DoubleStack *s,double e)/操作數(shù)的入棧的函數(shù)if(s->

7、top-s->base>=s->stacksize)s->base=(double *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(double);s->top=s->base+s->stacksize;s->stacksize+=STACKINCREMENT;*(s->top)=e;s->top+;void Pop(SqStack *s,int *e)/操作符的出棧的函數(shù)if(s->top=s->base)printf("棧為空!&quo

8、t;);return;s->top-;*e=*(s->top);void PopDouble(DoubleStack *s,double *e)/操作數(shù)的出棧的函數(shù)if(s->top=s->base)printf("棧為空!");return;s->top-;*e=*(s->top);int In(char c)/判斷是否是運(yùn)算符,如果是反回1,不是則返回0;int i;for(i=0;i<8;i+)if(c=opi)return 1;return 0;char Precede(char charGetTop,char c)/判斷運(yùn)

9、算符的優(yōu)先級(jí)switch (charGetTop)case '+':switch (c)case '+':return '>'case '-':return '>'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '>'case 'n':ret

10、urn '>'break;case '-':switch (c)case '+':return '>'case '-':return '>'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '>'case 'n':retu

11、rn '>'break;case '*':switch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case '(':return '<'case ')':return '>'case 'n':retur

12、n '>'break;case '/':switch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case '(':return '<'case ')':return '>'case 'n':return

13、 '>'break;case '(':switch (c)case '+':return '<'case '-':return '<'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '='break;case ')':swit

14、ch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case ')':return '>'case 'n':return '>'break;case 'n':switch (c)case '+':return '<

15、'case '-':return '<'case '*':return '<'case '/':return '<'case '(':return '<'case 'n':return '='break;double Operate(double a,char theta,double b)switch(theta)case '+':return (a+b);case '-'

16、;:return (a-b);case '*':return (a*b);case '/':return (a/b);void main()SqStack optr,temp;DoubleStack opnd;char c;char x,theta;int n,y=0,i;double m=0,a,b;InitStack(&optr);Push(&optr,'n');/初始化運(yùn)算符棧InitDoubleStack(&opnd);InitStack(&temp);c=getchar();while(GetTop(&a

17、mp;optr)!='n'|c!='n')if(!In(c)Push(&temp,(c-'0');c=getchar();elseif(temp.top!=temp.base)y=0;m=0;while(temp.top!=temp.base)Pop(&temp,&n);for(i=0;i<y;i+)n=n*10;m+=n;y+;PushDouble(&opnd,m);switch(Precede(GetTop(&optr),c)case '<':Push(&optr,c

18、);c=getchar();break;case '=':Pop(&optr,&x);c=getchar();break;case '>':Pop(&optr,&theta);PopDouble(&opnd,&b);PopDouble(&opnd,&a);PushDouble(&opnd,Operate(a,theta,b);break;printf("%fn",GetTopDouble(&opnd);getchar();五、 實(shí)驗(yàn)結(jié)果:隨便輸入一個(gè)表達(dá)式然后得到運(yùn)行結(jié)果如下六、 實(shí)驗(yàn)收獲:本實(shí)驗(yàn)以C語(yǔ)言的棧的相關(guān)知識(shí)為基礎(chǔ),通過(guò)控制兩個(gè)棧(運(yùn)算數(shù)棧和運(yùn)算符棧)的進(jìn)出的棧操作,來(lái)實(shí)現(xiàn)對(duì)包含加、減、乘、除、括號(hào)運(yùn)算符任意整型表達(dá)式的求解運(yùn)算。從程序的編寫(xiě)來(lái)看,感覺(jué)這次我們真的學(xué)到了好多,特別是對(duì)程序的開(kāi)發(fā)流程。從最初的選定程序,到最終的程序運(yùn)行成功,讓我們感到如果是僅僅掌握課本上的知識(shí)是遠(yuǎn)遠(yuǎn)不能夠很好的應(yīng)用到實(shí)際的編程中去的。在這個(gè)過(guò)程中還

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論