C計(jì)算器程序課程設(shè)計(jì)_第1頁(yè)
C計(jì)算器程序課程設(shè)計(jì)_第2頁(yè)
C計(jì)算器程序課程設(shè)計(jì)_第3頁(yè)
C計(jì)算器程序課程設(shè)計(jì)_第4頁(yè)
C計(jì)算器程序課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(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、荊楚理工學(xué)院課程設(shè)計(jì)成果 學(xué)院: 計(jì)算機(jī)工程學(xué)院 班 級(jí): 14計(jì)算機(jī)科學(xué)與技術(shù)<2>班 學(xué)生姓名: 楊?lèi)?學(xué) 號(hào): 設(shè)計(jì)地點(diǎn)(單位): 設(shè)計(jì)題目: 模擬計(jì)算器程序 完成日期: 2016 年 6 月 30 日 指導(dǎo)教師評(píng)語(yǔ): _成績(jī)(五級(jí)記分制): 教師簽名: 目 錄1 設(shè)計(jì)任務(wù)11.1設(shè)計(jì)目的11.2設(shè)計(jì)內(nèi)容11.3設(shè)計(jì)指標(biāo)或者要求12 設(shè)計(jì)過(guò)程12.1程序功能12.2程序流程圖33軟件運(yùn)行或者測(cè)試結(jié)果44 軟件設(shè)計(jì)過(guò)程中遇到的問(wèn)題以及解決辦法65 總結(jié)6參考文獻(xiàn)6附錄(程序源代碼)71 設(shè)計(jì)任務(wù)1.1設(shè)計(jì)目的運(yùn)用所學(xué)C+知識(shí),完成模擬計(jì)算器程序,通過(guò)實(shí)踐加強(qiáng)對(duì)所學(xué)知識(shí)的理解和鞏

2、固。1.2設(shè)計(jì)內(nèi)容設(shè)計(jì)一個(gè)程序來(lái)模擬一個(gè)簡(jiǎn)單的手持計(jì)算器。程序支持冪運(yùn)算、算術(shù)運(yùn)算+、-、*、/、=、以及Black(清除)、Esc(全清除)等操作。1.3設(shè)計(jì)指標(biāo)或者要求程序運(yùn)行時(shí),顯示一個(gè)窗口,等待用戶輸入,用戶可以從鍵盤(pán)輸入要計(jì)算的表達(dá)式,輸入的表達(dá)式顯示在窗口中,用戶鍵入“=” 符號(hào)回車(chē)后,窗口顯示出結(jié)果。2 設(shè)計(jì)過(guò)程通過(guò)對(duì)微軟附件計(jì)算器軟件進(jìn)行調(diào)研、分析,研究,使用。我們了解到了作為一個(gè)計(jì)算器所應(yīng)該的一些簡(jiǎn)單功能,我們知道了怎樣使編寫(xiě)的計(jì)算器程序向微軟附件計(jì)算器靠攏。其中計(jì)算器軟件的主要功能是: 1)可以進(jìn)行加減乘除四則運(yùn)算2)可以實(shí)現(xiàn)科學(xué)計(jì)算器的部分計(jì)算功能3)可以進(jìn)行清

3、零運(yùn)算 4)可以進(jìn)行退格鍵運(yùn)算 5)可以進(jìn)行連續(xù)計(jì)算2.1程序功能void menu();/位于calculate函數(shù)后面的菜單函數(shù)聲明void guide();/位于主函數(shù)后面的指導(dǎo)函數(shù)的聲明double D_Operate(double x,char op,double y)/雙目運(yùn)算符的運(yùn)算定義double S_Operate(char op,double x)/前綴單目運(yùn)算符的運(yùn)算定義char Precede(char op1,char op2) /判斷符號(hào)的優(yōu)先級(jí) op1在返回的結(jié)果符的左邊 op2在右邊/用于判定運(yùn)算符的優(yōu)先級(jí) 以決定是把運(yùn)算符壓棧 還是把棧內(nèi)的

4、運(yùn)算符彈出來(lái)進(jìn)行計(jì)算int match(string s)/棧結(jié)構(gòu)的括號(hào)匹配檢測(cè)函數(shù)class NUMstack/運(yùn)算數(shù)棧 void start()/初始化棧清空棧頂指針置底 for(int i=0;i<1000;i+) numi=0; top=0; class OPERstack/運(yùn)算符棧 public: char oper1000; int top; void start()/初始化函數(shù)棧清空棧底放一"="用于判定算式結(jié)束 oper0='=' for(int i=1;i<1000;i+) operi=NULL; top=1;/棧頂指針置于棧底

