C計算器程序課程設(shè)計_第1頁
C計算器程序課程設(shè)計_第2頁
C計算器程序課程設(shè)計_第3頁
C計算器程序課程設(shè)計_第4頁
C計算器程序課程設(shè)計_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、荊楚理工學(xué)院課程設(shè)計成果 學(xué)院: 計算機工程學(xué)院 班 級: 14計算機科學(xué)與技術(shù)<2>班 學(xué)生姓名: 楊悅 學(xué) 號: 設(shè)計地點(單位): 設(shè)計題目: 模擬計算器程序 完成日期: 2016 年 6 月 30 日 指導(dǎo)教師評語: _成績(五級記分制): 教師簽名: 目 錄1 設(shè)計任務(wù)11.1設(shè)計目的11.2設(shè)計內(nèi)容11.3設(shè)計指標或者要求12 設(shè)計過程12.1程序功能12.2程序流程圖33軟件運行或者測試結(jié)果44 軟件設(shè)計過程中遇到的問題以及解決辦法65 總結(jié)6參考文獻6附錄(程序源代碼)71 設(shè)計任務(wù)1.1設(shè)計目的運用所學(xué)C+知識,完成模擬計算器程序,通過實踐加強對所學(xué)知識的理解和鞏

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

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

4、運算符彈出來進行計算int match(string s)/棧結(jié)構(gòu)的括號匹配檢測函數(shù)class NUMstack/運算數(shù)棧 void start()/初始化棧清空棧頂指針置底 for(int i=0;i<1000;i+) numi=0; top=0; class OPERstack/運算符棧 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)/算式計算函數(shù)(關(guān)鍵函數(shù)) NUMstack number;/定義運算數(shù)棧變量number OPERstack oper;/定義運算符棧變量oper number.start(); oper.start();/把兩個棧初始化number.numnumber.top=tt;/運算結(jié)果壓回原來yuan1在棧內(nèi)的位置 number.lift();/提升指針 temp1=oper.getTop(); rep=Precede(temp1,temp2);/再判優(yōu)先級rep=Precede(temp1,temp2);/雙目運算符的計算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)試時檢查運算結(jié)束后站內(nèi)情況的代碼段void menu()/菜單函數(shù) cin>>go_on;/可以循環(huán)進行算式計算運行程序2.2程序流程圖進入界面,輸入第一個操作數(shù)輸入“=”鍵,輸出運算結(jié)果選擇計算算式

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

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

9、al c+ 6.0,清華大學(xué)出版社,2001年7月出版6鄭莉,傅仕星編,C+語言面向?qū)ο蟪绦蛟O(shè)計習(xí)題與實驗指導(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)/雙目運算符的運算定義 double a;/計算結(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;/冪運算包括乘方和開方 /因為都是利用double進行運算 因此不定義取模運算 return a;double S_Operate(char op,double x)/前綴單目運算符的運算定義 doub

11、le a;/計算結(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為底的對數(shù) case'n': a=log(x);break;/以e(2.718281828)為底的對數(shù) case'_': a=-x;break;/取負用下劃線代替負號 定義為一元運算 return a;char Precede(char op1,ch

12、ar op2) /判斷符號的優(yōu)先級 op1在返回的結(jié)果符的左邊 op2在右邊/用于判定運算符的優(yōu)先級 以決定是把運算符壓棧 還是把棧內(nèi)的運算符彈出來進行計算 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ōu)先級高于待定運算符 需彈

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; /以上都是標準的數(shù)字字符和運算符 如若存在其他形式的字符 則是非法輸入 else cout<<"程序終止,存在非法的字符輸入!&quo

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

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

20、push(char a)/因為有多位數(shù)的運算因此不能一壓棧就提升棧頂指針 numtop=numtop*10+(a-'0');/把字符轉(zhuǎn)成數(shù)因為每次入棧之前要乘10 所以初始化要清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/運算符棧 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;/彈出計算符 用于計算 char getTop() return opertop-1;/取棧頂符號 但

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

23、t;"輸入有誤沒有輸入終止符號-等號“=”"<<endl; return;/檢測有沒有結(jié)束符等號"=" int le; le=illegal_char(equation,len-1); if(le=0) return;/有非法字符 不進行后續(xù)計算 le=match(equation); if(le=0) return;/括號匹配非法 不進行后續(xù)計算 for(i=0;i<len;i+)/初步確定合法后開始計算算式 if(equationi='!')/階乘是后綴單目運算符單獨進行計算 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)整個多位運算數(shù)讀取完畢后,運算數(shù)棧棧頂指針才能提升 else if(equationi='p') number.numnumber.top=3.1415926536;/pi值即 圓周率 要壓入數(shù)字棧 number.lift(); i+;/pi是兩個字符所以要移動掃描算式的指針往后跳一個 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);/左括號無條件壓棧 else/數(shù) 階乘左括號判斷完

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

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

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

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

32、erate(yuan2,sig,yuan1); temp1=oper.getTop(); rep=Precede(temp1,temp2);/雙目運算符的計算 if(equationi=')')/如果棧外符是右括號要把與之匹配的左括號彈出棧外 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+; /對于不止一個字符的運算符 sin log ln等等 要移動掃描算式的指針 往后跳一

34、個或兩個 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)試時檢查運算結(jié)束后站內(nèi)情況的代碼段void menu()/菜單函數(shù) cout<<"實數(shù)型科學(xué)算式計算器"<<endl; cout<<"

35、(荊楚理工學(xué)院215 楊悅)"<<endl; cout<<endl; cout<<"歡迎使用o(_)o !"<<endl; cout<<"請選擇你需要的功能:(0,1或者2)"<<endl; cout<<"-"<<endl; cout<<"1.使用說明"<<endl; cout<<"2.計算算式"<<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<<"請輸入算式,以=(

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論