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

下載本文檔

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

文檔簡介

1、<p><b>  C++課程設(shè)計(jì)報告</b></p><p>  題 目: 分?jǐn)?shù)計(jì)算器 </p><p>  年 級: </p><p>  專 業(yè): 通信工程 </p><p>  姓 名:

2、 </p><p>  指導(dǎo)老師: </p><p>  難 度 B 級 </p><p><b>  教師評語:</b></p><p><b>  1.程序功能介紹</b></p><p>

3、  分?jǐn)?shù)計(jì)算器及測試程序,具有對輸入的運(yùn)算進(jìn)行“+,-,*,/,^”的功能</p><p><b>  2 .程序設(shè)計(jì)要求</b></p><p>  完成計(jì)算器程序,對main函數(shù)的結(jié)構(gòu)進(jìn)行改進(jìn),要求有詳細(xì)的菜單選項(xiàng)界面,用戶不選擇退出就可以反復(fù)運(yùn)算。</p><p>  完善程序,改為多操作數(shù)基本四則運(yùn)算,遇#停止。</p>

4、<p>  增加函數(shù),完成四則混合運(yùn)算,注意算法要考慮運(yùn)算符的優(yōu)先級,對應(yīng)增加主菜單選項(xiàng)。</p><p>  增加語句使四則運(yùn)算具有測試功能,即計(jì)算機(jī)能夠 自動出題,并要求用戶計(jì)算,同時計(jì)算機(jī)判斷用戶計(jì)算的對錯并打分,要求十題一個單元,每題一個運(yùn)算符,參與運(yùn)算的分子分母均為一位數(shù),運(yùn)算符包括加,減,乘,除及大于小于等邏輯運(yùn)算符。</p><p><b>  3. 基本

5、數(shù)據(jù)結(jié)構(gòu)</b></p><p>  含有整型變量 ,字符變量,實(shí)型變量,還定義了一個分?jǐn)?shù)類;</p><p>  除此之外還有以下函數(shù):1。分?jǐn)?shù)轉(zhuǎn)換為小數(shù);2。分?jǐn)?shù)轉(zhuǎn)換為帶分?jǐn)?shù);3。實(shí)現(xiàn)簡單計(jì)算的函數(shù);4。混合運(yùn)算函數(shù);5。隨機(jī)測試題函數(shù);6。清屏函數(shù)。</p><p>  此外還多處運(yùn)用了運(yùn)算符的重載</p><p>  4.

6、 程序運(yùn)行結(jié)果界面</p><p><b>  1. 初始界面</b></p><p><b>  2.功能1</b></p><p><b>  3.功能2</b></p><p><b>  4.功能3</b></p><p>

7、<b>  5.功能4</b></p><p><b>  6.功能5</b></p><p>  5. 課程設(shè)計(jì)遇到的技術(shù)問題與解決思路</p><p><b>  問題1:分?jǐn)?shù)的表示</b></p><p>  解決辦法:建立函數(shù),分別置分母,分子,同時構(gòu)造約分函數(shù)<

8、;/p><p>  問題2:真分?jǐn)?shù)的表示</p><p>  解決辦法:構(gòu)造函數(shù),置整數(shù)部分和分?jǐn)?shù)部分</p><p>  書本提供的源代碼雖然較為完備,但也存在一些錯誤。</p><p>  問題3:乘方的函數(shù)功能實(shí)現(xiàn),書本提供的原有的類中重載的“^”運(yùn)算符無法實(shí)現(xiàn)乘方運(yùn)算</p><p>  解決辦法:考慮到“^”運(yùn)算

9、符作為位運(yùn)算符,不能按照雙目運(yùn)算符的重載格式進(jìn)行重載,故,將用于代碼內(nèi)部的“^”運(yùn)算符改為“%”雙目運(yùn)算符進(jìn)行重載,進(jìn)行重載運(yùn)算,但對外輸入輸出,仍使用作為字符常量的^,解決了源代碼中,分?jǐn)?shù)運(yùn)算乘方無法實(shí)現(xiàn)的問題。</p><p>  fraction operator% (const fraction &base, int exp) //^運(yùn)算符并非雙目運(yùn)算符<

10、/p><p>  //不可按照雙目運(yùn)算的方法重載,故修改為%,進(jìn)行內(nèi)部操作</p><p><b>  {</b></p><p>  fraction returnValue;</p><p>  returnValue.setnum(pow(base.numerator(), exp));</p><

11、p>  returnValue.setden(pow(base.denominator(), exp));</p><p>  returnValue.simplify();</p><p>  return returnValue;</p><p><b>  }</b></p><p>  問題4:輸出運(yùn)算符&

