簡(jiǎn)單的四則運(yùn)算計(jì)算器程序_第1頁(yè)
簡(jiǎn)單的四則運(yùn)算計(jì)算器程序_第2頁(yè)
簡(jiǎn)單的四則運(yùn)算計(jì)算器程序_第3頁(yè)
簡(jiǎn)單的四則運(yùn)算計(jì)算器程序_第4頁(yè)
簡(jiǎn)單的四則運(yùn)算計(jì)算器程序_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、簡(jiǎn)單的四則運(yùn)算計(jì)算器程序?qū)嶒?yàn)?zāi)康呐c要求:目的:1、掌握類(lèi)、構(gòu)造函數(shù)/析構(gòu)函數(shù)、棧等概念,掌握字符串操作;2、步了解類(lèi)的設(shè)計(jì)方法,初步了解詞法分析、表達(dá)式求值的算符優(yōu)先算法等內(nèi)容。要求:以接收由鍵盤(pán)輸入的整數(shù)四則運(yùn)算表達(dá)式(由整數(shù)和加、減、乘、除、圓括號(hào)組成),計(jì)算出該表達(dá)式的值,然后輸出結(jié)果。方法、步驟:設(shè)計(jì)2個(gè)棧,分別用于存放操作數(shù)和操作符,其中操作符有優(yōu)先級(jí)。棧內(nèi)存放的操作數(shù)用一個(gè)類(lèi)名為Operand的類(lèi)存放;操作符用Operator類(lèi)存放,并且設(shè)置相應(yīng)運(yùn)算符的優(yōu)先級(jí)。將用戶(hù)輸入的整個(gè)四則運(yùn)算表達(dá)式字符串可看作由操作數(shù),運(yùn)算符和左右括弧()組成的字符串,并用事先定義的操作數(shù)類(lèi)、操作符類(lèi)來(lái)表

2、示相應(yīng)的對(duì)象。用一個(gè)叫分析器的類(lèi)(Analyzer)對(duì)輸入的四則運(yùn)算進(jìn)行分析掃描,每次返回一個(gè)字符串;定義一個(gè)名為calculate的函數(shù)將Analyzer的靜態(tài)方法返回的字符串構(gòu)造為相應(yīng)的對(duì)象,放入各自的棧,并利用四則運(yùn)算規(guī)則,計(jì)算相應(yīng)的結(jié)果。calculate函數(shù)利用四則運(yùn)算的規(guī)則:乘、除優(yōu)先級(jí)高于加、減,放入操作符棧的規(guī)則為:1、操作符棧里符號(hào)進(jìn)棧規(guī)則是,后進(jìn)棧的操作符優(yōu)先級(jí)必須高于已經(jīng)進(jìn)棧符號(hào)的優(yōu)先級(jí),比方如果接收的操作符優(yōu)先級(jí)等于或小于(=)棧頂操作符優(yōu)先級(jí),則先對(duì)棧頂操作符進(jìn)行出棧,運(yùn)算;再將后面的操作符入棧保存。這樣保證操作符棧里符號(hào)優(yōu)先級(jí)為由低到高,符合優(yōu)先級(jí)高的操作符先出棧,

