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

下載本文檔

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

文檔簡介

1、 面向?qū)ο蟪绦蛟O計語言 -課程設計 題 目 計算器設計 院 系 航空宇航學院 專 業(yè) 飛行器設計與工程 學生姓名 張權 學 號 011110320 指導教師 張德平 二零一二 年 六 月 九 日計算器設計(一)、目的與要求: 1、目的: 通過開發(fā)計算器程序,進一步熟悉C+中類和對象的定義與使用,掌握程序控制的方法,掌握C+程序設計的基本知識。2、基本要求: (1)設計計算器程序,可對實數(shù)操作; (2)可對多個基數(shù)操作的四則運算; (3)增加函數(shù)如:正弦、余弦、正切、對數(shù)、平方和平方根、完成四則混合運算,注意考慮優(yōu)先級,對應增加主菜單選項; (4)根據(jù)程序的提示,可以進行正弦運算進行余弦運算、正

2、切運算、對數(shù)運算、求平方運算、混合運算、華氏溫度轉化為攝氏溫度的運算、攝氏溫度轉化為華氏溫度的運算、求平方根運算。使四則運算能夠具有測試功能,即計算機能夠自動出題,并要求用戶計算,同時計算機判斷用戶的對錯并打分,要求十題為一個單元,加減運算時最高為兩位數(shù)的運算,乘法為兩位數(shù)乘以一位數(shù),除法是兩位數(shù)或者三位數(shù)除以一位數(shù),要求沒有余數(shù)。 (二)、設計方法和基本原理: 1、問題描述(功能要求): 實數(shù)間的計算很復雜,它包括:相加、相減、相乘、相除、求三角函數(shù)、求對數(shù)、四則混合運算等。試設計計算器,使之能提供以下功能:1)可以連續(xù)輸入運算,對于輸入的表達式能夠按算符優(yōu)先級進行處理。如:輸入4+5*3時

3、,應該輸出60,而不是27。2)可以處理包含括號的表達式。如: 輸入2*(3+2)時,應該輸出10,而不是8。3)可以計算三角函數(shù)、對數(shù)函數(shù)、平方根以及平方。4)能夠?qū)崿F(xiàn)華氏溫度與攝氏溫度之間的轉換。5)四則運算能夠具有測試功能,即計算機能夠自動出題,并要求用戶計算,同時計算機判斷用戶的對錯并打分。 6)系統(tǒng)以菜單方式工作。(所謂菜單指用戶可以自由選擇所要執(zhí)行的功能)7)當使用者輸入錯誤時要有錯誤提示。2、問題的解決方案: 根據(jù)系統(tǒng)功能要求,可以將問題解決分為以下步驟: (1)應用系統(tǒng)分析,建立該系統(tǒng)的功能模塊框圖以及界面的組織和設計;(2)分析系統(tǒng)中的各個實體及它們之間的關系包括屬性和行為;

4、 (3)根據(jù)問題描述,設計系統(tǒng)的類層次; (4)完成類層次中各個類的描述(包括屬性和方法); (5)完成類中各個成員函數(shù)的定義; (6)完成系統(tǒng)的應用模塊; (7)功能調(diào)試; (8)完成系統(tǒng)總結報告。目 錄1.系統(tǒng)需求分析12.總體設計13.詳細設計24.系統(tǒng)調(diào)試65.結果分析錯誤!未定義書簽。6.總結錯誤!未定義書簽。附錄:源程序清單1. 系統(tǒng)需求分析 實數(shù)間的計算很復雜,它包括:相加、相減、相乘、相除、求三角函數(shù)、求對數(shù)、四則混合運算等。試設計計算器,使之能提供以下功能:1)可以連續(xù)輸入運算,對于輸入的表達式能夠按算符優(yōu)先級進行處理。如:輸入4+5*3時,應該輸出60,而不是27。2)可以

