




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、荊楚理工學院課程設計成果 學院: 計算機工程學院 班 級: 14計算機科學與技術<2>班 學生姓名: 楊悅 學 號: 2014404010215 設計地點(單位): 設計題目: 模擬計算器程序 完成日期: 2016 年 6 月 30 日 指導教師評語: _成績(五級記分制): 教師簽名: 目 錄1 設計任務11.1設計目的11.2設計內容11.3設計指標或者要求12 設計過程12.1程序功能12.2程序流程圖33軟件運行或者測試結果44 軟件設計過程中遇到的問題以及解決辦法65 總結6參考文獻6附錄(程序源代碼)71 設計任務1.1設計目的運用所學C+知識,完成模擬計算器程序,通過
2、實踐加強對所學知識的理解和鞏固。1.2設計內容設計一個程序來模擬一個簡單的手持計算器。程序支持冪運算、算術運算+、-、*、/、=、以及Black(清除)、Esc(全清除)等操作。1.3設計指標或者要求程序運行時,顯示一個窗口,等待用戶輸入,用戶可以從鍵盤輸入要計算的表達式,輸入的表達式顯示在窗口中,用戶鍵入“=” 符號回車后,窗口顯示出結果。2 設計過程通過對微軟附件計算器軟件進行調研、分析,研究,使用。我們了解到了作為一個計算器所應該的一些簡單功能,我們知道了怎樣使編寫的計算器程序向微軟附件計算器靠攏。其中計算器軟件的主要功能是: 1)可以進行加減乘除四則運算2)可以實現科學計算器
3、的部分計算功能3)可以進行清零運算 4)可以進行退格鍵運算 5)可以進行連續計算2.1程序功能void menu();/位于calculate函數后面的菜單函數聲明void guide();/位于主函數后面的指導函數的聲明double D_Operate(double x,char op,double y)/雙目運算符的運算定義double S_Operate(char op,double x)/前綴單目運算符的運算定義char Precede(char op1,char op2) /判斷符號的優先級 op1在返回的結果符的左邊 op2在右邊/用于判定運算符的優先級 以決定
4、是把運算符壓棧 還是把棧內的運算符彈出來進行計算int match(string s)/棧結構的括號匹配檢測函數class NUMstack/運算數棧 void start()/初始化棧清空棧頂指針置底 for(int i=0;i<1000;i+) numi=0; top=0; class OPERstack/運算符棧 public: char oper1000; int top; void start()/初始化函數棧清空棧底放一"="用于判定算式結束 oper0='=' for(int i=1;i<1000;i+) operi=NULL; t
5、op=1;/棧頂指針置于棧底的上一位 void calculate(string equation)/算式計算函數(關鍵函數) NUMstack number;/定義運算數棧變量number OPERstack oper;/定義運算符棧變量oper number.start(); oper.start();/把兩個棧初始化number.numnumber.top=tt;/運算結果壓回原來yuan1在棧內的位置 number.lift();/提升指針 temp1=oper.getTop(); rep=Precede(temp1,temp2);/再判優先級rep=Precede(temp1,tem
6、p2);/雙目運算符的計算if(number.num0=ceil(number.num0) cout<<equation<<number.num0<<endl; else cout<<equation<<fixed<<setprecision(8)<<number.num0<<endl;/輸出結果控制精度8位小數 /調試時檢查運算結束后站內情況的代碼段void menu()/菜單函數 cin>>go_on;/可以循環進行算式計算運行程序2.2程序流程圖進入界面,輸入第一個操作數輸入“=”
7、鍵,輸出運算結果選擇計算算式選擇,進行運算根據所選功能,選擇下一個操作數顯示運算結果3軟件運行或者測試結果進入界面輸入“1”,查看說明按任意鍵,返回界面,并輸入“2”輸入算式“(2+3)*10/2=”輸入“y”后,繼續輸入算式“(1+2/3=”4 軟件設計過程中遇到的問題以及解決辦法經過大約一個星期的設計,計算器基本完畢。在本次課程設計中困難遇到不少,比如如何對輸入的一個字符數組中的單個字符進行整型運算、如何能循環菜單、如何倒敘輸出等。由于設計時間較短,所以該計算器還有很多不盡如人意的地方,比如功能不夠完善、函數不夠完整等多方面問題。在這次系統開發的過程中,我深深體會到了做一個系統,首先要進行
8、需求分析的重要性,也了解到了制作一個軟件的不易。5 總結通過本次課程設計學到了很多東西,對于c+對象的含義有了進一步的認識。學習不能只是停留在表面,此次課程設計為以后的學習積累了經驗,設計不比編寫容易,只有一個好的規劃才能寫出好的程序。不過也通過本次發現了自己的不足之處??偸牵罕敬握n程設計受益匪淺,動手能力大大增強。參考文獻1李素若.C+面向對象程序設計.北京:中國水利水電出版社,2013.2鄭莉,傅仕星編,C+面向對象程序設計,清華大學出版社,2003年9.3譚浩強編,C+面向對象程序設計,清華大學出版社,2005年7月.4李師賢等譯,C+精髓,機械工業出版社,2002年8月.5Davis
9、Chapman,學用Visual c+ 6.0,清華大學出版社,2001年7月出版6鄭莉,傅仕星編,C+語言面向對象程序設計習題與實驗指導,清華大學出版社,2003年9月.附錄(程序源代碼)#include<iostream>#include<cmath>#include<string>#include<iomanip>using namespace std;void menu();/位于calculate函數后面的菜單函數聲明void guide();/位于主函數后面的指導函數的聲明double D_Operate(doub
10、le x,char op,double y)/雙目運算符的運算定義 double a;/計算結果 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)/前綴單
11、目運算符的運算定義 double a;/計算結果 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為底的對數 case'n': a=log(x);break;/以e(2.718281828)為底的對數 case'_': a=-x;break;/取負用下劃線代替負號 定義為一元運算 return a;char Prece
12、de(char op1,char op2) /判斷符號的優先級 op1在返回的結果符的左邊 op2在右邊/用于判定運算符的優先級 以決定是把運算符壓棧 還是把棧內的運算符彈出來進行計算 if(op1='+'|op1='-')&&(op2='+'|op2='-'|op2=')'|op2='=')| (op1='*'|op1='/')&&(op2='+'|op2='-'|op2='*'|op2
13、='/'|op2=')'|op2='=') |(op1=''&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='='|op2='s'|op2='c'|op2='t'|op2='_'|op2='l'|op2='n') |(op1='_'|op1='s'|
14、op1='c'|op1='t'|op1='l'|op1='n')&&(op2='+'|op2='-'|op2='*'|op2='/'|op2=')'|op2='='|op2='s'|op2='c'|op2='t'|op2='_'|op2='l'|op2='n') return '>'/上述情況下 棧頂運算
15、符優先級高于待定運算符 需彈棧 if(op1='('&&op2=')')|(op1='='&&op2='=') return '=' else return '<'int illegal_char(string s,int i)/非法輸入字符判定函數 int j=0; while(j<i) if(sj>='0'&&sj<='9') j+; else if(sj='+'|sj=
16、9;-'|sj='*'|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'&
17、&sj+2='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; /以上都是標準的數字字符和運算符 如若存在其他形式的字符 則是非法輸入 else cout<<"程序終止,
18、存在非法的字符輸入!"<<endl; return 0; return 1;/沒有非法字符 返回1 否則返回0int match(string s)/棧結構的括號匹配檢測函數 int i=0,top=0; char stack50; while(si!='0') if(si='(') stacktop=si; top+; /push 左括號壓入棧內 if(si=')') if(stacktop-1='(') int a=i+1; stacktop-1=NULL; top-; /把與右括號匹配的左括號彈掉 el
19、se cout<<"括號輸入有誤"<<endl; return 0;/多了右括號 括號失陪 返回非法 /pop'(' i+; if (top!=0) cout<<"括號輸入有誤"<<endl; return 0;/多了左括號 括號失陪 返回非法 return 1;/返回合法class NUMstack/運算數棧 public: double num1000; int top; void start()/初始化棧清空棧頂指針置底 for(int i=0;i<1000;i+) numi=0
20、; top=0; void push(char a)/因為有多位數的運算因此不能一壓棧就提升棧頂指針 numtop=numtop*10+(a-'0');/把字符轉成數因為每次入棧之前要乘10 所以初始化要清0 double pop() top-; double number=numtop; numtop=0; return number; /彈棧函數 彈掉棧頂元素 棧頂歸0 top指針下降 double getTop()/取棧頂元素但不必彈棧 return numtop-1; void lift()/提升top指針的函數 top+;class OPERstack/運算符棧 pu
21、blic: char oper1000; int top; void start()/初始化函數棧清空棧底放一"="用于判定算式結束 oper0='=' for(int i=1;i<1000;i+) operi=NULL; top=1;/棧頂指針置于棧底的上一位 void push(char a) opertop=a; top+;/與數字棧不同一壓棧就可以提升指針 char pop() top-; char op=opertop; opertop=NULL; return op;/彈出計算符 用于計算 char getTop() return oper
22、top-1;/取棧頂符號 但不彈棧 可用于判定優先級 ; void calculate(string equation)/算式計算函數(關鍵函數) NUMstack number;/定義運算數棧變量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!='=
23、9;) cout<<"輸入有誤沒有輸入終止符號-等號“=”"<<endl; return;/檢測有沒有結束符等號"=" int le; le=illegal_char(equation,len-1); if(le=0) return;/有非法字符 不進行后續計算 le=match(equation); if(le=0) return;/括號匹配非法 不進行后續計算 for(i=0;i<len;i+)/初步確定合法后開始計算算式 if(equationi='!')/階乘是后綴單目運算符單獨進行計算 yuan1=
24、number.pop();/彈出棧頂元素做階乘 if (yuan1=0) number.numnumber.top=0;/0的階乘為0 壓結果入棧 number.lift(); else number.numnumber.top=1; for(k=1;k<=yuan1;k+)/階乘循環 number.numnumber.top=k*number.numnumber.top; number.lift();/結果入站 else if(equationi>='0'&&equationi<='9') number.push(equati
25、oni);/壓數字字符入棧 if(equationi+1<'0'|equationi+1>'9')&&equationi+1!='.') number.lift();/當整個多位運算數讀取完畢后,運算數棧棧頂指針才能提升 else if(equationi='p') number.numnumber.top=3.1415926536;/pi值即 圓周率 要壓入數字棧 number.lift(); i+;/pi是兩個字符所以要移動掃描算式的指針往后跳一個 else if(equationi='e&
26、#39;) number.numnumber.top=2.718281828459;/e 自然對數底數 壓入運算數棧 number.lift(); else if(equationi='.')/小數壓棧代碼 int x=1; while(equationi+x>='0'&&equationi+x<='9') number.numnumber.top+=(equationi+x-'0')/pow(10,x);/第x位小數入棧 x+; x-; number.lift(); i=i+x; else if(eq
27、uationi='(') oper.push(equationi);/左括號無條件壓棧 else/數 階乘左括號判斷完畢后其他運算符的分類討論 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開頭
28、所以要分情況討論 else oper.push(equationi); else/運算符棧不為空則要進行優先級判斷 char temp1=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
29、; p=Precede(temp1,temp2); if(p='<') oper.push(temp2);/棧頂符優先級較低現在待定的運算符就可以入棧了 if(p='>'|p='=') char rep=p;/當棧頂符優先級不低于待入棧的符號 則運算符棧不停地彈棧 /進行運算直到低于待入棧符號為止 rep用于記錄比較結果 要多次進行判斷 while(rep='>'|p='=')&&(oper.top-1>0) sig=oper.pop(); yuan1=number.pop(
30、); yuan2=number.getTop();/靠前的一個運算數只要取得不要彈出來 if(sig='/'&&yuan1=0)/yuan1是雙目運算符后面的第二運算元 cout<<"計算時出錯!出現了除數為0的情況!"<<endl; return; if(sig=''&&yuan2<0&&yuan1>0&&yuan1<1&&(static_cast <int>(1/yuan1)%2=0) /對負數開偶次根號的
31、限制 cout<<"計算時出錯!出現了負數開偶次根號的情況!"<<endl; return; if(sig='_'|sig='s'|sig='c'|sig='t'|sig='l'|sig='n')/若為前綴單目運算符 double tt; tt=S_Operate(sig,yuan1); number.numnumber.top=tt;/運算結果壓回原來yuan1在棧內的位置 number.lift();/提升指針 temp1=oper.getTop();
32、 rep=Precede(temp1,temp2);/再判優先級 else number.num(number.top)-1=D_Operate(yuan2,sig,yuan1); temp1=oper.getTop(); rep=Precede(temp1,temp2);/雙目運算符的計算 if(equationi=')')/如果棧外符是右括號要把與之匹配的左括號彈出棧外 oper.pop(); else if(equationi='l'&&equationi+1='o') oper.push('l');/代表l
33、og的l else if(equationi='l')&&(equationi+1='n') 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'&&equa
34、tioni+1='n') i+; /對于不止一個字符的運算符 sin log ln等等 要移動掃描算式的指針 往后跳一個或兩個 if(number.num0=ceil(number.num0) cout<<equation<<number.num0<<endl; else cout<<equation<<fixed<<setprecision(8)<<number.num0<<endl;/輸出結果控制精度8位小數 /調試時檢查運算結束后站內情況的代碼段void menu()/菜單函數
35、 cout<<"實數型科學算式計算器"<<endl; cout<<"(荊楚理工學院215 楊悅)"<<endl; cout<<endl; cout<<"歡迎使用o(_)o !"<<endl; cout<<"請選擇你需要的功能:(0,1或者2)"<<endl; cout<<"-"<<endl; cout<<"1.使用說明"<<
36、;endl; cout<<"2.計算算式"<<endl; cout<<"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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年安徽水利水電職業技術學院高職單招職業技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年安徽衛生健康職業學院高職單招職業適應性測試歷年(2019-2024年)真題考點試卷含答案解析
- 中國乳品行業發展現狀
- 直銷行業的前景和未來
- 試乘試駕操作要點
- 精細管理探秘案例分享
- 微立體年終總結匯報模板1
- 人教版數學六年級下冊第二章百分數(二)(同步練習)
- 四川水利職業技術學院《麻醉拔牙及齒槽外科學》2023-2024學年第二學期期末試卷
- 低鈉血癥的觀察及護理
- 生物識別技術保障個人隱私
- 第四單元 民族團結與祖國統一 -【背誦清單】2022-2023學年八年級歷史下冊期末復習必背核心知識梳理(部編版)
- 2025年高考政治一輪復習知識清單選擇性必修三 《邏輯與思維》知識點復習
- 基于物聯網的農產品質量安全監測平臺建設方案
- 臨床腸氣囊腫病影像診斷與鑒別
- 產學合作協同育人項目教學內容和課程體系改革項目申報書模板-基于產業學院的實踐應用型人才培養
- DB34∕T 3790-2021 智慧藥房建設指南
- 被盜竊賠償協議書范文范本
- 物理因子治療技術-光療法
- 2024年四川省眉山市中考地理+生物試卷(含答案)
- 當代世界經濟與政治 李景治 第八版 課件 第1、2章 當代世界政治、當代世界經濟
評論
0/150
提交評論