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

下載本文檔

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

文檔簡介

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

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

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

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

5、調(diào)用已經(jīng)重載過的“>”進行判斷。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:考慮到人性化的操作,實現(xiàn)用戶不選擇退出,就可以實現(xiàn)持續(xù)的操作,故設(shè)計了一系列的多級菜單,從而實現(xiàn)用戶結(jié)束一個操作之后,可以選擇繼續(xù)本操作。如果不繼續(xù)操作,則可以選擇回到上一個菜單,或者回到主菜單,或者

7、直接退出。但是為了實現(xiàn)這一系列的選擇操作,可是費了一番功夫。解決辦法:(1) 首先對于是否繼續(xù)的選擇操作,定義的字符型變量ch,為了防止變量名重復(fù),主菜單對應(yīng)的每一個操作,在ch后都設(shè)置了不同的數(shù)字,與主菜單后的每個操作前數(shù)字一致。利用if語句進行判斷。如果,用戶選擇不繼續(xù)本次操作,那么就輸出另一個選擇菜單,選擇是返回上一級的菜單還是直接退出程序,并且具備了一定的異常處理功能,如果輸入錯誤的指令,則會顯示出來,要求用戶重新輸入代碼,為了大大簡化程序,此功能利用goto語句實現(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<<"輸入指令不正確,請重新輸入!n"goto loop1;(2) 關(guān)于實現(xiàn)在函數(shù)執(zhí)行過程中返回主函數(shù),可謂大費周章了,首先通過查資料得知,在main()內(nèi)部返回主函數(shù)開頭,可以在語句中直接使用main();語句。但是,在外部定義的函數(shù)中,不能使用該語句,否則將出現(xiàn)error C2065: 'main' :

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

10、跳出,對judgement進行判斷,從而判斷是否返回主菜單,如是,則配合主函數(shù)中的main()返回到主函數(shù)開頭。(3) 在隨后要講到的異常處理部分,當(dāng)檢測到被除數(shù)為0的時候,則彈出提示消息,并且可以選擇是否重新輸入該數(shù)字,或者直接返回上一級菜單。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; /由此實現(xiàn)由外部函數(shù)直接回到主函數(shù)頭部 if(judgement=1

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

12、ction f1,f2,result;char op1,op2;cout<<"ATTENTION:為保證計算的準(zhǔn)確性,若需要輸入整數(shù)X進行計算,請將該整數(shù)以X/1的形式進行輸入!"cout<<"請依次輸入分?jǐn)?shù)(整數(shù))和運算符,并以#結(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;/ 由此實

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ù)第二個數(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;/=混合運算=問題7:異常處理,因為涉及四則運算,所以當(dāng)出現(xiàn)被除數(shù)為0的情況,必須進行反應(yīng)。解決方案:(1)首先是分?jǐn)?shù)分母賦值為0的情況,這個在分?jǐn)?shù)類的成員函數(shù)定義時就設(shè)置了反應(yīng),結(jié)果是直接退出程序。void fraction:se

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

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論