5、處理包含括號的表達式。如: 輸入2*(3+2)時,應該輸出10,而不是8。3)可以計算三角函數(shù)、對數(shù)函數(shù)、平方根以及平方。4)能夠?qū)崿F(xiàn)華氏溫度與攝氏溫度之間的轉換。5)四則運算能夠具有測試功能,即計算機能夠自動出題,并要求用戶計算,同時計算機判斷用戶的對錯并打分。 6)系統(tǒng)以菜單方式工作。(所謂菜單指用戶可以自由選擇所要執(zhí)行的功能)7)當使用者輸入錯誤時要有錯誤提示。學生可以通過以上功能計算實數(shù)間的加、減、乘、除、求三角函數(shù)、求平方、求平方根、求對數(shù)以及實現(xiàn)華氏溫度和攝氏溫度間的轉換,除了要實現(xiàn)上述的基本功能之外,本系統(tǒng)還應該在細節(jié)上下工夫,使用戶使用方便,在使用的過程中保持一個愉快的心情。計

6、算器系統(tǒng)有廣大的用戶群,這其中有老師、學生、有公司辦公人員,也可以供給一般用戶使用??傊?,該系統(tǒng)可以滿足用戶需求,實現(xiàn)對實數(shù)的計算。 2. 總體設計計算器系統(tǒng)包含六個大的功能,分別是:四則混合運算、三角函數(shù)運算、對數(shù)運算、平方和平方根運算、攝氏溫度和華氏溫度的轉換、測試功能。在上述六大功能中最難的是四則混合運算的實現(xiàn),特別是優(yōu)先級的判斷,不但有加減乘除之間的優(yōu)先級判斷,而且還有括號夾雜其中,使得實現(xiàn)起來非常困難。于是,我考慮用棧和二叉樹來實現(xiàn)。系統(tǒng)彈出主菜單來提示用戶輸入其想要實現(xiàn)的運算類型,然后根據(jù)用戶所選的類型來調(diào)用相關的函數(shù)計算并返回結果。當系統(tǒng)完成運算后,會再次跳出主菜單讓用戶選擇,用

7、戶可以選擇推出或者繼續(xù)。當用戶輸入出錯時,系統(tǒng)會提示用戶??傊脩艨梢苑奖愕脑谙到y(tǒng)提示下進行使用。本系統(tǒng)還具有測試功能,系統(tǒng)出題,用戶輸入答案,系統(tǒng)會判斷對錯并給出用戶的得分。計算器系統(tǒng)中功能模塊圖:計算器測試功能華氏溫度與攝氏溫的轉換三角函數(shù)運算對數(shù)運算平方和平方根運算四則混合運算3. 詳細設計系統(tǒng)通過主菜單提示用戶選擇相應的功能。該計算器的功能主要為下列6個:(1).四則混合運算模塊用戶選擇功能,輸入要進行的多項式(不能輸入空格符),實現(xiàn)實數(shù)的四則混合運算。開始輸入多項式混合運算流程圖:處理函數(shù)Mixed()結果顯示結束 (2).三角函數(shù)模塊用戶選擇功能,輸入實數(shù),實現(xiàn)求三角函數(shù)的功能。

8、三角函數(shù)運算流程圖開始選擇功能 余弦函數(shù)ccos()正切函數(shù)ctan()正弦函數(shù)csin()顯示結果結束(3).對數(shù)模塊用戶選擇功能,輸入實數(shù),實現(xiàn)對數(shù)的求解。對數(shù)函數(shù)流程圖結果顯示處理函數(shù)clog()輸入實數(shù)開始結束(4).平方和平方根模塊用戶選擇功能,輸入實數(shù),實現(xiàn)平方和平方根運算。選擇功能開始平方函數(shù)csqure()平方根函數(shù)squreroot()平方和平方根函數(shù)流程圖結束結果顯示結束(5).華氏溫度與攝氏溫度的轉換模塊華氏溫度轉換為攝氏溫度fatoce()結束結果顯示攝氏溫度轉化為華氏溫度cetofa()選擇功能開始(6).測試模塊系統(tǒng)出題,用戶輸入答案,系統(tǒng)會判斷對錯并給出用戶的得分

