c++課程設(shè)計(jì)--分?jǐn)?shù)計(jì)算器_第1頁
c++課程設(shè)計(jì)--分?jǐn)?shù)計(jì)算器_第2頁
c++課程設(shè)計(jì)--分?jǐn)?shù)計(jì)算器_第3頁
c++課程設(shè)計(jì)--分?jǐn)?shù)計(jì)算器_第4頁
c++課程設(shè)計(jì)--分?jǐn)?shù)計(jì)算器_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、;.C+課程設(shè)計(jì)報(bào)告 題 目: 分?jǐn)?shù)計(jì)算器 年 級(jí): 11級(jí) 專 業(yè): 通信工程 姓 名: 吳辰煒 指導(dǎo)老師: 朱紅 難 度 B 級(jí) 教師評(píng)語: 1.程序功能介紹 分?jǐn)?shù)計(jì)算器及測(cè)試程序,具有對(duì)輸入的運(yùn)算進(jìn)行“+,-,*,/,”的功能2 .程序設(shè)計(jì)要求(1) 完成計(jì)算器程序,對(duì)main函數(shù)的結(jié)構(gòu)進(jìn)行改進(jìn),要求有詳細(xì)的菜單選項(xiàng)界面,用戶不選擇退出就可以反復(fù)運(yùn)算。(2) 完善程序,改為多操作數(shù)基本四則運(yùn)算,遇#停止。(3) 增加函數(shù),完成四則混合運(yùn)算,注意算法要考慮運(yùn)算符的優(yōu)先級(jí),對(duì)應(yīng)增加主菜單選項(xiàng)。(4) 增加語句使四則運(yùn)算具有測(cè)試功能,即計(jì)算機(jī)能夠 自動(dòng)出題,并要求用戶計(jì)算,同時(shí)計(jì)算機(jī)判斷用戶計(jì)

2、算的對(duì)錯(cuò)并打分,要求十題一個(gè)單元,每題一個(gè)運(yùn)算符,參與運(yùn)算的分子分母均為一位數(shù),運(yùn)算符包括加,減,乘,除及大于小于等邏輯運(yùn)算符。3. 基本數(shù)據(jù)結(jié)構(gòu)含有整型變量 ,字符變量,實(shí)型變量,還定義了一個(gè)分?jǐn)?shù)類;除此之外還有以下函數(shù):1。分?jǐn)?shù)轉(zhuǎn)換為小數(shù);2。分?jǐn)?shù)轉(zhuǎn)換為帶分?jǐn)?shù);3。實(shí)現(xiàn)簡(jiǎn)單計(jì)算的函數(shù);4?;旌线\(yùn)算函數(shù);5。隨機(jī)測(cè)試題函數(shù);6。清屏函數(shù)。此外還多處運(yùn)用了運(yùn)算符的重載4. 程序運(yùn)行結(jié)果界面1. 初始界面2.功能13.功能24.功能35.功能46.功能5 5. 課程設(shè)計(jì)遇到的技術(shù)問題與解決思路 問題1:分?jǐn)?shù)的表示解決辦法:建立函數(shù),分別置分母,分子,同時(shí)構(gòu)造約分函數(shù)問題2:真分?jǐn)?shù)的表示解決辦法:

3、構(gòu)造函數(shù),置整數(shù)部分和分?jǐn)?shù)部分書本提供的源代碼雖然較為完備,但也存在一些錯(cuò)誤。問題3:乘方的函數(shù)功能實(shí)現(xiàn),書本提供的原有的類中重載的“”運(yùn)算符無法實(shí)現(xiàn)乘方運(yùn)算解決辦法:考慮到“”運(yùn)算符作為位運(yùn)算符,不能按照雙目運(yùn)算符的重載格式進(jìn)行重載,故,將用于代碼內(nèi)部的“”運(yùn)算符改為“%”雙目運(yùn)算符進(jìn)行重載,進(jìn)行重載運(yùn)算,但對(duì)外輸入輸出,仍使用作為字符常量的,解決了源代碼中,分?jǐn)?shù)運(yùn)算乘方無法實(shí)現(xiàn)的問題。fraction operator% (const fraction &base, int exp) /運(yùn)算符并非雙目運(yùn)算符/不可按照雙目運(yùn)算的方法重載,故修改為%,進(jìn)行內(nèi)部操作fraction re