12、lt;<重載不完善,因?yàn)閷τ诤瘮?shù)參數(shù)分?jǐn)?shù)首先進(jìn)行了取絕對值運(yùn)算,從而導(dǎo)致對于輸出負(fù)分?jǐn)?shù)的時候,無法正確輸出。</p><p>  解決辦法:重新對重載函數(shù)進(jìn)行改寫,先判斷原參數(shù)分?jǐn)?shù)的正負(fù),若為負(fù),則先輸出“-”后,再取絕對值,進(jìn)行分子分母的分別輸出操作。而且原代碼中對于分?jǐn)?shù)正負(fù)的判斷極為繁瑣,故直接調(diào)用已經(jīng)重載過的“>”進(jìn)行判斷。</p><p>  ostream &

13、 operator<< (ostream &os, const fraction &f)</p><p><b>  {</b></p><p>  if(f.decimal()<0) // This extremely complex and seemingly </p><p&

14、gt;  os << "-"; // useless if statement tests to see if</p><p>  // fraction f is negative.現(xiàn)已修改</p><p>  fraction temp = f.absval();</p><p>  

15、int numer = f.numerator();</p><p>  int denom = f.denominator();</p><p>  if(temp.numerator() == 0 || temp.denominator() == 1)</p><p>  os << temp.numerator();</p><

16、p><b>  else</b></p><p>  os << temp.numerator() << '/' << temp.denominator();</p><p>  return os;</p><p><b>  }</b></p>&

17、lt;p>  問題5:考慮到人性化的操作,實(shí)現(xiàn)用戶不選擇退出,就可以實(shí)現(xiàn)持續(xù)的操作,故設(shè)計(jì)了一系列的多級菜單,從而實(shí)現(xiàn)用戶結(jié)束一個操作之后,可以選擇繼續(xù)本操作。如果不繼續(xù)操作,則可以選擇回到上一個菜單,或者回到主菜單,或者直接退出。但是為了實(shí)現(xiàn)這一系列的選擇操作,可是費(fèi)了一番功夫。</p><p><b>  解決辦法:</b></p><p>  首先對于是否

18、繼續(xù)的選擇操作,定義的字符型變量ch,為了防止變量名重復(fù),主菜單對應(yīng)的每一個操作,在ch后都設(shè)置了不同的數(shù)字,與主菜單后的每個操作前數(shù)字一致。利用if語句進(jìn)行判斷。如果,用戶選擇不繼續(xù)本次操作,那么就輸出另一個選擇菜單,選擇是返回上一級的菜單還是直接退出程序,并且具備了一定的異常處理功能,如果輸入錯誤的指令,則會顯示出來,要求用戶重新輸入代碼,為了大大簡化程序,此功能利用goto語句實(shí)現(xiàn)。</p><p>  l