9、。結果顯示用戶給出答案系統(tǒng)出題開始結束4.系統(tǒng)調(diào)試程序編寫完成后,我進行了程序調(diào)試。調(diào)試過程中,出現(xiàn)了以下問題:(1).當我第一次運行程序時,出現(xiàn)了很多錯誤,大部分是定義的函數(shù)名與引用時不同,這是由于粗心引起的。還好,這個程序也就300多行代碼,找起來不是很困難,但是如果是上萬行的代碼,那就要花很多時間。以后在編程時,我要細心些,不能把時間浪費在這種低級錯誤上。(2).在調(diào)試除法運算時,我發(fā)現(xiàn)自己沒有考慮除數(shù)為零的情況,一旦輸入的除數(shù)為零,系統(tǒng)就無法運行了。我回到除法運算的函數(shù)中,加入判斷除數(shù)是否為零以及為零時的處理的代碼,問題就解決了。在對數(shù)運算、求平方根運算中都有類似情況。(3).當我選擇

10、運算的種類并輸入要計算的實數(shù)后,系統(tǒng)輸出答案,但馬上屏幕又恢復到主菜單選項,根本來不及看清答案。 我到程序中去尋找錯誤,發(fā)現(xiàn)每一次用戶輸入后我都有寫一個cin.ignore( ),于是我想會不會是這個出的問題。我刪了一個進行調(diào)試,發(fā)現(xiàn)沒有錯誤,可以運行。但是,運行起來和以前還是一樣。于是,我回到代碼中繼續(xù)尋找,發(fā)現(xiàn)在menu函數(shù)中我用了一個清屏的代碼,把它刪掉后繼續(xù)調(diào)試,這次,運行起來后不再出現(xiàn)問題了,我進行的所有操作都保留下來了,沒有被刪除。原來,每次調(diào)用menu函數(shù)時,都會執(zhí)行一次清屏,用戶上次的運算結果會被刪除并顯示新的菜單。(4).在選擇菜單項時,會出現(xiàn)問題,例如:輸入1,選擇正弦函數(shù)

11、操作,但是輸入12,卻變成了選擇正弦函數(shù)操作并且對2進行正弦計算,經(jīng)過考慮并且嘗試我發(fā)現(xiàn)只要將選擇輸入由字符型改成整形就可以了。5. 結果分析這次的課設,雖然老師早早的就把題目給我了,但我因為書本還沒看完,就遲遲沒有動手去做。從開始準備做這個題到完成也就是幾天的事,所以很多地方寫的不好,甚至有些地方還不是很懂。在多次調(diào)試后,有些錯誤依然存在,而且我想不出辦法解決,實在是慚愧。現(xiàn)在,在這里也只能說說它的不足之處了。首先是類的問題,整個程序中,我只用了一個類,幾乎所有的函數(shù)都是這個類的成員,讓人感覺很臃腫,我也試圖去優(yōu)化它,但最終也沒能想出辦法來。容易在基礎的東西上出錯,經(jīng)常忘記寫“;”,或者同一

12、個函數(shù)不同地方調(diào)用時會打錯名字,這些都是不應該的,必須改掉。函數(shù)參數(shù)設定不夠完美,整個程序中對指針的運用比較少。對于指針的巧妙運用把握得不夠。一開始挺順利,但在如何實現(xiàn)四則混合運算時,我茫然了。我苦想一整天都沒能想出如何去做。于是,我去百度了一下,還好,讓我找到了??墒?,問題又來了,在實現(xiàn)四則混合運算時運用了棧和二叉樹的知識,這讓我很頭疼,這兩樣東西我壓根不懂。跑到圖書館借了相關的書看,還是不能完全理解,只能湊合著用了。在錯誤提示方面我還是很不足,經(jīng)常忘記,都是調(diào)試出現(xiàn)問題了才會想到。6.總結通過課程設計,我感覺到平時學的時候?qū)系某绦蚴强炊?,可是真正運用這些知識的時候還是有點力不從心,不

13、能很好的了解并運用到自己的程序之中。通過這次的課程設計我明白了學習程序設計語言必須要勤做實驗,通過實驗總結經(jīng)驗。平時遇到的一些小問題一定要重視,越是基礎的知識越要理解透徹。比如指針與數(shù)組方面的知識,一旦沒有弄清楚,在設計程序時就會吃虧。這次的課程設計中,我遇到了很多的問題,有的通過思考或查看書本解決了,有的還留在腦子里,只有通過孜孜不倦的求索我們才會有進步,不懂得思考就不能真正的掌握一門知識。像我做這個程序的時候,就感覺自己對棧的知識還很欠缺,有的地方不是很明白,多虧了上網(wǎng)查找的這方面知識和一些源程序才幫助我完成了這個程序的設計。可是一直到現(xiàn)在,對于混合運算中用到的棧和二叉樹我只是有些理解,真