4、turnValue;returnValue.setnum(pow(base.numerator(), exp); returnValue.setden(pow(base.denominator(), exp);returnValue.simplify(); return returnValue;問題4:輸出運(yùn)算符<<重載不完善,因?yàn)閷?duì)于函數(shù)參數(shù)分?jǐn)?shù)首先進(jìn)行了取絕對(duì)值運(yùn)算,從而導(dǎo)致對(duì)于輸出負(fù)分?jǐn)?shù)的時(shí)候,無法正確輸出。解決辦法:重新對(duì)重載函數(shù)進(jìn)行改寫,先判斷原參數(shù)分?jǐn)?shù)的正負(fù),若為負(fù),則先輸出“-”后,再取絕對(duì)值,進(jìn)行分子分母的分別輸出操作。而且原代碼中對(duì)于分?jǐn)?shù)正負(fù)的判斷極為繁瑣,故直接

5、調(diào)用已經(jīng)重載過的“>”進(jìn)行判斷。ostream & operator<< (ostream &os, const fraction &f)if(f.decimal()<0) / This extremely complex and seemingly os << "-" / useless if statement tests to see if / fraction f is negative.現(xiàn)已修改fraction temp = f.absval();int numer = f.numerator();int

6、 denom = f.denominator();if(temp.numerator() = 0 | temp.denominator() = 1)os << temp.numerator();elseos << temp.numerator() << '/' << temp.denominator();return os; 問題5:考慮到人性化的操作,實(shí)現(xiàn)用戶不選擇退出,就可以實(shí)現(xiàn)持續(xù)的操作,故設(shè)計(jì)了一系列的多級(jí)菜單,從而實(shí)現(xiàn)用戶結(jié)束一個(gè)操作之后,可以選擇繼續(xù)本操作。如果不繼續(xù)操作,則可以選擇回到上一個(gè)菜單,或者回到主菜單,或者

7、直接退出。但是為了實(shí)現(xiàn)這一系列的選擇操作,可是費(fèi)了一番功夫。解決辦法:(1) 首先對(duì)于是否繼續(xù)的選擇操作,定義的字符型變量ch,為了防止變量名重復(fù),主菜單對(duì)應(yīng)的每一個(gè)操作,在ch后都設(shè)置了不同的數(shù)字,與主菜單后的每個(gè)操作前數(shù)字一致。利用if語句進(jìn)行判斷。如果,用戶選擇不繼續(xù)本次操作,那么就輸出另一個(gè)選擇菜單,選擇是返回上一級(jí)的菜單還是直接退出程序,并且具備了一定的異常處理功能,如果輸入錯(cuò)誤的指令,則會(huì)顯示出來,要求用戶重新輸入代碼,為了大大簡(jiǎn)化程序,此功能利用goto語句實(shí)現(xiàn)。 loop1:if(ch1='N'|ch1='n')cout<<"

8、;1.返回主菜單;2,直接退出程序n"char ch11;cin>>ch11;switch(ch11)case'1':main();case'2':exit(0);default:cout<<"輸入指令不正確,請(qǐng)重新輸入!n"goto loop1;(2) 關(guān)于實(shí)現(xiàn)在函數(shù)執(zhí)行過程中返回主函數(shù),可謂大費(fèi)周章了,首先通過查資料得知,在main()內(nèi)部返回主函數(shù)開頭,可以在語句中直接使用main();語句。但是,在外部定義的函數(shù)中,不能使用該語句,否則將出現(xiàn)error C2065: 'main' :