3、參與運(yùn)算的規(guī)則。2、遇到左括弧“(”時(shí),先將左括弧“(”進(jìn)棧,當(dāng)掃描到右括弧“)”時(shí)候,取操作符棧運(yùn)算符出棧計(jì)算,直到棧頂為左括弧為止。3、分析完輸入字符串后,全部計(jì)算完成,計(jì)算結(jié)果便從操作數(shù)棧中取出。實(shí)驗(yàn)過(guò)程及內(nèi)容:實(shí)驗(yàn)中整個(gè)用一個(gè)名為sizheyunsuan.cpp的C+源文件。詳細(xì)過(guò)程見(jiàn)附件程序清單。該源文件中相關(guān)類(lèi)的成員變量以及成員函數(shù)如下所示:類(lèi):Operand:操作數(shù)類(lèi),包含私有成員operS,表示操作數(shù)的數(shù)值。Operator:操作符類(lèi),包含私有成員operF,priority,分別表示操作符的符號(hào),以及運(yùn)算優(yōu)先級(jí)。template class STACK:用于存放操作數(shù)和操作符

4、的棧Analyzer:字符串掃描分析類(lèi),包含靜態(tài)函數(shù)analysis(char *str,unsigned int& mark,char *returns)函數(shù):void calculate(char *temp,STACK& sOperator,STACK& sOperand):對(duì)掃描返回的字符串分析,構(gòu)造相應(yīng)的對(duì)象,并依照運(yùn)算規(guī)則進(jìn)行計(jì)算。void main():程序主函數(shù)。對(duì)象以及變量:STACK sOperator:存放操作數(shù)的棧STACK sOperand:存放操作符的棧Analyzer analyzer:掃描分析器char Str_inputMAX:存放用戶(hù)輸入的四則表達(dá)式char

5、 temp12:存放分析器返回的字符串unsigned int mark:“游標(biāo)”的作用,標(biāo)示分析器每一次調(diào)用分析操作對(duì)應(yīng)的輸入字符串的位置。運(yùn)算結(jié)果圖示:(2+5)*3-4*6+5)/2+10-6*(3-1)數(shù)據(jù)處理分析:1、 接收用戶(hù)輸入,并作檢查,判斷用戶(hù)是否正確輸入。2、如果輸入正確,則進(jìn)行計(jì)算:計(jì)算過(guò)程,跟蹤棧出入結(jié)果,表達(dá)式分析如下圖:(見(jiàn)下一頁(yè))計(jì)算過(guò)程,跟蹤棧出入結(jié)果,表示如下:結(jié)果驗(yàn)證,計(jì)算結(jié)果正確實(shí)驗(yàn)結(jié)論:上述的“四則運(yùn)算表達(dá)式”算法可以計(jì)算任意正整數(shù)的四則運(yùn)算表達(dá)式,輸入的原始表達(dá)式中的操作數(shù)只能為正整數(shù)、或者負(fù)數(shù)用2元表達(dá)式的形式,比方(-2)用(0-2)代替,操作符包

6、含加、減、乘、除和括號(hào)。原始表達(dá)式的長(zhǎng)度100個(gè)字符(比這個(gè)長(zhǎng)的表達(dá)式,不多了吧),但必須符合正整數(shù)“四則運(yùn)算表達(dá)式”的運(yùn)算法則。指導(dǎo)教師批閱意見(jiàn):成績(jī)?cè)u(píng)定: 指導(dǎo)教師簽字: 年 月 日備注:注:1、報(bào)告內(nèi)的項(xiàng)目或內(nèi)容設(shè)置,可根據(jù)實(shí)際情況加以調(diào)整和補(bǔ)充。 2、教師批改學(xué)生實(shí)驗(yàn)報(bào)告時(shí)間應(yīng)在學(xué)生提交實(shí)驗(yàn)報(bào)告時(shí)間后10日內(nèi)。附件:程序源代碼/ sizheyunsuan.cpp : Defines the entry point for the console application.#include#includeconst int MAX=100;class Operandprivate:doub

7、le operS;public:Operand()Operand(double opers)operS=opers;void set(double opers)operS=opers;double get()return operS;class Operatorprivate:char operF;int priority;public:Operator()Operator(char operf)operF=operf;switch(operf)case(:priority=-1;break;case+:priority=0;break;case-:priority=0;break;case*

8、:priority=1;break;case/:priority=1;break;case):priority=2;break;void set(char operf)operF=operf;char get()return operF;int getpriority()return priority;template class STACK /定義棧類(lèi) private: Type baseMAX; int Size; public: STACK()Size=0; void push(Type a) baseSize=a; Size+; Type pop() return base-Size;