14、正運用還不行。之前我學的書上沒有這些內(nèi)容,雖然我去圖書館看了有關這些內(nèi)容的書,但畢竟能力有限,短時間內(nèi)無法理解的那么好,運用起來就更加捉襟見肘了。今后,我還是會去看這方面的書的,把沒弄懂的東西弄懂。最后,還有一點不得不說,這個程序中,我只定義了一個類,所有的函數(shù)都包含在里面,感覺很臃腫,想要優(yōu)化,可最終也沒能想出辦法,真是一大遺憾。附錄:源程序清單 #include <iostream>#include <ctime>/用以產(chǎn)生隨機數(shù)#include <cstdlib>/定義雜項函數(shù)及內(nèi)存分配函數(shù)#include <cmath>/包含數(shù)學函數(shù)#i

15、nclude <iomanip>using namespace std;#define MAX 100#define MIN 10double number1,number2,answer;int input;class count public:double cadd(double number1,double number2);/定義加法運算double csub(double number1,double number2);/定義減法運算double cdiv(double number1,double number2);/定義除法運算double cmult(double

16、number1,double number2);/定義乘法運算void csqure();/定義平方函數(shù)void squreroot();/定義求平方根運算void ccos();/定義余弦函數(shù)void ctan();/定義正切函數(shù)void csin();/定義正弦函數(shù)void clog();/定義對數(shù)函數(shù)void fatoce();/定義華氏溫度轉化為攝氏溫度void cetofa();/定義攝氏溫度轉化為華氏溫度/定義混合運算函數(shù)void mixed(); void calcu();double calculate(char *f);void cexit();/定義退出函數(shù)void men

17、u();/定義主菜單函數(shù)void badinput();/定義出錯提示函數(shù) void test();/定義測試函數(shù) ;double count:cadd(double number1,double number2)/加法運算answer=number1+number2;return(answer);double count:csub(double number1,double number2)/減法運算answer = number1-number2;return(answer);double count:cdiv(double number1,double number2)/除法運算if(n

18、umber2=0)/排除除數(shù)為零的情況cout<<"除數(shù)不可為0!n"exit(0);elseanswer = number1/number2;return(answer);double count:cmult(double number1,double number2)/乘法運算answer = number1*number2;return(answer);void count:csqure()/求平方的函數(shù)cout<<"求平方n"cout<<"請輸入一個數(shù):"cin>>number1

19、;answer=(number1*number1);cout<<number1<<"的平方是"<<answer<<endl;cin.ignore();menu();void count:squreroot()/求平方根的函數(shù)cout << "求平方根n"cout << "請輸入一個非負數(shù): "cin >> number1;if(number1<0)/排除負數(shù)開平方根cout<<"輸入錯誤!不可為負數(shù)!n"cin.i

20、gnore();menu();elseanswer = sqrt(number1);cout<< number1 << "的平方根是" << answer << endl;cin.ignore();menu();void count:csin()/正弦函數(shù)cout<<"求正弦n"cout<<"請輸入一個數(shù):"cin>>number1;answer=sin(number1);cout<<number1<<"的正弦是&qu

21、ot;<<answer<<endl;cin.ignore();menu();void count:ccos()/余弦函數(shù)cout<<"求余弦n"cout<<"請輸入一個數(shù):"cin>>number1;answer=cos(number1);cout<<number1<<"的余弦是"<<answer<<endl;cin.ignore();menu();void count:ctan()/正切函數(shù)cout<<"

22、求正切n"cout<<"請輸入一個數(shù):"cin>>number1;answer=tan(number1);cout<<number1<<"的正切是"<<answer<<endl;cin.ignore();menu();void count:clog()/對數(shù)函數(shù)cout<<"求對數(shù)n"cout<<"請輸入一個正數(shù):"cin>>number1;if(number1<=0)cout<<

