版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上 本科實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱(chēng): 計(jì)算器 課程名稱(chēng):數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)時(shí)間:任課教師:實(shí)驗(yàn)地點(diǎn):良鄉(xiāng)機(jī)房實(shí)驗(yàn)教師:實(shí)驗(yàn)類(lèi)型: 原理驗(yàn)證 綜合設(shè)計(jì) 自主創(chuàng)新學(xué)生姓名:學(xué)號(hào)/班級(jí):組 號(hào):學(xué) 院:同組搭檔:專(zhuān) 業(yè):成 績(jī):一、 實(shí)驗(yàn)?zāi)康?、熟悉VC環(huán)境,學(xué)習(xí)使用C語(yǔ)言實(shí)現(xiàn)鏈表的存儲(chǔ)結(jié)構(gòu)。 2、通過(guò)編程、上機(jī)調(diào)試,進(jìn)一步理解線(xiàn)性表、鏈表、棧的基本概念,并了解進(jìn)棧,退棧和運(yùn)用棧的思想解決問(wèn)題的能力。3、鍛煉動(dòng)手編程,獨(dú)立思考的能力。二、實(shí)驗(yàn)題目簡(jiǎn)易計(jì)算器(棧)(1)問(wèn)題描述通過(guò)模擬一個(gè)簡(jiǎn)單的計(jì)算器來(lái)進(jìn)行+、-、*、/、%、(乘方)等運(yùn)算,從鍵盤(pán)上輸入一算術(shù)表達(dá)式(一般為中綴表達(dá)式),計(jì)算出
2、表達(dá)式的值。(2)基本要求編寫(xiě)程序,要求可對(duì)一實(shí)數(shù)算術(shù)表達(dá)式進(jìn)行簡(jiǎn)單的數(shù)學(xué)運(yùn)算??梢宰R(shí)別帶加減乘除等運(yùn)算符及括號(hào)的中綴表達(dá)式。a. 按照四則運(yùn)算規(guī)則,求表達(dá)式的值。一般規(guī)則如下:1)先括號(hào)內(nèi),再括號(hào)外。2)先乘方,再乘除,后加減。b. 同級(jí)運(yùn)算從左到右順序執(zhí)行。c如表達(dá)式有誤,應(yīng)給出相應(yīng)的提示信息。(3)數(shù)據(jù)結(jié)構(gòu)與算法分析解決表達(dá)式求值問(wèn)題的方法之一是:第一步將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,第二步按后綴表達(dá)式求值。解題時(shí)可以結(jié)合字符串的相關(guān)知識(shí)。(4)測(cè)試 4.5+5+6.5*1.06=16.39三、實(shí)驗(yàn)基礎(chǔ)知識(shí) 線(xiàn)性表、鏈表、棧的基本概念的熟練掌握并實(shí)際運(yùn)用。并了解進(jìn)棧,退棧和運(yùn)用棧的思想解決
3、問(wèn)題的能力四、實(shí)驗(yàn)設(shè)計(jì)方法1、概要設(shè)計(jì) InitStack(OPTR); Push(OPTR,'#');initStack(OPND); c=getchar();while(c!='#'|GetTop(OPTR)!='#')if(!In(c,OP)Push(OPND,c);c=getchar(); /不是運(yùn)算符則進(jìn)棧 else switch(Precede(GetTop(OPTR),c) case '<': /棧頂元素優(yōu)先級(jí)低 Push(OPTR,c); c = getchar();break;case '='
4、;: /脫括號(hào)并接受下一字符 Pop(OPTR,x); c = getchar();break;case '>': /退棧并將運(yùn)算結(jié)果入棧 Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND, Operate(a,theta,b); break; /switch/return GetTop(OPND);4.詳細(xì)設(shè)計(jì):(1) 棧的建立#define STACK_INIT_SIZE100#defineSTACKINCREMENT10#defineTempLen20#define ERROR0#define OK1#defi
5、ne TRUE 1#define FALSE0#include<stdio.h>#include<stdlib.h>#include<math.h>typedef intcount;typedef double opndElem;typedef char optrElem;typedef struct/運(yùn)算符棧optrElem *base;optrElem *top;int stacksize;SqStack_OPTR;typedef struct/運(yùn)算數(shù)棧opndElem *base;opndElem *top;int stacksize;SqStack_
6、OPND;建立頭文件,建立算數(shù)棧和算符棧,可以考慮使用算符優(yōu)先算法來(lái)實(shí)現(xiàn)運(yùn)算。(2) 主函數(shù)main()SqStack_OPTR A;SqStack_OPND B;InitStack_OPTR(A);InitStack_OPND(B);Push_OPTR(A,'=');printf("* n");printf("n");printf(" 簡(jiǎn)易計(jì)算器 n");printf("n");printf("*n");printf("nn請(qǐng)輸入算式,以'='結(jié)束:n
7、");Output(A,B);if(error=0)printf("%lfn",B.base0);return OK;進(jìn)行表達(dá)式的輸入,輸出菜單頁(yè)面給予使用方法的提示,調(diào)用子函數(shù)并用判斷變量error完成計(jì)算,輸出結(jié)果。(3) 判斷優(yōu)先級(jí)子函數(shù)char Precede(optrElem a,optrElem b)/判斷a和b優(yōu)先級(jí)的高低,返回'>','<','='switch(a) case '+': switch(b) case '*': case '/'
8、: case '(': case '': case '%': return '<'break;default: return '>' break; break; case '-': switch(b) case '*': case '/': case '(':case '': case '%': return '<' break; default: return '>
9、9; break; break; case '*': switch(b) case '(': case '': case '%': return '<' break; default: return '>' break; break; case '/': switch(b) case '(': case '': case '%': return '<' break; default: return
10、39;>' break; break; case '(': switch(b) case ')': return '=' break; default: return '<' break; break; case ')': switch(b) default: return '>' break; break; case '=': switch(b) case '=': return '=' break; default: re
11、turn '<' break; break; case '': switch(b) case '(': return '<' break; default: return '>' break;break;case '%': switch(b) case '(': case '': return '<' break; default: return '>' break;break; default: retu
12、rn '<' break;調(diào)用switch語(yǔ)句進(jìn)行運(yùn)算優(yōu)先級(jí)的判斷,從而確定運(yùn)算順序。(4) 運(yùn)算子函數(shù)double Operate(opndElem a,optrElem theta,opndElem b)/對(duì)操作數(shù)a,b進(jìn)行theta運(yùn)算 double rs_i; switch(theta) case '+': rs_i=a+b; break; case '-': rs_i=a-b; break; case '*': rs_i=a*b; break; case '/': if(b=0) printf(&q
13、uot;錯(cuò)誤!除數(shù)為0!n"); error=1; exit(0); rs_i=a/b; break; case '':rs_i=pow(a,b);break;case '%':if(a != (int)a|b!=(int)b)printf("錯(cuò)誤!取余為整數(shù)!n");error=1;rs_i=(int)a%(int)b; break; default: printf("Is not a operator.n"); break; return rs_i; 運(yùn)用switch語(yǔ)句進(jìn)行運(yùn)算符的分類(lèi),case語(yǔ)句中包含運(yùn)
14、算符的運(yùn)算規(guī)律,方便函數(shù)調(diào)用。(3)、模塊調(diào)用關(guān)系: 由主函數(shù)模塊調(diào)用創(chuàng)建模塊,查找模塊與計(jì)算模塊。 由計(jì)算模塊將結(jié)果輸出。五、實(shí)驗(yàn)結(jié)果及數(shù)據(jù)分析1、4.5+5+6.5*1.06=16.39數(shù)據(jù)完全正確2、次方運(yùn)算2.132=4.5369數(shù)據(jù)完全正確3、混合運(yùn)算2+(2.5+2.32)*3-5=20.37結(jié)果完全正確六、總結(jié) 此次編程實(shí)驗(yàn),讓我了解到全面思考的重要性,再開(kāi)始的程序設(shè)計(jì)中,我只考慮了加減乘除和括號(hào)這幾種最簡(jiǎn)單的四則運(yùn)算,但是沒(méi)有考慮小數(shù),平方等較為復(fù)雜的計(jì)算,在花費(fèi)了大量時(shí)間將先前考慮的四則運(yùn)算編寫(xiě)完成并調(diào)試通過(guò)后,發(fā)現(xiàn)計(jì)算器的應(yīng)用范圍非常小,不實(shí)用,于是重新大量改寫(xiě)代碼,又花費(fèi)
15、了大量時(shí)間。倘若在剛開(kāi)始就考慮到這些問(wèn)題,就省去了后來(lái)改代碼的這一步繁瑣的操作,節(jié)省大量時(shí)間。以后要多加注意。七、附錄 程序清單#define STACK_INIT_SIZE100#defineSTACKINCREMENT10#defineTempLen20#define ERROR0#define OK1#define TRUE 1#define FALSE0#include<stdio.h>#include<stdlib.h>#include<math.h>typedef intcount;typedef double opndElem;typedef
16、char optrElem;typedef struct/運(yùn)算符棧optrElem *base;optrElem *top;int stacksize;SqStack_OPTR;typedef struct/運(yùn)算數(shù)棧opndElem *base;opndElem *top;int stacksize;SqStack_OPND;int error=0;int InitStack_OPTR(SqStack_OPTR &S)/初始化運(yùn)算符空棧S.base=(optrElem*)malloc(STACK_INIT_SIZE*sizeof(optrElem);if(!S.base) exit(-
17、1);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;int InitStack_OPND(SqStack_OPND &S)/初始化運(yùn)算數(shù)空棧S.base=(opndElem*)malloc(STACK_INIT_SIZE*sizeof(opndElem);if(!S.base) exit(-1);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;int Push_OPTR(SqStack_OPTR &S,optrElem e)/插入運(yùn)算符元素e至運(yùn)算符棧頂if(S.top
18、-S.base>=S.stacksize)S.base=(optrElem*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(optrElem);if(!S.base) exit(-1);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;int Push_OPND(SqStack_OPND &S,opndElem e)/插入運(yùn)算數(shù)元素e至棧頂 if(S.top-S.base>=S.stacksize)S.base=(opndE
19、lem*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(opndElem);if(!S.base) exit(-1);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;int Pop_OPTR(SqStack_OPTR &S,optrElem &e)/刪除運(yùn)算符棧頂元素,返回其值 if(S.top=S.base) return ERROR;e=*-S.top;return OK;int Pop_OPND(SqStack_OPND
20、 &S,opndElem &e)/刪除運(yùn)算數(shù)棧頂元素,返回其值 if(S.top=S.base) return ERROR;e=*-S.top;return OK;char GetTop_OPTR(SqStack_OPTR &S)/取棧運(yùn)算符頂元素 if(S.top=S.base) return ERROR;return *(S.top-1);char GetTop_OPND(SqStack_OPND &S)/取棧運(yùn)算數(shù)頂元素 if(S.top=S.base) return ERROR;return *(S.top-1);int Isoperator(optrE
21、lem e)/判斷e是否是一個(gè)運(yùn)算操作符 switch(e)case '+': case '-': case '*': case '/': case '(': case ')': case '=':case '':case '%': return TRUE; break; default: return FALSE; break;char Precede(optrElem a,optrElem b)/判斷a和b優(yōu)先級(jí)的高低,返回'>
22、9;,'<','='switch(a) case '+': switch(b) case '*': case '/': case '(': case '': case '%': return '<'break;default: return '>' break; break; case '-': switch(b) case '*': case '/': case
23、9;(':case '': case '%': return '<' break; default: return '>' break; break; case '*': switch(b) case '(': case '': case '%': return '<' break; default: return '>' break; break; case '/': switch(b)
24、 case '(': case '': case '%': return '<' break; default: return '>' break; break; case '(': switch(b) case ')': return '=' break; default: return '<' break; break; case ')': switch(b) default: return '>
25、39; break; break; case '=': switch(b) case '=': return '=' break; default: return '<' break; break; case '': switch(b) case '(': return '<' break; default: return '>' break;break;case '%': switch(b) case '(': ca
26、se '': return '<' break; default: return '>' break;break; default: return '<' break;double Operate(opndElem a,optrElem theta,opndElem b)/對(duì)操作數(shù)a,b進(jìn)行theta運(yùn)算 double rs_i; switch(theta) case '+': rs_i=a+b; break; case '-': rs_i=a-b; break; case
27、9;*': rs_i=a*b; break; case '/': if(b=0) printf("錯(cuò)誤!除數(shù)為0!n"); error=1; exit(0); rs_i=a/b; break; case '':rs_i=pow(a,b);break;case '%':if(a != (int)a|b!=(int)b)printf("錯(cuò)誤!取余為整數(shù)!n");error=1;rs_i=(int)a%(int)b; break; default: printf("Is not a operator.n"); break; return rs_i; int Output(SqStac
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度廣告公司與廣告主之間的廣告發(fā)布合同2篇
- 二零二五年度房產(chǎn)買(mǎi)賣(mài)合同10(附帶車(chē)位)3篇
- 2025版鍋爐設(shè)備報(bào)廢回收買(mǎi)賣(mài)合同范本及處理流程3篇
- 2025年協(xié)議離婚財(cái)產(chǎn)分割執(zhí)行與婚姻關(guān)系終止全程服務(wù)合同3篇
- 二零二五年度家庭健康體檢與評(píng)估合同3篇
- 二零二五年度康師傅飲品系列產(chǎn)品定制加工及全球銷(xiāo)售合同3篇
- 二零二五年度出口貿(mào)易合同的國(guó)際貿(mào)易人才培養(yǎng)與合作開(kāi)發(fā)協(xié)議2篇
- 海南職業(yè)技術(shù)學(xué)院《電力電子數(shù)字控制》2023-2024學(xué)年第一學(xué)期期末試卷
- 海南衛(wèi)生健康職業(yè)學(xué)院《微納加工與制造》2023-2024學(xué)年第一學(xué)期期末試卷
- 海南外國(guó)語(yǔ)職業(yè)學(xué)院《建筑與規(guī)劃設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 陜西2020-2024年中考英語(yǔ)五年真題匯編學(xué)生版-專(zhuān)題09 閱讀七選五
- 多源數(shù)據(jù)融合平臺(tái)建設(shè)方案
- 2023-2024學(xué)年上海市普陀區(qū)三年級(jí)(上)期末數(shù)學(xué)試卷
- 居家養(yǎng)老上門(mén)服務(wù)投標(biāo)文件
- 浙江省寧波市鄞州區(qū)2024年七年級(jí)上學(xué)期期末數(shù)學(xué)試題【含答案】
- 浙江省杭州市錢(qián)塘區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期語(yǔ)文期末試卷
- 《聞泰科技并購(gòu)安世半導(dǎo)體的風(fēng)險(xiǎn)應(yīng)對(duì)案例探析》8200字(論文)
- 肝斷面引流管護(hù)理
- GB/T 44713-2024節(jié)地生態(tài)安葬服務(wù)指南
- 2024年形勢(shì)與政策 第一講《讀懂中國(guó)式現(xiàn)代化》
- 2024-2025學(xué)年蘇教版四年級(jí)上冊(cè)期末自主測(cè)試數(shù)學(xué)試卷(一)(含答案解析)
評(píng)論
0/150
提交評(píng)論