1.本章學習總結
1.1 思維導圖
1.2 本章學習體會及代碼量學習體會
1.2.1 學習體會
還未接觸函數時,覺得函數是很高大尚且復雜的東西,接觸之后發現其確實很高大尚且可以根據自己需求來完成屬於自己的函數,
實現了相似代碼封裝在同一函數,只要調用即可完成相似輸入輸出,在寫很長的代碼時大大簡化了代碼,可以說是未來寫代碼是比不可少的;
通過本章學習以及大作業的完成,對函數的使用已有了比較好的掌握,且在調試等方面的能力也相對的提高了;同時本章學習過程中,
每天敲代碼的任務完成的比較好,接下來也可以適當的對自己進行增量;本章還學習了全局變量和靜態變量,以及程序化程序設計思想這些比較
之前比較陌生的知識,了解到程序設計時先進行合理規划可以使寫代碼過程中思路更加清晰,且全局和靜態變量的定義增加了程序的靈活性。
1.2.2 代碼累計
2.PTA總分
2.1截圖PTA中函數題目集的排名得分
2.2 我的總分:
- 2018-c-函數:145分
- 總分:145分
3.PTA實驗作業
3.1 PTA題目1
本題要求實現兩個函數:一個函數判斷給定正整數的各位數字之和是否等於5;
另一個函數統計給定區間內有多少個滿足上述要求的整數,並計算這些整數的和。
3.1.1 算法分析
int is(int number)
{
定義整型變量digit用於存放一個數的各個位數的數字;
定義整型變量sum1用於計算各位數字之和;
while number!=0 do
digit=number%10;
sum1=sum1+digit;
number=number/10; /*求給定正整數的各位數字之和*/
end while
if sum1==5 then
返回值1 //各位數字之和為5時返回值1
else do
返回值0
end if
}
void count_sum(int a,int b)
{
定義i用於循環的使用;
定義整型變量count用於計數滿足個位數字之和的正整數的個數;
定義整型變量sum用於求和滿足條件的正整數;
定義整型變量t用於中途存放某個數;
if a>b then
t=a;a=b;b=t;
end if
for i=a to b do
if is(i)==1 then
count++;
sum=sum+i; /*計數及求和在[a,b] 區間內滿足條件的正整數*/
end if
輸出count和sum的值
}
3.1.2 代碼截圖
3.1.3 測試數據
3.1.4 PTA提交列表及說明
Q1:剛開始錯誤問題較多,進行代碼閱讀和查錯;
A1:發現我將is(i)賦值給sum,而is(i)返回值是0和1,明顯錯誤,改成將i賦值給sum即可;
Q2:更改完后依舊錯誤;
A2:調試並沒有發現問題所在,然后有進行題目細讀,發現int is( int number )函數中沒有考慮到題目中返回0的情況;
Q3:再次提交,發現如下圖1所示錯誤;
A3:向同學請教了解到此錯誤是沒有考慮到a和b相等時的情況,解決方法是在加一個if語句單獨考慮a==b的情況;
圖1
4.大作業
4.1.函數關系圖
4.2.函數功能介紹
1.函數1:main()
- 功能:顯示主菜單;進入相應等級的函數進行作答;提示是否繼續做題;
- 思路:
- 1.顯示主菜單
- 2.提示輸入等級和題數,判斷輸入是否正確並進行規范;
- 3.運用switch判斷grade,進入相應等級的函數進行測試,若grade不為1,2,3則回到開始重新進行輸入;
- 4.提示是否進行在一輪的刷題,運用if語句進行判斷是的話隨機輸入一個數,不進行下一輪的刷題則輸入0;
函數代碼圖如下:
2.函數2:gradeOne(int n)
- 功能:實現1位數的一步加減乘除計算測試;
- 思路:
- 1.進入for循環(循環的范圍為1到所要做的題數)
- 2.在循環中生成三個隨機數x,y,op,以保證每道題的數值和符號隨機;x,y是計算用的隨機1位數,op產生的隨機數用於實現符號的隨機;
- 3.運用switch語句先判斷符號類型,在進行相應的答題,運用if語句判斷正誤並進行相應提示;
- 4.如果正確則count數加1;
- 5.計算每道題計算所花的時間的進行相應的輸出(代碼中有注釋);
- 6.for語句出來后,計算rate(正確率)=count*1.0/n;
代碼截圖如下
3.函數3:gradeTwo(int n)
- 功能:實現2位數的2步加減運算測試;
- 思路:答題思路與gradeOne(int n)相似;
- 有所不同的地方是,此等級進行兩步加減運算,所以我讓判斷符號的隨機數進行兩次的依次運算,計算出程序所給式子的結果,在與刷題人的結果進行對比;
- 此計時操作和計算正確率的操作等上個函數已做說明,不在詳細;
代碼截圖如下:
4.函數4:gradeThree(int n)
- 功能:實現3位數的2步加減運算測試;
- 思路:與函數3類似,不做說明直接上圖;
函數截圖如下:
函數5:correctMessage()
- 功能:當刷題者答對時,進行的4種中隨機一種的提示說明,使程序更友好;
- 思路簡單不做說明
代碼截圖如下:
5.函數5:errorMessage()
- 功能:當刷題者答錯時,進行的4種中隨機一種的提示說明,使程序更友好;
- 思路簡單不做說明
代碼截圖如下:
6.函數6:press()
- 功能:實現按任意鍵繼續的操作;
函數截圖如下:
4.3 運行結果截圖
4.4 調試碰到問題及解決辦法
- Q1:輸入非法字符,導致程序崩潰;
- A1:剛開始想着運用一個函數去解決,但函數返回值唯一且在另一個函數中再次輸入的值會有所變化,導致程序進入死循環;
后詢問同學及群上討論的改正方法,后用while語句實現實現; - Q2:輸入答案正誤提示單調;
- A2:設置兩個函數分別包含四種不同類型的提示;
- Q3:計算一題題目所花時間的問題;
- A3:通過網上查閱資料,運用time.h頭文件中的一個代碼進行實現;
- Q4:程序運行時只在一個頁面進行導致的頁面繁瑣問題;
- A4:也是網上資料查詢,運用清屏函數和按任意鍵繼續的函數進行解決;
- Q5:一步計算的除法輸出有誤,無法與刷題者的答案匹配,即使提示答案正確也顯示錯誤的問題;
- A5:將除法輸入答案改為商(整數)+余數的輸出,不用小數部分(考慮到一位數的刷題多為一到二年級,未接觸小數);
4.5 大作業總結
先提出大作業的一些不足:函數之間的關系性不是很強,都是分開獨立的,像函數3,函數4其實是類似的函數,應該想辦法將其和為一個函數,而這也導致了代碼量偏多;
再者,就是函數之間的無關聯導致想寫出有優先級函數顯得非常困難,這也是未解決的問題。
這次大作業花了很長的時間,但是一分耕耘一分收獲,收獲還是很多的。首先在解決程序問題過程中學習到了一些未見過的函數,如清屏函數和按任意鍵繼續的函數等;
其次,寫大作業的過程也是bug不斷出現的過程,而且代碼關系相對密切,更改時會變動較多的代碼,在這不斷地調試更改的過程中,也使我對調試器更加熟練,且閱讀代碼能力
得到提升;然后就是下次對函數的封裝要有很好的規划,否者就會導致代碼量超多且復雜的問題。