個人專案:中小學生數學卷子自動生成程式。——隊友程式碼點評
今天開始了結對程式設計專案,在做結對專案之前我們需要對隊友的程式碼進行分析點評,所以在閱讀隊友工程程式碼並測試後,我有了以下觀點:
題目需求:
1、命令列輸入使用者名稱和密碼,兩者之間用空格隔開(程式預設小學、初中和高中各三個賬號,具體見附表),如果使用者名稱和密碼都正確,將根據賬戶型別顯示“當前選擇為XX出題”,XX為小學、初中和高中三個選項中的一個。否則提示“請輸入正確的使用者名稱、密碼”,重新輸入使用者名稱、密碼;
2、登入後,系統提示“準備生成XX數學題目,請輸入生成題目數量(輸入-1將退出當前使用者,重新登入):”,XX為小學、初中和高中三個選項中的一個,使用者輸入所需出的卷子的題目數量,系統預設將根據賬號型別進行出題。每道題目的運算元在1-5個之間,運算元取值範圍為1-100;
3、題目數量的有效輸入範圍是“10-30”(含10,30,或-1退出登入),程式根據輸入的題目數量生成符合小學、初中和高中難度的題目的卷子(具體要求見附表)。同一個老師的卷子中的題目不能與以前的已生成的卷子中的題目重複(以指定資料夾下存在的檔案為準,見5);
4、在登入狀態下,如果使用者需要切換型別選項,命令列輸入“切換為XX”,XX為小學、初中和高中三個選項中的一個,輸入項不符合要求時,程式控制臺提示“請輸入小學、初中和高中三個選項中的一個”;輸入正確後,顯示“”系統提示“準備生成XX數學題目,請輸入生成題目數量”,使用者輸入所需出的卷子的題目數量,系統新設定的型別進行出題;
5、生成的題目將以“年-月-日-時-分-秒.txt”的形式儲存,每個賬號一個資料夾。每道題目有題號,每題之間空一行;
測試結果:
程式碼分析:
我在閱讀完我隊友的程式碼後,對於生成括號部分感覺隊友寫的非常的巧妙。
我的程式碼在生成括號部分只是生成了一個括號,然後隨機出現。設定了兩個左右括號的變數取隨機數來生成括號。
而我的隊友程式碼生成括號的部分很是不一樣,他利用了一個二維陣列,先是將陣列元素全設定值為1,表示全部是括號,然後取隨機數,將一部分值置零表示去除括號,並且利用for迴圈繼續去掉一些不符合條件的多餘的括號,這樣最後就得到了一個儲存括號的二維陣列,等到生成題的時候輸出。
int **brackets = new int*[operandnum]; for (intView Codei = 0;i < operandnum;i++) { brackets[i] = new int[operandnum] {0}; } int s = 0; for (int i = 1;i < operandnum-1;i++) { for (int j = i + 1;j < operandnum-1;j++) { brackets[i][j] = 1; s = s + 1; } } for (int i = 0;i <s;i++) { brackets[rand() % (operandnum - 1)][rand() % (operandnum - 1)] = 0; } for (int i = 1;i < operandnum-1;i++) { for (int j = i + 1;j < operandnum-1;j++) { for (int k = j;k < operandnum-1;k++) { if (brackets[j][k] == 1) brackets[j][k] = 0; } } }
程式碼點評:
①優點:
隊友的程式碼結構非常清晰,編碼規範,變數和函式名都具有一定的描述性;各個函式也非常有條理,對於每個函式都有對應的註釋,在難以理解的變數程式碼部分也有相關的註釋;在生成數學題那裡的演算法也非常清晰巧妙,使用者體驗也好,每一步都有互動進行相關的提示。
②缺點:
美中不足的是隊友的程式碼在切換出題年級的功能時,輸入其他字元和輸入否的功能一樣,沒有進行異常處理,還有就是輸入-1時退出登入,就直接關閉程式了,我的理解是輸入-1重新輸入使用者名稱進行登入,可能也不能算是缺點,就是理解不同。還有就是出題部分,隊友的程式碼是可以一直出題的,但是出題過程中不能切換,就是如果選定了就只能一直出同一年紀的題。
總結:
隊友的程式碼總的來說是非常不錯的,可讀性高,要求很大程度上完成了個人專案的各項要求,經過對隊友程式碼的測評分析,我深有啟發,同時學到了其他的技巧,也看到了自身的不足之處,隊友的程式碼風格簡潔明瞭,值得學習,希望在接下來的合作中能夠相互提高。