【寫在前面】這篇部落格是軟體工程這門課中要求結對程式設計。規則是這樣的:結對的兩個人,分別看對方個人專案**,2天時間內,分析對方**優點和缺點。
命令列輸入使用者名稱和密碼,兩者之間用空格隔開(程式預設小學、初中和高中各三個賬號,具體見附表),如果使用者名稱和密碼都正確,將根據賬戶型別顯示「當前選擇為xx出題」,xx為小學、初中和高中三個選項中的乙個。否則提示「請輸入正確的使用者名稱、密碼」,重新輸入使用者名稱、密碼;
登入後,系統提示「準備生成xx數學題目,請輸入生成題目數量(輸入-1將退出當前使用者,重新登入):」,xx為小學、初中和高中三個選項中的乙個,使用者輸入所需出的卷子的題目數量,系統預設將根據賬號型別進行出題。每道題目的運算元在1-5個之間,運算元取值範圍為1-100;
題目數量的有效輸入範圍是「10-30」(含10,30,或-1退出登入),程式根據輸入的題目數量生成符合小學、初中和高中難度的題目的卷子(具體要求見附表)。同乙個老師的卷子中的題目不能與以前的已生成的卷子中的題目重複(以指定資料夾下存在的檔案為準,見5);
在登入狀態下,如果使用者需要切換型別選項,命令列輸入「切換為xx」,xx為小學、初中和高中三個選項中的乙個,輸入項不符合要求時,程式控制臺提示「請輸入小學、初中和高中三個選項中的乙個」;輸入正確後,顯示「」系統提示「準備生成xx數學題目,請輸入生成題目數量」,使用者輸入所需出的卷子的題目數量,系統新設定的型別進行出題;
生成的題目將以「年-月-日-時-分-秒.txt」的形式儲存,每個賬號乙個資料夾。每道題目有題號,每題之間空一行;
附表-1:賬戶、密碼
賬戶型別
賬戶密碼
備註小學
張三1張三2
張三3初中
李四1李四2
李四3高中
王五1王五2
王五3附表-2:小學、初中、高中題目難度要求
小學初中
高中難度要求
平方,開根號
sin,cos,tan
備註只能有+,-,*./和()
題目中至少有乙個平方或開根號的運算子
題目中至少有乙個sin,cos或tan的運算子
需求說明:這裡可能有些點大家會有歧義,這裡做出解釋:使用者在輸入賬號、密碼後(例如張三1 123,則預設出小學題),先按預設出題。出完題後如果使用者切換型別,則還是在該賬號下出題。例如我輸入張三1 123,則預設出小學題,然後切換為高中,則出高中題,但是最後的txt文件是儲存在張三1這個資料夾下的。至於怎麼區分高中、初中、小學題,老師後來說,要在使用者資料夾下再建立資料夾,他們分別儲存高中、初中、小學的題。
優點:1.總體**量270行(豎大拇指)。
2.思路簡潔明瞭,實現了各個方法之間松耦合,但是方法內部緊耦合的基本要求。
3.變數命名簡單易懂,注釋寫的恰到好處。
缺點:1.大佬對於加括號的理解有些問題,**中只有小學能加括號,而且只有乙個運算元才加括號,正確的理解是這樣的(這個理解已經求證老師了,是正確的):高中式子裡可以有括號、根號、平方、+ - * ÷,但是必須要有三角函式,初中裡可以有括號、+ - * ÷,但是必須要有根號和平方。
2.在儲存文件和讀寫文件的時候用到的是絕對路徑而不是相對路徑,這增加了使用者找生成檔案的難度。
3.考慮到可能會有io異常的丟擲,但是只有throws,並沒有相應的處理。
接下來開始具體分析大佬的**,以及他的各個功能模組之間的連線方式,由於是別人的**,所以這裡並不放上源**了。之後我會更新自己的個人專案**以及詳細思路,敬請期待。
首先,他用了這四個方法來具體描述這個專案,它們如下圖所示:
main方法:使用者登入,密碼驗證,呼叫其他功能方法;
select*****方法:選擇題目難度、數量;
*****output方法:試卷生成以及輸出至txt文件中;
duplicatecheck方法:查重功能。
1.main方法實現原理:
1)利用while迴圈來實現登入功能,如果使用者輸入的使用者名稱不在username陣列中,並且密碼不正確,那麼就一直執行while迴圈。
2)當登入成功後,從main方法中呼叫select*****方法,開始生成試卷。
2.select*****方法實現原理:
1)通過判斷使用者輸入的字元長度,來判斷使用者是切換為xx,還是繼續輸入(這點寫的很好)。
2)通過while迴圈,來判斷使用者輸入題目數量是否滿足在區間[10,30]中的要求。
3.*****output方法實現原理:
先按常理來判斷是否有檔案存在,如果沒有就新建資料夾,這裡用的是絕對路徑建的,需要後續迭代改進。然後輸出流他是這樣寫的:
我認為這是乙個很好的寫法,值得我借鑑學習(因為自己檔案輸出這塊掌握的不是很好)。
有關生成題目,他的思路和我的思路很像,但是更為抽象和簡單。大致總結一下:每乙個式子都是由連線項和數字構成,其中數字可以帶根號、開平方、或者前面加個三角函式,連線項的話就是+ - * ÷ ,所以,只需要根據使用者選擇的難度,將連線項和數字組合起來就可以了。是不是思路既簡單又清晰!為大佬鼓掌!
4.duplicatecheck方法實現原理:
這個方法就是用來查重的,所以主要就實現一下讀取檔案和查詢就ok了。大佬這裡還用了篩選文件型別,這讓我眼前一亮:
雖然說因為儲存的文件都是txt型別的文件,不存在有其他型別的文件,但是我覺得這種習慣很好,值得學習,讓**健壯性更好。
這次看大佬的**,雖然有功能有些缺陷,但是對我也有了提公升。首先傳參這塊我覺得我就有缺陷,我雖然是宣告了成員變數,但是在後面呼叫方法的時候,我還是選擇了傳參,所以就顯得我的成員變數並沒有發揮極致的作用。而且我的思路也有點混亂,**很冗長,我將三種難度的試卷生成分開寫了,這樣就不如大佬整合在一起寫要好。總的來講還是自己的抽象和總結能力有待提公升。這次程式設計讓我受益匪淺呀。
結對程式設計實驗(1李曉冬13 張金偉118)
舊程式分析 原程式只能執行兩個數字的四則運算,且只能單個符號。我們在這裡對此進行了小部分的重構,可以多個數字進行運算,但是仍然還是只是單個運算符號。public void add string s 加法 這個實驗相對來說不是很難,但是由於 基礎薄弱,前期分工有所不明確,意見有些不合,導致任務進度拖拉...
從結對程式設計到結對工作
熟悉極限程式設計的人都知道,在極限程式設計的十二項實踐中,有乙個非常重要的實踐就是結對程式設計,也就是兩個人坐在同一臺電腦前面,使用相同的鍵盤和滑鼠來開發同樣的乙個模組,乙個負責 的鍵入,另外乙個人負責盯緊可能出現的錯誤,包括低階錯誤和方向性的錯誤。而且,當乙個問題對其中乙個人難以解決而恰好是另外乙...
從結對程式設計到結對工作
熟悉極限程式設計的人都知道,在極限程式設計的十二項實踐中,有乙個非常重要的實踐就是結對程式設計,也就是兩個人坐在同一臺電腦前面,使用相同的鍵盤和滑鼠來開發同樣的乙個模組,乙個負責 的鍵入,另外乙個人負責盯緊可能出現的錯誤,包括低階錯誤和方向性的錯誤。而且,當乙個問題對其中乙個人難以解決而恰好是另外乙...