19、oop1:if(ch1=='N'||ch1=='n')</p><p><b>  {</b></p><p>  cout<<"1.返回主菜單;2,直接退出程序\n";</p><p>  char ch11;</p><p>  cin>>c

20、h11;</p><p>  switch(ch11)</p><p><b>  {</b></p><p>  case'1':main();</p><p>  case'2':exit(0);</p><p>  default:{cout<<&

21、quot;輸入指令不正確,請重新輸入!\n";goto loop1;}</p><p><b>  }</b></p><p><b>  }</b></p><p>  關(guān)于實(shí)現(xiàn)在函數(shù)執(zhí)行過程中返回主函數(shù),可謂大費(fèi)周章了,首先通過查資料得知,在main()內(nèi)部返回主函數(shù)開頭,可以在語句中直接使用main();語

22、句。但是,在外部定義的函數(shù)中,不能使用該語句,否則將出現(xiàn)error C2065: 'main' : undeclared identifier</p><p>  error C2373: 'main' : redefinition; different type modifiers</p><p>  這兩個語法錯誤,為了解決該問題,想到了使用goto語句

23、,但是該語句無法在函數(shù)間跳躍,故而只得作罷。然后又想到利用返回值進(jìn)行判斷,但是,每次判斷是,則要執(zhí)行被調(diào)函數(shù),再一次運(yùn)行一次混合運(yùn)算函數(shù),或者是測試函數(shù),顯然是不可以的。最終,查了一些資料,獲得啟發(fā)。無返回值類型的函數(shù),通過return;語句可以直接跳出該函數(shù)。于是定義了一個全局變量judgement,當(dāng)遭遇需要返回主菜單時,便將judgement進(jìn)行賦值為1,隨后跳出,對judgement進(jìn)行判斷,從而判斷是否返回主菜單,如是,則配合

24、主函數(shù)中的main()返回到主函數(shù)開頭。</p><p>  在隨后要講到的異常處理部分,當(dāng)檢測到被除數(shù)為0的時候,則彈出提示消息,并且可以選擇是否重新輸入該數(shù)字,或者直接返回上一級菜單。</p><p><b>  if(f2==0)</b></p><p><b>  {</b></p><p>

25、;  cout<<"被除數(shù)不能為0?。n1.重新輸入該數(shù)。2.返回主菜單。\n";</p><p><b>  int k4;</b></p><p><b>  cin>>k4;</b></p><p><b>  if(k4==1)</b></p

26、><p><b>  {</b></p><p><b>  cin>>f2;</b></p><p>  goto loopsmall1;</p><p><b>  }</b></p><p>  else {judgement=1;retu

27、rn;} //由此實(shí)現(xiàn)由外部函數(shù)直接回到主函數(shù)頭部 </p><p><b>  }</b></p><p>  if(judgement==1)main();</p><p>  問題6:混合運(yùn)算的核心問題即是優(yōu)先級的控制;</p><p>  解決辦法:為了實(shí)現(xiàn)運(yùn)算的優(yōu)先級,

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

29、。一下為函數(shù)的定義:</p><p>  //==========================================混合運(yùn)算====================================================================</p><p>  void complex()</p><p><b>  {&

30、lt;/b></p><p>  fraction f1,f2,result;</p><p>  char op1,op2;</p><p>  cout<<"ATTENTION:為保證計(jì)算的準(zhǔn)確性,若需要輸入整數(shù)X進(jìn)行計(jì)算,請將該整數(shù)以X/1的形式進(jìn)行輸入!!!";</p><p>  cout<

31、;<"請依次輸入分?jǐn)?shù)(整數(shù))和運(yùn)算符,并以#結(jié)束~\n";</p><p><b>  op1=' ';</b></p><p>  cin>>f1>>op2;</p><p>  while(op2!='#')</p><p><b

32、>  {</b></p><p>  judgement=0;</p><p><b>  cin>>f2;</b></p><p>  switch(op1)</p><p><b>  {</b></p><p>  case' &#

33、39;:result=f1;f1=f2;op1=op2;break;</p><p><b>  case'+':</b></p><p><b>  {</b></p><p>  switch(op2)</p><p><b>  {</b></p&g

34、t;<p><b>  case'+':</b></p><p>  case'-':result=result+f1;f1=f2;op1=op2;break;//</p><p>  case'*':f1=f1*f2;break;</p><p>  loopsmall1:c

35、ase'/':</p><p><b>  {</b></p><p><b>  if(f2==0)</b></p><p><b>  {</b></p><p>  cout<<"被除數(shù)不能為0?。n1.重新輸入該數(shù)。2.返回主菜單

36、。\n";</p><p><b>  int k4;</b></p><p><b>  cin>>k4;</b></p><p><b>  if(k4==1)</b></p><p><b>  {</b></p>

37、<p><b>  cin>>f2;</b></p><p>  goto loopsmall1;</p><p><b>  }</b></p><p>  else {judgement=1;return;}// 由此實(shí)現(xiàn)由外部函數(shù)直接回到主函數(shù)頭部

38、 1111</p><p><b>  }</b></p><p>  f1=f1/f2;break;//op1=op2</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }bre

39、ak;</b></p><p><b>  case'-':</b></p><p><b>  {</b></p><p>  switch(op2)</p><p><b>  {</b></p><p><b>

40、;  case'+':</b></p><p>  case'-':result=result-f1;f1=f2;op1=op2;break;//</p><p>  case'*':f1=f1*f2;break;</p><p>  loopsmall2:case'/':</p

41、><p><b>  {</b></p><p><b>  if(f2==0)</b></p><p><b>  {</b></p><p>  cout<<"被除數(shù)不能為0?。n1.重新輸入該數(shù)。2.返回主菜單。";</p>&

42、lt;p><b>  int k4;</b></p><p><b>  cin>>k4;</b></p><p><b>  if(k4==1)</b></p><p><b>  {</b></p><p><b>  c

43、in>>f2;</b></p><p>  goto loopsmall2;</p><p><b>  }</b></p><p>  else {judgement=1;return;} //1111</p><p><b>  }

44、</b></p><p>  f1=f1/f2;break;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }break;</b></p><p>  case'*'

45、;:result=result*f1;f1=f2;op1=op2;break;//</p><p><b>  case'/':{</b></p><p><b>  if(f1==0)</b></p><p>  {cout<<"倒數(shù)第二個數(shù)為0,不能作為被除數(shù)?。?!現(xiàn)在返回主菜單

46、\n";</p><p>  judgement=1;return; //11111</p><p><b>  }</b></p><p>  result=result/f1;</p><p>  f1=f2;op1=op2;break;/

47、/</p><p><b>  }</b></p><p>  }//switch(op1) end</p><p><b>  cin>>op2;</b></p><p><b>  }</b></p><p>  switch(op1)&

48、lt;/p><p><b>  {</b></p><p>  case'+':cout<<"結(jié)果為:"<<result+f1<<endl;break;</p><p>  case'-':cout<<"結(jié)果為:"<<

49、result-f1<<endl;break;</p><p>  case'*':cout<<"結(jié)果為:"<<result*f1<<endl;break;</p><p>  loopsmall3:case'/':if(f1==0)</p><p><b&g

50、t;  {</b></p><p>  cout<<"被除數(shù)不能為0!!\n1.重新輸入該數(shù)。2.回到主菜單。";</p><p><b>  int k4;</b></p><p><b>  cin>>k4;</b></p><p><

51、;b>  if(k4==1)</b></p><p><b>  {</b></p><p><b>  cin>>f1;</b></p><p>  goto loopsmall3;</p><p><b>  }</b></p>

52、<p>  else {judgement=1;return;} //1111</p><p>  }cout<<"結(jié)果為:"<<result/f1<<endl;break;</p><p><b>  }</b></p><p&g

53、t;<b>  }</b></p><p>  //======================================混合運(yùn)算===========================================================</p><p>  問題7:異常處理,因?yàn)樯婕八膭t運(yùn)算,所以當(dāng)出現(xiàn)被除數(shù)為0的情況,必須進(jìn)行反應(yīng)。</p&g

54、t;<p><b>  解決方案:</b></p><p>  (1)首先是分?jǐn)?shù)分母賦值為0的情況,這個在分?jǐn)?shù)類的成員函數(shù)定義時就設(shè)置了反應(yīng),結(jié)果是直接退出程序。</p><p>  void fraction::setden(int newden)</p><p><b>  {</b></p>

55、<p>  if(newden != 0)</p><p>  d = newden;</p><p><b>  else</b></p><p><b>  {</b></p><p>  cout << "錯誤: 試圖將分母設(shè)為零,不可以啊?。⒅苯油顺龀绦?/p>

56、!!\n"</p><p>  << "按任意鍵退出程序\n";</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p><b>  }</b></p><p&g

57、t;  (2)然后是在運(yùn)算的計(jì)算過程中,當(dāng)出現(xiàn)被除數(shù)為0的情況,會出現(xiàn)提示,并且選擇是否重新輸入,或者返回上級菜單,重新輸入通過goto語句跳轉(zhuǎn)到輸入語句實(shí)現(xiàn)。返回上級菜單一是通過goto語句實(shí)現(xiàn),若要返回到主菜單,則需要用到上面返回主函數(shù)開頭的程序代碼。,其中特別注意,在混合運(yùn)算函數(shù)中,需要特別設(shè)置標(biāo)識loop的位置,否則經(jīng)過運(yùn)算符賦值,會導(dǎo)致計(jì)算結(jié)果錯誤。</p><p>  (3)在隨機(jī)測試的時候,取隨機(jī)數(shù)

58、的時候可能會在分母上取到0,為此,必須現(xiàn)在代入計(jì)算時進(jìn)行檢驗(yàn),以防在測試過程中出現(xiàn)異常,而導(dǎo)致測試中斷。</p><p>  t1=rand()%10;</p><p>  t2=rand()%10;</p><p>  while(t1==0||t2==0)</p><p><b>  {</b></p>

59、<p>  t1=rand()%10;</p><p>  t2=rand()%10;</p><p><b>  } </b></p><p>  問題8:四則運(yùn)算,菜單選擇實(shí)現(xiàn)</p><p>  都通過switch多分支語句實(shí)現(xiàn),特別要注意大括號問題,嵌套一旦復(fù)雜,極易出現(xiàn)漏括號的現(xiàn)象。因此需

60、要注意括號的對齊,格式問題。</p><p><b>  心得體會:</b></p><p>  1.一個較復(fù)雜的,實(shí)現(xiàn)各種功能的程序,在設(shè)計(jì)的時候,可以將其不同的功能先單獨(dú)書寫,先行編譯連接運(yùn)行,調(diào)試過程中進(jìn)行修改,這樣比較清楚。如果放在整個大程序中,時常會不知道問題出在哪里。</p><p>  2.有時候,編譯錯誤并不可怕,當(dāng)編譯沒有錯,

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論