C語言程序設計——小學生口算刷題系統



僅使用 C 語言數組之前的知識編寫。

程序函數關系圖

函數功能及全局變量介紹

  • 代碼中已有詳細注釋的地方不再進行解釋。

全局變量

Cut( )函數

  • 此函數用於分割界面,使界面更為美觀。

Start( )函數

  • 此函數集成了開始菜單,年級的輸入,為了營造一個快樂而刺激的刷題體驗,程序與用戶有很多互動。

Number( )函數

  • 由於出題時要非常注重題目的難度,因此控制隨機數的位數極其重要,因此單獨封裝成一個函數處理。

myRand( )函數

  • 同上,很多時候生成的隨機數需要控制范圍,為了提高准確性,簡化判斷機制,單獨封裝函數來達成生成隨機數的目的。

correctMessage( )函數

incorrectMessage( )函數

Questions( )函數

  • 此函數是出題的中樞函數,集成了我設置的所有題型,並且出口對接着其他函數共同完成出題。

出題注意:

  1. 所有的題目中不能出現答案的得數是負數;
  2. 三年級之前的小學生還沒有學習交換律、結合律和分配律,命題的時候不能考查這些,及運算過程不能存在負數中間量;
  3. 涉及除法運算時,除數不能為0;
  4. 除法運算的得數不能出現小數,三年級前的普通學生並不能很好地進行這種運算;
  5. 出題時需要注意控制得數的位數,不能將題目搞得太難;
  6. 出含有乘法、除法運算的題目時,必須顯示數學符號“×”“÷”,否則小學生看不懂。

Game( )函數

  • 此函數集成了題目量控制、判斷答案正誤及超時作答、中途退出的功能。

judgment( )函數

  • 此函數用於分析用戶的作答情況,並給出一些提示和建議,並確認是否開啟下一輪練習。

Timer( )函數

  • 此函數用於獲取現在的時間。

outTime( )函數

Prepare( )函數

  • 此函數用於確認用戶的習題量,並給出溫馨提示,做好答題准備。

Ending( )函數

Addition( )函數

Subtraction( )函數

Multiplication( )函數

Division( )函數

Remainder( )函數

fourOperations( )函數

主函數

  • 集成了菜單函數、准備函數、題量控制及裁判函數、結算函數和結束函數。

運行效果,測試用例

開始頁面

一年級題目

  • 出題時由系統隨機出題,我並沒有完全按照作業要求出題,例如整十數減整十數的減法這類題,本質上是一位數加一位數,因此我對一些題型做了歸並處理。

一年級的題型有:

  1. 1/2位數 + 1位數;
  2. 1/2位數 - 1位數;
  3. 3個1位數的加減法運算。

二年級題目

  • 出題時由系統隨機出題,我並沒有完全按照作業要求出題,例如尾數是0三位數加法(和在一千以內的)這類題,本質上是二位數加二位數,因此我對一些題型做了歸並處理。

二年級的題型有:

  1. 九九乘法表及其逆運算;
  2. 2位數與2位數的加減運算;
  3. 求余運算;
  4. 簡易的四則運算。

三年級題目

  • 出題時由系統隨機出題,我並沒有完全按照作業要求出題,例如一位數乘一位這類題,本質上是九九乘法表,因此我對一些題型做了歸並處理。

三年級的題型有:

  1. 3位數與兩位數加減法運算(含連續進/退位);
  2. 兩位數乘一位數;
  3. 被除數是三位數求余運算;
  4. 考慮優先級的四則運算。

非法輸入

隨機給出習題量

  • 生成習題量的方式是生成一個兩位的隨機數。

超時作答

  • 超時作答的判定方式為單題答題結束時間減去開始時間超過15秒。

結算並開啟下一輪練習

  • 系統將會根據正確率100%、80%、60%、60%以下四種情況進行判定,同時對超時率30%以上也有判定。

調試碰到問題及解決辦法

Q1:有時候出題時會同時打出兩道題目。
A1:出題時,主要使用了switch多分支結構,由於該結構的特性,在缺少break語句時會繼續執行下一個case,就會出現同時出了兩道題的情況,補上break即可。
Q2:四則運算題時,會出現題目的中間量為負數的情況。
A2:利用循環生成題目,如果遇到會出現這種情況的數據,則重新生成。
Q3:出除法題時,會出現得數含有小數的情況,然而三年級之前的學生較難處理這類題。
A3:所有的除法題改為用乘法的逆運算出題。
Q4:出除法題時,會出出除零運算的題。
A4:利用我自己寫的隨機數函數,就不會出現數字0。
Q5:出題時,最后一種題型的題目不出現。
A5:我忘記了我自己的隨機數函數的生成范圍是開區間,修改上即可。
Q6:非法數據作答時,系統會直接跑完所有循環。
A6:由於這種情況系統不會崩潰,並且也可以實現強行退出,再加上實力問題,所以暫時沒有處理。
Q7:如何實現計時功能?
A7:原計划是判斷作答時間如果超過15秒就直接判錯,但是由於實力問題暫時不能實現,只能做到用戶作答之后判斷是否超時。
Q8:如何做到重開一輪練習?
A8:原計划是想使用“goto”語句,但是后來想一想,只需要在主函數套個循環即可,因此重構了菜單函數,重新定義一個准備函數將原本的題量輸入的部分放進去。
Q9:在不利用bug的情況下如何實現強退?
A9:原計划是想使用“goto”語句,但是后來想一想,只需要操作習題量,如果輸入負數,就直接讓題號加到習題量的上限,讓系統誤以為題目出完了即可。
Q10:為了避免猝不及防的開始,想要在開始練習之前設置倒計時。
A10:與舍友討論之后,學習了Sleep函數實現這個功能。
Q11:出題函數被老師指出代碼重復率很高。
A11:將不同的題型分別用函數封裝,通過控制傳入的參數達到控制難度的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM