代碼倉庫:https://git.coding.net/EtihwXD/Quiz.git
需求分析:
- 能夠指定生成數的範圍,生成題目的數量和存放題目的檔案
- 生成題目時應當計算出結果并儲存到檔案中,且結果應為真分數
- 給定一個存放題目的檔案和一個存放答案的檔案,能夠判斷出正确和錯誤的題數,指出正确/錯誤題目的序号,且指出已有題目中重複的部分。最後結果存入檔案中。
- 随機産生括号
功能設計:
- 應對輸入參數的合法性進行校驗
- 使用者未指定時,提供預設的生成題目數和存放檔案名
- 一道題的運算符不應超過三個
- 括号的分布應該合法且合理,如類似(a+b+c)的括号不應該存在
設計實作:
整個程式的邏輯主要分布在4個檔案中:
Quiz.cpp : 用int argc, char* argv[]來判斷輸入參數的合法性,并根據輸入參數的不同,進入不同的分支。
setQuiz.h : 存放生成題目所需函數的頭檔案。該頭檔案包含擷取整數/真分數,擷取運算符和生成數學表達式并存入檔案這三個函數。
duplicate.h : 存放題目查重功能的函數的頭檔案,查重功能後文描述
calculate.h : 存放計算表達式的函數的頭檔案。該頭檔案包含計算運算符優先級、求最大公約數、求最小公倍數、中綴表達式轉換為字尾表達式和計算字尾表達式這五個函數。
中綴表達式轉換為字尾表達式時,因為題目中真分數的存儲形式為(a'b/c),除法的存儲方式為a÷b。是以遇到真分數時,把真分數轉化為 (a*c+b)/c的形式再轉換;當遇到a÷b的情況時,因為÷在string中占2位,是以遇到÷就把/号存入string中并将計數器移後一位。
查重功能:實作查重功能時,我參考了哈希表的思想,建構了哈希表的表頭,将題目結果的第一個整數(題目結果可能是分數,是以隻取第一個整數)對10取模,分存在哈希表表頭的大小為10的數組裡。表頭的數組中的每一位都存儲着一個連結清單,連結清單的結點中存儲着題目的運算符、操作數和結果,并且這些資料已經通過排序算法排序。 每次需要查重時,就會調用查重算法,去表中尋找結果、操作數和運算符與目前式子都相同的節點,若這樣的節點存在,就說明這個題目之前已經出現過。
測試運作:
所有參數齊全時,輸出在控制台中,并且生成兩個檔案

輸入參數不合法時輸出
檔案比對功能,結果輸入Grade.txt檔案(題目檔案經過修改,并非用生成檔案進行比對)
一次生成10000條題目
個人軟體過程:
|
小結:
通過這次的作業,我深刻地認識到自己水準實在是太低了。開發這個程式的時候,我用的是c的文法,但使用了很多c++的函數,很多功能都是一邊查一邊學一邊寫的。這個程式的開發過程可以說是磕磕絆絆,對每一個功能,我先把思路畫到紙上進行分析,但在實際開發的時候總能遇到這樣那樣的問題,無數次地修改實作方法,甚至偶爾會推翻重來。可能是我的水準太低了,我在圖書館從14:30做到21:30也才完成了一個功能子產品的開發和測試,和周圍的同學相比實在是太慢了,但好在成功地在最後期限前完成了這個程式,這個程式的代碼有1100多行,非常繁雜。
在開發過程中,因為使用同樣的語言,我和郭達(@daleag)進行了許多次的交流,在很多問題上都得出了解決方案。我在交流中學到了很多解決問題的思路,這讓我受益良多。
在測試的時候,bug總是一個接一個地來,一段程式總是要修修補補才能真正發揮作用,一開始想到的思路常常是錯漏百出的。以後考慮問題一定要仔細、周全一些,如果可以的話更應該多和其他同學交流,集思廣益。