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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

12、ction f1,f2,result;char op1,op2;cout<<"ATTENTION:為保證計算的準確性,若需要輸入整數X進行計算,請將該整數以X/1的形式進行輸入!"cout<<"請依次輸入分數(整數)和運算符,并以#結束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<<"被除數不能為0!n1.重新輸入該數。2.返回主菜單。n"int k4;cin>>k4;if(k4=1)cin>>f2;goto loopsmall1;else judgement=1;return;/ 由此實

14、現由外部函數直接回到主函數頭部 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<<"被除數不能為0!n1.重新輸入該數。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<<"倒數第二個數為0,不能作為被除數!現在返回主菜單n" judgement=1;return; /11111result=result/f1;f1=f2;op1=op2;break;/switch(op1) endcin>>op2; switc

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

17、除數不能為0!n1.重新輸入該數。2.回到主菜單。"int k4;cin>>k4;if(k4=1)cin>>f1;goto loopsmall3;else judgement=1;return; /1111cout<<"結果為:"<<result/f1<<endl;break;/=混合運算=問題7:異常處理,因為涉及四則運算,所以當出現被除數為0的情況,必須進行反應。解決方案:(1)首先是分數分母賦值為0的情況,這個在分數類的成員函數定義時就設置了反應,結果是直接退出程序。void fraction:se

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

溫馨提示

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

評論

0/150

提交評論