5、的上一位 void calculate(string equation)/算式計(jì)算函數(shù)(關(guān)鍵函數(shù)) NUMstack number;/定義運(yùn)算數(shù)棧變量number OPERstack oper;/定義運(yùn)算符棧變量oper number.start(); oper.start();/把兩個(gè)棧初始化number.numnumber.top=tt;/運(yùn)算結(jié)果壓回原來(lái)yuan1在棧內(nèi)的位置 number.lift();/提升指針 temp1=oper.getTop(); rep=Precede(temp1,temp2);/再判優(yōu)先級(jí)rep=Precede(temp1,temp2);/雙目運(yùn)算符的計(jì)算i

6、f(number.num0=ceil(number.num0) cout<<equation<<number.num0<<endl; else cout<<equation<<fixed<<setprecision(8)<<number.num0<<endl;/輸出結(jié)果控制精度8位小數(shù) /調(diào)試時(shí)檢查運(yùn)算結(jié)束后站內(nèi)情況的代碼段void menu()/菜單函數(shù) cin>>go_on;/可以循環(huán)進(jìn)行算式計(jì)算運(yùn)行程序2.2程序流程圖進(jìn)入界面,輸入第一個(gè)操作數(shù)輸入“=”鍵,輸出運(yùn)算結(jié)果選擇計(jì)算算式

7、選擇,進(jìn)行運(yùn)算根據(jù)所選功能,選擇下一個(gè)操作數(shù)顯示運(yùn)算結(jié)果3軟件運(yùn)行或者測(cè)試結(jié)果進(jìn)入界面輸入“1”,查看說(shuō)明按任意鍵,返回界面,并輸入“2”輸入算式“(2+3)*10/2=”輸入“y”后,繼續(xù)輸入算式“(1+2/3=”4 軟件設(shè)計(jì)過(guò)程中遇到的問(wèn)題以及解決辦法經(jīng)過(guò)大約一個(gè)星期的設(shè)計(jì),計(jì)算器基本完畢。在本次課程設(shè)計(jì)中困難遇到不少,比如如何對(duì)輸入的一個(gè)字符數(shù)組中的單個(gè)字符進(jìn)行整型運(yùn)算、如何能循環(huán)菜單、如何倒敘輸出等。由于設(shè)計(jì)時(shí)間較短,所以該計(jì)算器還有很多不盡如人意的地方,比如功能不夠完善、函數(shù)不夠完整等多方面問(wèn)題。在這次系統(tǒng)開(kāi)發(fā)的過(guò)程中,我深深體會(huì)到了做一個(gè)系統(tǒng),首先要進(jìn)行需求分析的重要性,也了解到了

8、制作一個(gè)軟件的不易。5 總結(jié)通過(guò)本次課程設(shè)計(jì)學(xué)到了很多東西,對(duì)于c+對(duì)象的含義有了進(jìn)一步的認(rèn)識(shí)。學(xué)習(xí)不能只是停留在表面,此次課程設(shè)計(jì)為以后的學(xué)習(xí)積累了經(jīng)驗(yàn),設(shè)計(jì)不比編寫(xiě)容易,只有一個(gè)好的規(guī)劃才能寫(xiě)出好的程序。不過(guò)也通過(guò)本次發(fā)現(xiàn)了自己的不足之處??偸牵罕敬握n程設(shè)計(jì)受益匪淺,動(dòng)手能力大大增強(qiáng)。參考文獻(xiàn)1李素若.C+面向?qū)ο蟪绦蛟O(shè)計(jì).北京:中國(guó)水利水電出版社,2013.2鄭莉,傅仕星編,C+面向?qū)ο蟪绦蛟O(shè)計(jì),清華大學(xué)出版社,2003年9.3譚浩強(qiáng)編,C+面向?qū)ο蟪绦蛟O(shè)計(jì),清華大學(xué)出版社,2005年7月.4李師賢等譯,C+精髓,機(jī)械工業(yè)出版社,2002年8月.5Davis Chapman,學(xué)用Visu

