github項目地址 : FundamentalOperationshtml
演示地址:小學生四則運算在線測試 git
測試帳號:admin 、admin一、admin二、admin三、admin4程序員
密碼:111github
注:因爲服務器環境緣由,請忽略驗證碼,直接登錄數據庫
結對同伴的園子:城塵
express
實驗要求編程
在《實驗二 軟件工程我的項目》中,同窗們實現了一個命令行四則運算出題小程序,本次實驗採用結對編程方式,設計開發一個小學生四則運算練習軟件,使之具備如下功能:小程序
(1)由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分;服務器
(2)題庫文件可採用實驗二的方式自動生成,也能夠手工編輯生成,文本格式以下:session
(3)程序爲用戶提供三種進階四則運算練習功能選擇:百之內整數算式(必作)、帶括號算式、真分數算式練習;
(4)程序容許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,示例以下:
(5)程序記錄用戶答題結果,當程序退出再啓動的時候,可爲用戶顯示最後一次測試的結果,並詢問用戶能否進行新一輪的測試;
(6)測試有計時功能,測試時動態顯示用戶開始答題後的消耗時間。
(7)程序人機交互界面是GUI界面(WEB頁面、APP頁面均可),界面支持中文簡體(必作)/中文繁體/英語,用戶能夠進行語種選擇。
一、需求分析
二、功能分析
三、設計實現
四、運行測試
選擇試題類型後,進行答題,並計時
五、核心代碼
/** * 該類 從數據庫中 以不一樣的類別 隨機抽取試題 */ @Controller @RequestMapping(value = "/expression") public class ExpressionController { @Autowired private ExpressionRepository expressionRepository; @RequestMapping(value = "/{type}") public String getExpressionPage(@PathVariable(value = "type") String type, Model model){ List<ExpressionEntity> expressionEntityList = expressionRepository.findByTypeTwenty(type); model.addAttribute("expressions",expressionEntityList); return "views/expressionPage"; } }
/** * 運算式的接口 */ public interface ExpressionRepository extends JpaRepository<ExpressionEntity,String>{ List<ExpressionEntity> findAll(); List<ExpressionEntity> findAllByType(@Param(value = "type") String type); @Query(value = "select * from expression where type = ?1 order by rand() limit 20",nativeQuery = true) List<ExpressionEntity> findByTypeTwenty(String type); }
@RequestMapping("/chart") public List<VisualizationEntity> getChartData(HttpServletRequest httpServletRequest){ HttpSession session = httpServletRequest.getSession(); UserEntity userEntity = (UserEntity) session.getAttribute("user"); List<VisualizationEntity> visualizationEntities = visualiRepository.findByUsername(userEntity.getUsername()); return visualizationEntities; }
//計算逆波蘭式的結果 private static boolean evoe(ArrayList<String> strArr){ String str = ele.getOperations(); boolean flag = true;//判斷過程當中是否有負數或小數點 int temp = 0;//存放臨時計算結果 Stack<String> stack = new Stack<String>(); for(String s : strArr){ if(!str.contains(s)){//若是是數字,放入棧中 stack.push(s); }else{ int a = Integer.valueOf(stack.pop()); int b = Integer.valueOf(stack.pop()); try { switch(s){ case "+" : stack.push(String.valueOf(a+b)); break; case "-" : temp = b-a; if(temp < 0) flag=false; stack.push(String.valueOf(temp)); break ; case "*" : stack.push(String.valueOf(a*b)); break; case "/" : if(a == 0) {a = 1;flag = false;} temp = b/a; if(a*temp != b) flag = false; stack.push(String.valueOf(temp)); break ; } } catch (Exception e) { } } } ele.setResult(Integer.parseInt(stack.pop())); return flag; } //將逆波蘭式轉化爲運算式 private static void pro_exp(ArrayList<String> strArr){ String str = ele.getOperations(); String ea,eb; String fh = " ";//臨時的符號 boolean lastisnum = false;//記錄臨時符號後的一位是否爲數字 Stack<String> expstack = new Stack<String>(); for(String s : strArr){ if(!str.contains(s)){//若是是數字,放入棧中 expstack.push(s); lastisnum = true; }else{ ea = expstack.pop(); eb = expstack.pop(); switch(s){ case "+" : expstack.push(eb+"+"+ea); break; case "-" : expstack.push(eb+"-"+ea); break ; case "*" : if("+-".contains(fh)){ if(!lastisnum) ea = "("+ea+")"; else eb = "("+eb+")"; } expstack.push( eb+"*"+ea); break; case "/" : if("+-".contains(fh)){ if(!lastisnum) ea = "("+ea+")"; else eb = "("+eb+")"; } expstack.push( eb+"/"+ea); break ; } fh = s; lastisnum = false; } } ele.setExp(expstack.pop()); } //隨機生成逆波蘭式 public static void test(){ ArrayList<String> strArr=new ArrayList<String>(); List list = Collections.synchronizedList(strArr); N = new Random().nextInt(4)+2; synchronized(list) { strArr.clear(); for (int i = 0; i < N; i++) { strArr.add(ele.random_N()); } for (int i = 0; i < N - 2; i++) { strArr.add(new Random().nextInt(strArr.size() - N + 1) + N - 1, ele.random_E()); } strArr.add(strArr.size(), ele.random_E()); } ele.setStrArr(strArr); }
6.結對編程過程
七、展現PSP
PSP2.1 |
任務內容 |
計劃完成須要的時間(min) |
實際完成須要的時間(min) |
Planning |
計劃 |
30 |
30 |
Estimate |
估計這個任務須要多少時間,並規劃大體工做步驟 |
30 |
30 |
Development |
開發 |
360 |
300 |
Analysis |
需求分析 (包括學習新技術) |
100 |
60 |
Design Spec |
生成設計文檔 |
10 |
10 |
Design Review |
設計複審 (和同事審覈設計文檔) |
20 |
10 |
Coding Standard |
代碼規範 (爲目前的開發制定合適的規範) |
10 |
5 |
Design |
具體設計 |
60 |
35 |
Coding |
具體編碼 |
120 |
120 |
Code Review |
代碼複審 |
10 |
20 |
est |
測試(自我測試,修改代碼,提交修改) |
30 |
40 |
Reporting |
報告 |
30 |
43 |
Test Report |
測試報告 |
25 |
30 |
Size Measurement |
計算工做量 |
2 |
3 |
Postmortem & Process Improvement Plan |
過後總結 ,並提出過程改進計劃 |
3 |
10 |
八、對小夥伴的評價
此次合做的小夥伴是個人舍友@城塵。每當個人雙手中止敲擊鍵盤,沉浸在對於項目完成品幻想中時(誤),小夥伴認真的態度以及對於項目內容的堅持老是能把我帶回現實世界(繼續敲代碼)。小夥伴對於項目的態度,對我產生了極大的影響。爲何這麼說呢?由於我自己是一個很容易受到周圍氛圍影響的人。此次的項目我原本準備下降對於交互界面的追求,讓小學生在白色和黑色交織的題海里徜徉一下。可是在小夥伴跟我提出了多個界面方案以後,我只能將個人想法壓制在了內心,並無說。畢竟另外一我的在堅持,我又憑什麼輕言放棄(畢竟舍友,萬一被。。。)。
總而言之,小夥伴是一個能經過規範自身行爲來影響他人的準程序員,我也於這種影響力中受到了極大的鼓舞。
九、 結對編程真的可以帶來1+1>2的效果嗎?經過此次結對編程,請談談你的感覺和體會。
首先1+1>2是一個抽象的概念,難道說是兩我的結對編程的代碼多於兩人單幹的代碼量就是>2嗎?我想應該不是這樣的。結合此次項目來看,我最滿意的功能是查看答案模塊,點擊查看答案後題目下方浮現出答案模塊,其中白色背景是正確的題目答案,紅色背景則相反。我在對小夥伴的評價中說過我一開始實際上是準備放棄界面的,然後面受到了夥伴的影響才選擇認真完成界面內容。
若是沒有合做,我想就是十個我也作不出這個效果。不是由於技術水平不夠,而是當你一我的思考時,老是會陷入偏執。合做則讓多我的的思想交融,固然前提是這些人內心的真實目標是一致的,這樣纔是一個團體。此次項目的效果在我看來,顯然是1+1>10個我,由於顯然十個我在一塊兒,怕是會更加堅決的放棄界面(笑)。