1.本章學習總結
1.1思維導圖
1.2本章學習體會及代碼量學習體會
1.2.1學習體會
本周學習了函數,其實,函數于之前學習的三大控制結構是密不可分的,而函數又有其特殊的地方,例如:函數的聲明、函數的調用等等。我們之前編寫程序是將過程寫在主函數中,而函數則是將思路過程單獨放出來寫在主函數的外面,這樣編寫程序可以使得主函數更加簡潔明了,使人閱讀起來一目了然。一開始學習函數的時候,我還嫌用函數做麻煩,同樣的代碼,用函數寫起來又長又不方便,覺得調用函數多此一舉。后來在學習的過程中,及老師上課的講解下,明白了:目前我們編寫的程序又簡單又短,比起調用函數,直接在主函數中編程更加方便。而當我們要編寫一個大程序且多次用到同一種運算方法時,調用函數就是一個很好的方法,就可以不用重復多次的編寫相同的代碼,是程序更加簡潔。
1.2.2代碼累計
2.PTA總分
2.1截圖PTA中函數題目集的排名得分
2.2 我的總分
函數:145
總分:145
3.PTA實驗作業
3.1 PTA題目1
使用函數輸出指定范圍內的Fibonacci數
本題要求實現一個計算Fibonacci數的簡單函數,并利用其實現另一個函數,輸出兩正整數m和n(0<m≤n≤10000)之間的所有Fibonacci數。所謂Fibonacci數列就是滿足任一項數字是前兩項的和(最開始兩項均定義為1)的數列。
3.1.1 算法分析
- fib( n )函數
定義整型變量i、三個雙精度浮點型變量int1=1、int2=1、int3//用于實現Fibonacci數的累加
if n=1 或者 n=2 thenreturn 1 //當n小于3時,返回1
for i=3 to i=n doint3=int1+int2 //int3等于前兩個數的和int1=int2 //將第二個數的值賦給第一個數int2=int3 //將第三個數的值賦給第二個數
end for //依此循環,實現Fibonacci數
返回 int3 的值
- PrintFN( m , n )函數
定義整型變量i=1、flag=1//flag用于判斷是否有Fibonacci數
while fib(i)<m do //讓Fibonacci數增加到mi++
end while
while fib(i)<=n doflag=0if fib(i+1)<=n then //判斷該項Fibonacci數是否為范圍內最后一項輸出 fib(i) 后輸出空格 //不是,則在輸出該數后輸出空格else輸出 fib(i) 后換行 //是,則在輸出該項后換行end ifi++
end while
if flag=1 then //沒有Fibonacci數輸出 No Fibonacci number
end if
3.1.2 代碼截圖
3.1.3 測試數據
測試數據1
測試數據2
3.1.4 PTA提交列表及說明
Q:部分正確是有什么地方沒考慮到嗎?
A:一開始沒考慮到第二個函數中只有1個1的情況,在另外加上這個條件語句后,這條測試點過了。
Q:中間出現的編譯錯誤是什么情況?
A:第一次部分正確后,在添加條件語句的時候不小心將等號寫成了賦值號。
Q:過了該測試點,還有什么問題?
A:之后提交多次發現 最大范圍 的那個測試點過不了,之前遇到這類問題,改變一下數據類型就好了,但是我改變了數據類型后,還是一樣的結果。在多次嘗試未果下,請教了其他同學。但是也不知道為什么過不了,就轉換了一下解題思路,換了種方法做,才將題目解出來。
4.大作業
4.1.函數關系圖
4.2.函數功能介紹
1.友好輸出界面函數,供用戶查看
輸出友好界面,供用戶查看,解決非法字符輸入問題,專治熊孩子
void Menu();//顯示菜單
int LevelChoice();//級別選擇
2.隨機獲取數值、運算符
使得用戶做的題目不同,做到隨機出題
- void NumberGet();//獲取隨機數
- void OperatorGet();//獲取隨機運算符
3.游戲運行主干函數
用于整合各個函數,保證程序運行
- void GameBegin();//游戲主程序
4.計算函數
計算程序隨機給出的題目,用于判斷用戶答案的正誤
- double Calculate();//題目計算
5.void Choice();
一輪游戲結束后,選擇是否繼續游戲
4.3 運行結果截圖
- 非法輸入(專治熊孩子)
- 情況一
- 情況二
- 正常輸入
- 1
- 2
- 直接退出
4.4 調試碰到問題及解決辦法
Q:是怎么解決熊孩子問題的?
A:最開始的時候,將輸入的選項定義成整型,在調試的過程中發現程序無法識別除數字外的非法字符,然后就考慮用字符變量的方法做,改完代碼后就可以識別任意的非法字符。在舍友的提醒下,發現還存在著一個bug,萬一那孩子特皮,輸入了一連串的非法字符該怎么辦?后來想到可以用while循環消除掉一連串的非法字符。
Q:在改動非法字符輸入的那塊程序時,出現了無法輸入的情況,是怎么解決的?
A:一開始是懵的,后來突然想到,前面有輸出的時候要用一個空格吃掉字符,再進行輸入。
Q:一級難度中除法除不盡的情況下,是怎樣解決判斷正誤的問題的?
A:剛開始的時候,全部用整型數據,調試的時候也除法直接取整,覺得一點毛病也沒有。后來寫著寫著突然醒悟,這不是C語言,是小學生的四則運算。然后就把所有數據都改成了double類型的,后來再運行的過程中發現,當除數除不盡的情況下輸出正確答案也顯示答案錯誤。經過一番思考,發現電腦中的結果是無限小數,與我們輸入的數永遠不可能相等。然后我就在想該怎樣將無限小數四舍五入成有限的兩位小數。第一個反應是強制類型轉換,然后經過試驗之后發現這個方法是可行的。
(強制轉換做法:rightAnswer=number1/number2+0.005; rightAnswer=1.0*((int)(rightAnswer*100))/100;)
4.5 大作業總結
其實,編寫代碼就是一個寫代碼,發現bug,改代碼的過程。在寫大作業的過程中,寫著寫著就發現,啊,之前有一種情況又沒想到,然后就火急火燎的返回去改,改一次代碼就要改動好多地方,改完繼續寫,這時候又有人提出來會存在怎樣的bug,回頭一看,哎呀,我也有這樣的問題,然后再次大動干戈地改動。編寫代碼就在反反復復的查看代碼,尋找bug,改代碼。這是都是需要耐心的。但是在代碼完成,已知bug改正完畢之后,一股自豪感又會油然而生。