9、al c+ 6.0,清華大學(xué)出版社,2001年7月出版6鄭莉,傅仕星編,C+語(yǔ)言面向?qū)ο蟪绦蛟O(shè)計(jì)習(xí)題與實(shí)驗(yàn)指導(dǎo),清華大學(xué)出版社,2003年9月.附錄(程序源代碼)#include<iostream>#include<cmath>#include<string>#include<iomanip>using namespace std;void menu();/位于calculate函數(shù)后面的菜單函數(shù)聲明void guide();/位于主函數(shù)后面的指導(dǎo)函數(shù)的聲明double D_Operate(double x,char op,d

10、ouble y)/雙目運(yùn)算符的運(yùn)算定義 double a;/計(jì)算結(jié)果 switch(op) case'+': a=x+y;break; case'-': a=x-y;break; case'*': a=x*y;break; case'/': a=x/y;break; case'': a=pow(x,y);break;/冪運(yùn)算包括乘方和開(kāi)方 /因?yàn)槎际抢胐ouble進(jìn)行運(yùn)算 因此不定義取模運(yùn)算 return a;double S_Operate(char op,double x)/前綴單目運(yùn)算符的運(yùn)算定義 doub

11、le a;/計(jì)算結(jié)果 switch(op) case's': a=sin(x);break; case'c': a=cos(x);break; case't': a=tan(x);break; case'l': a=log10(x);break;/以10為底的對(duì)數(shù) case'n': a=log(x);break;/以e(2.718281828)為底的對(duì)數(shù) case'_': a=-x;break;/取負(fù)用下劃線代替負(fù)號(hào) 定義為一元運(yùn)算 return a;char Precede(char op1,ch

12、ar op2) /判斷符號(hào)的優(yōu)先級(jí) op1在返回的結(jié)果符的左邊 op2在右邊/用于判定運(yùn)算符的優(yōu)先級(jí) 以決定是把運(yùn)算符壓棧 還是把棧內(nèi)的運(yùn)算符彈出來(lái)進(jìn)行計(jì)算 if(op1='+'|op1='-')&&(op2='+'|op2='-'|op2=')'|op2='=')| (op1='*'|op1='/')&&(op2='+'|op2='-'|op2='*'|op2='/'|o

13、p2=')'|op2='=') |(op1=''&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='='|op2='s'|op2='c'|op2='t'|op2='_'|op2='l'|op2='n') |(op1='_'|op1='s'|op1='c'

14、;|op1='t'|op1='l'|op1='n')&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='='|op2='s'|op2='c'|op2='t'|op2='_'|op2='l'|op2='n') return '>'/上述情況下 棧頂運(yùn)算符優(yōu)先級(jí)高于待定運(yùn)算符 需彈

15、棧 if(op1='('&&op2=')')|(op1='='&&op2='=') return '=' else return '<'int illegal_char(string s,int i)/非法輸入字符判定函數(shù) int j=0; while(j<i) if(sj>='0'&&sj<='9') j+; else if(sj='+'|sj='-'|sj=&#

16、39;*'|sj='/'|sj='.'|sj='('|sj=')'|sj=''|sj='!'|sj='e'|sj='_') j+; else if(sj='p'&&sj+1='i')|(sj='l'&&sj+1='n') j+=2; else if(sj='s'&&sj+1='i'&&sj+2='

17、;n')|(sj='c'&&sj+1='o'&&sj+2='s')|(sj='t'&&sj+1='a'&&sj+2='n')|(sj='l'&&sj+1='o'&&sj+2='g') j+=3; /以上都是標(biāo)準(zhǔn)的數(shù)字字符和運(yùn)算符 如若存在其他形式的字符 則是非法輸入 else cout<<"程序終止,存在非法的字符輸入!&quo

18、t;<<endl; return 0; return 1;/沒(méi)有非法字符 返回1 否則返回0int match(string s)/棧結(jié)構(gòu)的括號(hào)匹配檢測(cè)函數(shù) int i=0,top=0; char stack50; while(si!='0') if(si='(') stacktop=si; top+; /push 左括號(hào)壓入棧內(nèi) if(si=')') if(stacktop-1='(') int a=i+1; stacktop-1=NULL; top-; /把與右括號(hào)匹配的左括號(hào)彈掉 else cout<<

19、;"括號(hào)輸入有誤"<<endl; return 0;/多了右括號(hào) 括號(hào)失陪 返回非法 /pop'(' i+; if (top!=0) cout<<"括號(hào)輸入有誤"<<endl; return 0;/多了左括號(hào) 括號(hào)失陪 返回非法 return 1;/返回合法class NUMstack/運(yùn)算數(shù)棧 public: double num1000; int top; void start()/初始化棧清空棧頂指針置底 for(int i=0;i<1000;i+) numi=0; top=0; void

20、push(char a)/因?yàn)橛卸辔粩?shù)的運(yùn)算因此不能一壓棧就提升棧頂指針 numtop=numtop*10+(a-'0');/把字符轉(zhuǎn)成數(shù)因?yàn)槊看稳霔V耙?0 所以初始化要清0 double pop() top-; double number=numtop; numtop=0; return number; /彈棧函數(shù) 彈掉棧頂元素 棧頂歸0 top指針下降 double getTop()/取棧頂元素但不必彈棧 return numtop-1; void lift()/提升top指針的函數(shù) top+;class OPERstack/運(yùn)算符棧 public: char ope

