結對程式設計--個人專案評價
一.整體結構分析
高梓文同學的個人專案程式碼分為三個檔案:main.py,papercreater.py,login.py。
1.main.py
定義了獲取當前時間,新建目錄,題目查重函式。主函式部分呼叫了login模組和papercreater模組實現使用者的登入和出題,另外還有細節操作例如對題目字串增加題號。
2.papercreater.py
此程式碼塊的主要功能是實現對於小學初中高中的出題操作。此檔案中定義了隨機陣列產生函式,運算子新增函式以及三種難度的題目(即字串)產生函式。
3.login.py
此檔案的主要功能是建立登入頁面,增加使用者的體驗,同時捕獲外部輸入的使用者名稱和密碼進行登入判斷,除此之外還有對於切換難度的輸入判斷以及題目數量的輸入值獲取。
二.關鍵程式碼分析
1.建立目錄
python中的建立目錄相對於其他語言來講還是較為簡單方便的,進行目錄是否存在判斷後直接建立即可。
2.獲取時間
這個獲取時間函式是針對於txt文件命名格式需求而設計的,呼叫format和datetime進行時間設定。
3.查重
因為在個人專案需求中有題目不可重複這一項,所以針對性設計查重函式。
查重的基本邏輯就是將本資料夾下所有檔案中的字串按照行讀取出來,讀取到該程式碼的history_questions中去,然後對於目標字串進行逐個匹配比較,可以看到python的功能是十分強大的,其他語言例如C++或者java大多需要利用類似for迴圈以及額外boolean的方式進行逐一讀取和變數值更改,但python只需要:if...in...就能實現查重(使用Java的我破防了,破大防了)。
4.隨機陣列
同樣是迎合個人專案的需求,要求各個題目的運算元數量不超過五個,運算元值不超過100,因此建立一個隨機陣列,起到儲存運算元的作用,陣列中所有運算元皆通過random得來。
5.乘方開方運算子新增
該函式用於題目字串中的乘方或者開方新增,是迎合初中題目的設計需求。
上圖是定義的運算子集合,直接使用其中的operator[4]或者operator[5]即可。
6.三角函式運算子新增
傳入一個字串或整型引數,隨機對該引數新增三種三角函式的運算子。
7.小學問題產生
首先使用random產生隨機數數量,然後使用random定位左括號的位置,接著判斷括號是否有效(即判斷左右括號的相對位置是否合理),然後需要打亂運算元順序即可實現題目的產生,總之出題的總體思路就是在運算元打亂的基礎上插入括號。
8.初中問題產生
初中題目相較於小學題目多添加了開方和平方運算,除此之外還有一元運算的情況。首先對於一元運算給出特殊解答。其他部分與小學問題解答基本相同。
9.高中問題產生
高中方法與初中基本相同,不再多做贅述。只是在最後加入小學之外所有運算子的排列組合功能。(妙哉,妙哉,妙甚於妙蛙種子)
10.登入設計
這部分實際上就是對於使用者使用需求的一個設計,一個簡易的登入介面能夠在一定程度上提高使用者的體驗。除此之外,這個函式模組起到了捕獲外界輸入的作用,是使用者和內部邏輯的橋樑。
11.主函式邏輯
主函式的邏輯是較為簡單明瞭的,首先呼叫登入介面,然後根據給到的name建立檔案,然後根據login給到的attr引數來判斷生成哪張試卷。
三.執行結果展示
登陸介面
登陸後可修改年級
切換年級成功
切換登入成功
小學題目
初中題目
高中題目
四.優點缺點解析
優點
我認為高梓文同學個人專案的優點主要有四點
1.對於python語言的運用爐火純青,善於自定義函式解決對應需求,善於運用python庫函式來解決相應的問題。
2.善於使用模組化方式解決問題,程式碼整體設計結構一目瞭然,邏輯清晰,註釋清楚,他人閱讀程式碼體驗良好。
3.出題模組設計的尤為出彩,採用層次化處理方式,優先處理運算元,在運算元的基礎上插入括號和操作符,使人拍案叫絕。
4.相較於我的設計來講,高梓文同學的設計程式碼效率更高,使用了近乎我程式碼量的1/3就完成了我的所有功能。
缺點
我認為高梓文同學個人專案的主要缺點是對於使用者體驗的考慮還是不夠周全,使用者在出完一次題目後就自動退出了系統。我們使用過的各種系統都是必須能夠讓使用者自動選擇登出的而不是強制登出。所以我認為需要在程式碼中加入迴圈機制,讓使用者出完題目後可以進行再次選擇,切換難度or繼續出題or退出登入。