23、"輸入錯誤!不可為負數(shù)!n"cin.ignore();menu();elseanswer=log(number1);cout<<number1<<"的對數(shù)是"<<answer<<endl;cin.ignore();menu();void count:fatoce()/華氏溫度轉化為攝氏溫度cout << "將華氏溫度轉化為攝氏溫度n"cout << "請輸入一個華氏溫度: "cin >> number1;answer =(numbe

24、r1 - 32) * 5) / 9;cout << "它的攝氏溫度是" << answer << endl;cin.ignore();menu();void count:cetofa()/攝氏溫度轉化為華氏溫度cout << "將攝氏溫度轉化為華氏溫度n"cout << "請輸入一個攝氏溫度: "cin >> number1;answer =number1 * 9 / 5 + 32;cout << "它的華氏溫度是" <<

25、; answer << endl;cin.ignore();menu();const int a=30;double s1a+1;/操作數(shù)棧char s2a+1;/運算符棧int t1,t2;void count:calcu()/一次計算double x1,x2,x;char p; p=s2t2-;/彈出一個運算符 x2=s1t1-;/彈出兩個操作數(shù) x1=s1t1-; switch (p)/進行一次運算 case '+':x=cadd(x1,x2);break;case '-':x=csub(x1,x2);break;case '*'

26、;:x=cmult(x1,x2);break;case '/':x=cdiv(x1,x2);break;s1+t1=x;/結果壓入操作數(shù)棧double count:calculate(char *f)double x;char *p=f;t1=t2=0; /設置空棧while (*p!='0')switch(*p) case '+': case '-':while (t2&&(s2t2!='(') /執(zhí)行先遇到的加、減、乘、除運算 calcu(); /當前運算符進棧 s2+t2=*p; /讀下一個字

27、符 p+; break; case '*': case '/': if (t2&&(s2t2='*')|(s2t2='/') /執(zhí)行先遇到的乘、除運算 calcu(); /當前運算符進棧 s2+t2=*p; /讀下一個字符 p+;break;case '(':/左括號進棧s2+t2=*p;/讀下一個字符p+;break;case ')':while (s2t2!='(')/執(zhí)行括號內(nèi)的加、減、乘、除運算calcu();/彈出左括號t2-;/讀下一個字符p+;break

28、;default:/把字符串轉換成整數(shù)值x=0;do x=10*x+*p-'0'p+; while(*p>='0')&&(*p<='9');/操作數(shù)進棧s1+t1=x;/執(zhí)行先遇到的加、減、乘、除運算while (t2) calcu();/返回結果return s1t1;void count:mixed()/混合運算函數(shù)cout<<"混合運算函數(shù),請輸入要計算的表達式:n"char b100;cin>>b;cout<<calculate(b)<<end

29、l;cout<<flush;/刷新緩沖區(qū)cin.ignore();menu();void count:cexit()/退出函數(shù)exit(0);void count:badinput()/出錯提示函數(shù)cout << "輸入錯誤!n"cin.ignore();menu();void count:test()/測試函數(shù)cout<<"進行測試n"int s,sum=0;float x;for(int i=1;i<=10;i+)s=rand()%4+1;/隨機給出題目的+或-或*或/srand ( time (NULL)

30、);switch(s)case 1:number1=rand()%MAX;number2=rand()%MAX;cout<<number1<<'+'<<number2<<'='answer=cadd(number1,number2); break;case 2:number1=rand()%MAX;number2=rand()%MAX;cout<<number1<<'-'<<number2<<'='answer=csub(number1

31、,number2);break;case 3:number1=rand()%MAX;number2=rand()%MIN+1;cout<<number1<<'/'<<number2<<'='answer=cdiv(number1,number2);break;case 4:number1=rand()%MAX;number2=rand()%MIN;cout<<number1<<'*'<<number2<<'='answer=cmult(number1,number2);break;cout<<"n請寫出答案:n"cin>>x;if(answer=x)cout<<"正確,得十分!繼續(xù)加油!n"sum+=10;elsecout<<"錯誤,再來一次?n"cout<<"測試結果:答對"<<sum/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論