21、r1000; int top; void start()/初始化函數(shù)棧清空棧底放一"="用于判定算式結(jié)束 oper0='=' for(int i=1;i<1000;i+) operi=NULL; top=1;/棧頂指針置于棧底的上一位 void push(char a) opertop=a; top+;/與數(shù)字棧不同一壓棧就可以提升指針 char pop() top-; char op=opertop; opertop=NULL; return op;/彈出計(jì)算符 用于計(jì)算 char getTop() return opertop-1;/取棧頂符號(hào) 但

22、不彈棧 可用于判定優(yōu)先級(jí) ; void calculate(string equation)/算式計(jì)算函數(shù)(關(guān)鍵函數(shù)) NUMstack number;/定義運(yùn)算數(shù)棧變量number OPERstack oper;/定義運(yùn)算符棧變量oper number.start(); oper.start();/把兩個(gè)棧初始化 int i=0,len=0,k; char p,sig; double yuan1,yuan2; while(equationi!='0') len+; i+; /計(jì)算等式長(zhǎng)度len if(equationlen-1!='=') cout<&l

23、t;"輸入有誤沒(méi)有輸入終止符號(hào)-等號(hào)“=”"<<endl; return;/檢測(cè)有沒(méi)有結(jié)束符等號(hào)"=" int le; le=illegal_char(equation,len-1); if(le=0) return;/有非法字符 不進(jìn)行后續(xù)計(jì)算 le=match(equation); if(le=0) return;/括號(hào)匹配非法 不進(jìn)行后續(xù)計(jì)算 for(i=0;i<len;i+)/初步確定合法后開(kāi)始計(jì)算算式 if(equationi='!')/階乘是后綴單目運(yùn)算符單獨(dú)進(jìn)行計(jì)算 yuan1=number.pop();/

24、彈出棧頂元素做階乘 if (yuan1=0) number.numnumber.top=0;/0的階乘為0 壓結(jié)果入棧 number.lift(); else number.numnumber.top=1; for(k=1;k<=yuan1;k+)/階乘循環(huán) number.numnumber.top=k*number.numnumber.top; number.lift();/結(jié)果入站 else if(equationi>='0'&&equationi<='9') number.push(equationi);/壓數(shù)字字符入棧

25、if(equationi+1<'0'|equationi+1>'9')&&equationi+1!='.') number.lift();/當(dāng)整個(gè)多位運(yùn)算數(shù)讀取完畢后,運(yùn)算數(shù)棧棧頂指針才能提升 else if(equationi='p') number.numnumber.top=3.1415926536;/pi值即 圓周率 要壓入數(shù)字棧 number.lift(); i+;/pi是兩個(gè)字符所以要移動(dòng)掃描算式的指針往后跳一個(gè) else if(equationi='e') number.l

26、ift(); else if(equationi='.')/小數(shù)壓棧代碼 int x=1; while(equationi+x>='0'&&equationi+x<='9') number.numnumber.top+=(equationi+x-'0')/pow(10,x);/第x位小數(shù)入棧 x+; x-; number.lift(); i=i+x; else if(equationi='(') oper.push(equationi);/左括號(hào)無(wú)條件壓棧 else/數(shù) 階乘左括號(hào)判斷完

27、畢后其他運(yùn)算符的分類(lèi)討論 if(oper.top=1)/運(yùn)算符棧為空運(yùn)算符可以無(wú)條件入棧 if(equationi='l'&&equationi+1='o') oper.push('l'); else if(equationi='l'&&equationi+1='n') oper.push('n');/因?yàn)閘og和ln都是小寫(xiě)字母l開(kāi)頭所以要分情況討論 else oper.push(equationi); else/運(yùn)算符棧不為空則要進(jìn)行優(yōu)先級(jí)判斷 char temp