9、undeclared identifiererror C2373: 'main' : redefinition; different type modifiers這兩個(gè)語法錯(cuò)誤,為了解決該問題,想到了使用goto語句,但是該語句無法在函數(shù)間跳躍,故而只得作罷。然后又想到利用返回值進(jìn)行判斷,但是,每次判斷是,則要執(zhí)行被調(diào)函數(shù),再一次運(yùn)行一次混合運(yùn)算函數(shù),或者是測(cè)試函數(shù),顯然是不可以的。最終,查了一些資料,獲得啟發(fā)。無返回值類型的函數(shù),通過return;語句可以直接跳出該函數(shù)。于是定義了一個(gè)全局變量judgement,當(dāng)遭遇需要返回主菜單時(shí),便將judgement進(jìn)行賦值為1,隨后

10、跳出,對(duì)judgement進(jìn)行判斷,從而判斷是否返回主菜單,如是,則配合主函數(shù)中的main()返回到主函數(shù)開頭。(3) 在隨后要講到的異常處理部分,當(dāng)檢測(cè)到被除數(shù)為0的時(shí)候,則彈出提示消息,并且可以選擇是否重新輸入該數(shù)字,或者直接返回上一級(jí)菜單。if(f2=0)cout<<"被除數(shù)不能為0!n1.重新輸入該數(shù)。2.返回主菜單。n"int k4;cin>>k4;if(k4=1)cin>>f2;goto loopsmall1;else judgement=1;return; /由此實(shí)現(xiàn)由外部函數(shù)直接回到主函數(shù)頭部 if(judgement=1

11、)main();問題6:混合運(yùn)算的核心問題即是優(yōu)先級(jí)的控制;解決辦法:為了實(shí)現(xiàn)運(yùn)算的優(yōu)先級(jí),則需要綜合判斷前后的兩個(gè)運(yùn)算符,首先算出優(yōu)先級(jí)較高的運(yùn)算符兩邊的數(shù)字,再對(duì)剩余的那個(gè)數(shù)字和結(jié)果進(jìn)行運(yùn)算,算出新的結(jié)果。在輸入的同時(shí)進(jìn)行運(yùn)算。為了將運(yùn)算不斷向前推進(jìn),則定義了3個(gè)分?jǐn)?shù)類的對(duì)象result ,f1,f2.以及兩個(gè)代表前后運(yùn)算符的字符型變量op1,op2。并通過對(duì)其不斷賦值,如op1=op2,實(shí)現(xiàn)運(yùn)算的推進(jìn).具體操作通過switch的嵌套實(shí)現(xiàn)。過程及其繁瑣,而且一旦語句出現(xiàn)偏差,極易出現(xiàn)難以發(fā)現(xiàn)的運(yùn)行錯(cuò)誤,即最終計(jì)算結(jié)果不正確。一下為函數(shù)的定義:/=混合運(yùn)算=void complex()fra

12、ction f1,f2,result;char op1,op2;cout<<"ATTENTION:為保證計(jì)算的準(zhǔn)確性,若需要輸入整數(shù)X進(jìn)行計(jì)算,請(qǐng)將該整數(shù)以X/1的形式進(jìn)行輸入!"cout<<"請(qǐng)依次輸入分?jǐn)?shù)(整數(shù))和運(yùn)算符,并以#結(jié)束n"op1=' 'cin>>f1>>op2;while(op2!='#')judgement=0;cin>>f2;switch(op1)case' ':result=f1;f1=f2;op1=op2;break;ca

13、se'+':switch(op2)case'+':case'-':result=result+f1;f1=f2;op1=op2;break;/case'*':f1=f1*f2;break;loopsmall1:case'/':if(f2=0)cout<<"被除數(shù)不能為0!n1.重新輸入該數(shù)。2.返回主菜單。n"int k4;cin>>k4;if(k4=1)cin>>f2;goto loopsmall1;else judgement=1;return;/ 由此實(shí)

