結對程式設計專案總結—帶UI的小初高數學學習軟體
一、專案需求
使用者:小學、初中和高中學生。
功能:
1、所有功能通過圖形化介面操作,可以是桌面應用,可以是網站(程式語言和技術不限);
2、使用者註冊功能。使用者提供手機號碼,點選註冊將收到一個註冊碼,使用者可使用該註冊碼完成註冊(後修改為直接用賬戶密碼登入,使用賬戶、密碼的在提交時,同時提交一個txt文件,註明賬號密碼。)
3、使用者完成註冊後,介面提示設定密碼,使用者輸入兩次密碼匹配後設置密碼成功。密碼6-10位,必須含大小寫字母和數字。使用者在登入狀態下可修改密碼,輸入正確的原密碼,再輸入兩次相同的新密碼後修改密碼成功;
4、密碼設定成功後,跳轉到選擇介面,介面顯示小學、初中和高中三個選項,使用者點選其中之一後,提示使用者輸入需要生成的題目數量;
5、使用者輸入題目數量後,生成一張試卷(同一張卷子不能有相同題目,題目全部為選擇題),介面顯示第一題的題乾和四個選項,使用者選擇四個選項中的一個後提交,介面顯示第二題,...,直至最後一題;
6、最後一題提交後,介面顯示分數,分數根據答對的百分比計算;
7、使用者在分數介面可選擇退出或繼續做題;
8、小初高數學題目要求見個人專案。
二、個人專案複用
在和隊友商議之後決定用Java在我的個人專案基礎上修改優化完成此次作業,隊友負責窗體介面的設計製作,我負責具體的實現方法。對個人專案的複用主要是在出題函式部分,主體上沒有大的改動,增加了一個通過呼叫ScriptEngine來計算正確答案的方法,實現的方式是將含有平方/開方/三角函式的運算元直接轉換成計算後的帶有括號的運算元,將簡化後的String算式另存一份作為引數傳給計算函式算出正確答案。除此之外,將原本輸出至txt文件裡的題目儲存在了一個字串數組裡,查重部分也從在彙總txt檔案中查重變成了在當前存題字串陣列中查重。
/*計算函式*/ void RightAnswer(String sQuestion) { ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByMimeType("text/javascript"); try { m_curanswer = engine.eval(sQuestion); } catch (ScriptException e) { e.printStackTrace(); } }
此外還有一個重要部分是判斷是否會出現計算時0變成除數的非法情況,對於這個問題的解決方法是,在呼叫上面提到的計算函式時如果出現這種情況,計算得到的結果會是NaN或±Infinity,在計算結束後加一個判斷是否為NaN或Infinity的函式(Double.isNaN()/Double.isInfinite()),如果是的話,處理方式和出題重複的情況是一樣的(這裡為了防止重複和0做除數兩種情況同時出現,所以將非法的判斷放到了重複判斷裡)。
//查重 boolean rep = false; if(numbertemp != iNumber) { for(int i=0;i<(iNumber-numbertemp-1);i++) { if(m_curproblem.equals(m_question[i])) { rep = true;//有重複 break; } else { ; } } if(rep == false) {//如果沒有重複,計算正確答案是否合格 RightAnswer(m_simproblem); double temp = new Double(m_curanswer.toString()); if((!Double.isInfinite(temp))&&(!Double.isNaN(temp))) { //如果沒有0做除數的情況 m_question[iNumber-numbertemp-1] = m_curproblem; //存入題目 m_rightanswer[iNumber-numbertemp-1] = String.valueOf(temp); //存入正確答案 } else { numbertemp++; //否則重新出題 } } else { numbertemp++; //有重複則重新出題 } } else { RightAnswer(m_simproblem); double temp = new Double(m_curanswer.toString()); if((!Double.isInfinite(temp))&&(!Double.isNaN(temp))) { //如果沒有0做除數的情況 m_question[0] = m_curproblem; //存入題目 m_rightanswer[0] = String.valueOf(temp); //存入正確答案 } else { numbertemp++; //否則重新出題 } }
三、其他部分
整體的框架結構分為Login(登陸)、Register(註冊)、Changepw(修改密碼)、Main(主介面)、Paper(試卷顯示介面)、Select(出題/選項)、Tips(提示顯示)和Demo五個檔案部分。
登陸、註冊、修改密碼的實現也是基於個人專案中的輸入輸出流優化修改完成的。其他部分主要是介面顯示,是隊友負責完成的。
四、經驗總結
這次結對程式設計的分工比較明確,一直保持交流和討論,互相協助確保每天都有一定的進度,包括後面基本完成之後進行細節修改的時候也是一份檔案互相發來回改。通過本次作業也讓我意識到了自己程式碼能力方面的不足,在隊友的幫助下也對java的GUI有了一定的瞭解,希望接下來的專案中能有更大的進步。