28、1=oper.getTop();/取出棧頂符號(hào) char temp2;/待入棧符號(hào) if(equationi='l'&&equationi+1='o') temp2='l' else if(equationi='l'&&equationi+1='n') temp2='n'/log與ln的再次討論 else temp2=equationi; p=Precede(temp1,temp2); if(p='<') oper.push(temp2);/棧頂

29、符優(yōu)先級(jí)較低現(xiàn)在待定的運(yùn)算符就可以入棧了 if(p='>'|p='=') char rep=p;/當(dāng)棧頂符優(yōu)先級(jí)不低于待入棧的符號(hào) 則運(yùn)算符棧不停地彈棧 /進(jìn)行運(yùn)算直到低于待入棧符號(hào)為止 rep用于記錄比較結(jié)果 要多次進(jìn)行判斷 while(rep='>'|p='=')&&(oper.top-1>0) sig=oper.pop(); yuan1=number.pop(); yuan2=number.getTop();/靠前的一個(gè)運(yùn)算數(shù)只要取得不要彈出來(lái) if(sig='/'&

30、&yuan1=0)/yuan1是雙目運(yùn)算符后面的第二運(yùn)算元 cout<<"計(jì)算時(shí)出錯(cuò)!出現(xiàn)了除數(shù)為0的情況!"<<endl; return; if(sig=''&&yuan2<0&&yuan1>0&&yuan1<1&&(static_cast <int>(1/yuan1)%2=0) /對(duì)負(fù)數(shù)開(kāi)偶次根號(hào)的限制 cout<<"計(jì)算時(shí)出錯(cuò)!出現(xiàn)了負(fù)數(shù)開(kāi)偶次根號(hào)的情況!"<<endl; return

31、; if(sig='_'|sig='s'|sig='c'|sig='t'|sig='l'|sig='n')/若為前綴單目運(yùn)算符 double tt; tt=S_Operate(sig,yuan1); number.numnumber.top=tt;/運(yùn)算結(jié)果壓回原來(lái)yuan1在棧內(nèi)的位置 number.lift();/提升指針 temp1=oper.getTop(); rep=Precede(temp1,temp2);/再判優(yōu)先級(jí) else number.num(number.top)-1=D_Op

32、erate(yuan2,sig,yuan1); temp1=oper.getTop(); rep=Precede(temp1,temp2);/雙目運(yùn)算符的計(jì)算 if(equationi=')')/如果棧外符是右括號(hào)要把與之匹配的左括號(hào)彈出棧外 oper.pop(); else if(equationi='l'&&equationi+1='o') oper.push('l');/代表log的l else if(equationi='l')&&(equationi+1='n

33、9;) oper.push('n');/代表ln的n else oper.push(equationi); if(equationi='s'|equationi='c'|equationi='t'|(equationi='l'&&equationi+1='o') i=i+2; if(equationi='l'&&equationi+1='n') i+; /對(duì)于不止一個(gè)字符的運(yùn)算符 sin log ln等等 要移動(dòng)掃描算式的指針 往后跳一

34、個(gè)或兩個(gè) if(number.num0=ceil(number.num0) cout<<equation<<number.num0<<endl; else cout<<equation<<fixed<<setprecision(8)<<number.num0<<endl;/輸出結(jié)果控制精度8位小數(shù) /調(diào)試時(shí)檢查運(yùn)算結(jié)束后站內(nèi)情況的代碼段void menu()/菜單函數(shù) cout<<"實(shí)數(shù)型科學(xué)算式計(jì)算器"<<endl; cout<<"

35、(荊楚理工學(xué)院215 楊?lèi)?"<<endl; cout<<endl; cout<<"歡迎使用o(_)o !"<<endl; cout<<"請(qǐng)選擇你需要的功能:(0,1或者2)"<<endl; cout<<"-"<<endl; cout<<"1.使用說(shuō)明"<<endl; cout<<"2.計(jì)算算式"<<endl; cout<<&quo

36、t;0.退出程序"<<endl; cout<<"-"<<endl; cout<<"你的選擇是:" int choice; cin>>choice; switch(choice) case 0:return; case 1:guide();break; case 2: system("cls"); char go_on='y' string equation; while(go_on='y') cout<<endl<<endl<<"請(qǐng)輸入算式,以=(

溫馨提示

  • 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)論