9、Type getTop()return baseSize-1;int size()return Size;class Analyzerpublic:static int analysis(char *str,unsigned int& mark,char *returns)int i=0;if(strmark=(|strmark=)|strmark=*|strmark=+|strmark=-|strmark=/)returns0=strmark+;return 0;else if(int(strmark)=48&int(strmark)=48&int(strmark)=57;)returnsi

10、+=strmark+;returnsi=0;return 0;void calculate(char *temp,STACK& sOperator,STACK& sOperand)if(temp0=(|temp0=)|temp0=*|temp0=+|temp0=-|temp0=/)/cout符號(hào):temp0;/-/calculate計(jì)算char ch=temp0;double a,b;if(ch=()Operator oper();sOperator.push(oper);/cout符號(hào):sOperator.getTop().get()入棧n;else if(ch=)while(sOperat

11、or.getTop().getpriority()!=-1)b=sOperand.pop().get();a=sOperand.pop().get();switch(sOperator.pop().get()case *:a=a*b;break;case /:if(b=0)cout程序錯(cuò)誤,0作為除數(shù)出現(xiàn)!;elsea=a/b;break;case +:a=a+b;break;case -:a=a-b;break;default:break;Operand oper(a);sOperand.push(oper);/cout計(jì)算,并將結(jié)果壓:sOperand.getTop().get()入棧n;

12、/cout0&(sOperator.getTop().getpriority()=1|sOperator.getTop().getpriority()=0)b=sOperand.pop().get();a=sOperand.pop().get();switch(sOperator.pop().get()case *:a=a*b;break;case /:if(b=0)cout程序錯(cuò)誤,0作為除數(shù)出現(xiàn)!;elsea=a/b;break;case +:a=a+b;break;case -:a=a-b;break;default:break;Operand oper(a);sOperand.push

13、(oper);/cout計(jì)算,并將結(jié)果壓:sOperand.getTop().get()入棧n;/cout計(jì)算1次n;Operator oper(ch);sOperator.push(oper);/cout符號(hào):sOperator.getTop().get()0&(sOperator.getTop().getpriority()=1)b=sOperand.pop().get();a=sOperand.pop().get();switch(sOperator.pop().get()case *:a=a*b;break;case /:if(b=0)cout程序錯(cuò)誤,0作為除數(shù)出現(xiàn)!;elsea=a

14、/b;break;default:break;Operand oper(a);sOperand.push(oper);/cout計(jì)算,并將結(jié)果壓:sOperand.getTop().get()入棧n;/cout計(jì)算1次n;Operator oper(ch);sOperator.push(oper);/cout符號(hào):sOperator.getTop().get()入棧n;/-elseint t=0;for(unsigned int i=0;istrlen(temp);i+)t=t*10+int(tempi)-48);double a=double(t);Operand operS(a);sOpe

15、rand.push(operS);/cout操作數(shù)數(shù):sOperand.getTop().get()入棧n;void main()char Str_inputMAX;char temp12;unsigned int mark=0;STACK sOperator;STACK sOperand;Analyzer analyzer;/docout該程序功能為根據(jù)表達(dá)式進(jìn)行計(jì)算。n 可以實(shí)現(xiàn)的計(jì)算為帶括弧()的加減乘除四則運(yùn)算,n 在下方輸入處輸入表達(dá)式,以回車(chē)結(jié)束。n;for(int y=0;y12;y+)tempy=0;for(int m=0;mStr_input;coutn;for(unsign

16、ed int n = 0;nstrlen(Str_input);n+ )coutStr_inputn;coutn;for(unsigned int i = 0;istrlen(Str_input);i+ )if(!(int(Str_inputi)=48)|Str_inputi=(|Str_inputi=)|Str_inputi=*|Str_inputi=+|Str_inputi=-|Str_inputi=/)cout輸入字符串有非法字符,請(qǐng)重新輸入:n;break;for(;markstrlen(Str_input);)for(int y=0;y0;)double a,b;b=sOperand.pop().get();a=sOperand.pop().get();switch(sOperator.pop().get()case *:a=a*b;break;case /:if(b=0)cout程序

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論