14、現(xiàn)由外部函數(shù)直接回到主函數(shù)頭部 1111f1=f1/f2;break;/op1=op2break;case'-':switch(op2)case'+':case'-':result=result-f1;f1=f2;op1=op2;break;/case'*':f1=f1*f2;break;loopsmall2:case'/':if(f2=0)cout<<"被除數(shù)不能為0!n1.重新輸入該數(shù)。2.返回主菜單。"int k4;cin>>k4;if(k4=1)cin>&g

15、t;f2;goto loopsmall2;else judgement=1;return; /1111f1=f1/f2;break;break;case'*':result=result*f1;f1=f2;op1=op2;break;/case'/':if(f1=0)cout<<"倒數(shù)第二個(gè)數(shù)為0,不能作為被除數(shù)!現(xiàn)在返回主菜單n" judgement=1;return; /11111result=result/f1;f1=f2;op1=op2;break;/switch(op1) endcin>>op2; switc

16、h(op1)case'+':cout<<"結(jié)果為:"<<result+f1<<endl;break;case'-':cout<<"結(jié)果為:"<<result-f1<<endl;break;case'*':cout<<"結(jié)果為:"<<result*f1<<endl;break;loopsmall3:case'/':if(f1=0)cout<<"被

17、除數(shù)不能為0!n1.重新輸入該數(shù)。2.回到主菜單。"int k4;cin>>k4;if(k4=1)cin>>f1;goto loopsmall3;else judgement=1;return; /1111cout<<"結(jié)果為:"<<result/f1<<endl;break;/=混合運(yùn)算=問題7:異常處理,因?yàn)樯婕八膭t運(yùn)算,所以當(dāng)出現(xiàn)被除數(shù)為0的情況,必須進(jìn)行反應(yīng)。解決方案:(1)首先是分?jǐn)?shù)分母賦值為0的情況,這個(gè)在分?jǐn)?shù)類的成員函數(shù)定義時(shí)就設(shè)置了反應(yīng),結(jié)果是直接退出程序。void fraction:se

18、tden(int newden)if(newden != 0)d = newden;elsecout << "錯(cuò)誤: 試圖將分母設(shè)為零,不可以??!將直接退出程序!n" << "按任意鍵退出程序n" exit(0); (2)然后是在運(yùn)算的計(jì)算過程中,當(dāng)出現(xiàn)被除數(shù)為0的情況,會(huì)出現(xiàn)提示,并且選擇是否重新輸入,或者返回上級(jí)菜單,重新輸入通過goto語句跳轉(zhuǎn)到輸入語句實(shí)現(xiàn)。返回上級(jí)菜單一是通過goto語句實(shí)現(xiàn),若要返回到主菜單,則需要用到上面返回主函數(shù)開頭的程序代碼。,其中特別注意,在混合運(yùn)算函數(shù)中,需要特別設(shè)置標(biāo)識(shí)loop的位置,否則經(jīng)過運(yùn)算符賦值,會(huì)導(dǎo)致計(jì)算結(jié)果錯(cuò)誤。(3)在隨機(jī)測(cè)試的時(shí)候,取隨機(jī)數(shù)的時(shí)候可能會(huì)在分母上取到0,為此,必須現(xiàn)在代入計(jì)算時(shí)進(jìn)行檢驗(yàn),以防在測(cè)試過程中出現(xiàn)異常,而導(dǎo)致測(cè)試中斷。t1=rand()%10;t2=rand()%10;while(t1=0|t2=0)t1=rand()%10;t2=rand()%10; 問題8:四則運(yùn)算,菜單選擇實(shí)現(xiàn)都通過switch多分支語句實(shí)現(xiàn),特別要注意大括號(hào)問題,嵌套一旦復(fù)雜,極易出現(xiàn)漏括號(hào)的現(xiàn)象。因此需要注意括號(hào)的對(duì)齊,格式問題。心

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論