轉自:http://www.cnblogs.com/dmego/p/6686635.htmlhtml
注:這是一個兩人結對開發的項目java
開發人員:曾凱 劉雨鑫git
1、題目:github
結對項目開發-四則運算四
把程序變成一個網頁程序,用戶經過設定參數,就能夠獲得各類題目,並可實如今線答題並評判。web
2、程序設計思想:sql
(1)功能分析:數據庫
1.這是一個能夠在線答題的web版四則運算程序,用戶能夠經過設點一些參數來生成題目,而後回答這些題目,提交後程序檢查回答的正確性,而後將題目的回答狀況經過頁面顯示的方式反饋給用戶。編程
2.因爲參數設置致使交互不太方便,用戶須要考慮參數如何搭配,由此實現按照年級答題,用戶只須要選擇年級,就能夠生成按照年級配置好一套題數組
3.用戶在作錯題後,實現錯題的記錄和每道錯題作錯多數次的記錄,而且還有錯題練習的功能,若是這道錯題回答對了,就會將這道錯題從錯題表中刪除sass
(2)技術分析:
項目的開發思想是MVC,使用的是jsp+Servlet+javaBean的開發模式,在表單校驗部分還使用了javaScript
(3)設計步驟分析:
1.按照參數設置答題:
首先用戶在頁面經過單選,多選或者文本框輸入的方式設置參數,而後這些參數的值經過request域傳到對應的servlet中,在servlet中接受這些參數的值後調用service層中生成題目的方法已經生成正確答案的方法,而後將題目和正確答案存入記錄一個專門的javaBean中, 再將題目經過sassion域傳到答題的jsp頁面,在答題頁面用戶經過文本框輸入答案後將用戶的答案經過request域傳到一個檢查題目正確性的servlet中,經過調用service層中檢查答案正確性的方法將判斷後的結果保證到Bean中並經過sassion將結果傳到結果jsp頁面,在該頁面顯示回答的狀況
2.按照年級設置答題:
包括小學六個年級的四則數學題生成,默認設置的參數有生成題目道數爲10道,運算符固定爲1位,其中各年級生成的題目參數設置以下:
年級 | 題目要求 |
一年級 | 20之內的加,減 |
二年級 | 100之內的加,減;0-9的乘法,能除盡且除數是1-9的除法 |
三年級 | 兩位數乘法,一位數除法,結果帶餘數 |
四年級 | 三位數乘法,兩位數除法,結果帶餘數 |
五年級 | 分數的加減 |
六年級 | 整數,分數的四則混合運算 |
3.錯題回顧:
在檢查用戶答題正確性時,將答錯的題存入一個專門存放錯題的javaBean中,檢查完成以後就將這個Bean存到錯題表中。查看錯題時將錯題從數據庫中讀取出來而後用sassion域傳到顯示錯題的jsp,在練習錯題時將錯題從錯題表中取出後用sassion域傳到練習錯題的jsp頁面,在這個頁面用戶回答以前作錯的題,而後將回答的答案同過request請求域傳到檢查正確性的servlet中,若是回答正確就將該道題從錯題表中刪除,若是回答錯誤,則將該道題的回答錯誤次數加一。
3、核心代碼:
在線答題的service類代碼:
1 package cn.dmego.service; 2 import java.util.ArrayList; 3 import cn.dmego.dao.MysqlProAnsDao; 4 import cn.dmego.domain.ProAns; 5 import cn.dmego.domain.WrongPro; 6 import cn.dmego.produce.BinaryTree; 7 import cn.dmego.produce.CreatePro; 8 import cn.dmego.produce.ProperFra; 9 10 /************************ 11 * 業務邏輯處理 12 * @author dmego 13 * 14 */ 15 public class ProAnsService { 16 CreatePro cre = new CreatePro(); 17 ProperFra fractin = new ProperFra(); 18 MysqlProAnsDao mpd = new MysqlProAnsDao(); 19 WrongProService wroService = new WrongProService(); 20 /** 21 * 將本次答題狀況存入數據庫中 22 * @param proBean 23 */ 24 public void saveToDB(ProAns[] proBean){ 25 mpd.resert(); 26 mpd.addAll(proBean); 27 } 28 /** 29 * 檢查用戶輸入的答案是否正確,而後爲Bean中的check變量賦值 30 * (-1:答錯了;1:答對了) 31 * 若是答錯了,將該題存入錯題表中 32 * @param proBean 題目對象數組(增長了用戶輸入的答案) 33 * @return 校驗完成的題目對象數組 34 */ 35 public ProAns[] checkAnswer(ProAns[] proBean){ 36 ArrayList<WrongPro> wrongBean = new ArrayList<WrongPro>(); 37 //wrongBean = wroService.showWrong(); 38 for(int i = 0 ; i < proBean.length; i++){ 39 if(proBean[i].getYourAns().equals(proBean[i].getRightAns())) 40 proBean[i].setChecks(1); 41 else{ 42 proBean[i].setChecks(-1); 43 //----將錯題存入錯題表中---- 44 WrongPro wrongTemp = new WrongPro(); 45 wrongTemp.setProblem(proBean[i].getProblem()); 46 wrongTemp.setRightAns(proBean[i].getRightAns()); 47 wrongTemp.setYourAns(proBean[i].getYourAns()); 48 wrongTemp.setChecks(proBean[i].getChecks()); 49 wrongTemp.setTimes( 1 ); 50 wrongBean.add(wrongTemp); 51 } 52 } 53 wroService.saveWrongToDB(wrongBean); 54 return proBean; 55 } 56 57 /** 58 * 根據用戶輸入的年級生成題目(按照年級答題) 59 * @param num 默認生成10道題 60 * @param grade 年級 61 * @return 生成好的題目對象數組(包括題目表達式和正確答案) 62 */ 63 public ProAns[] produce(int grade){ 64 mpd.resert(); //重置數據表 65 String rightAns = ""; //程序計算出來的正確答案 66 String problem = ""; //生成的隨機表達式 67 int num = 10; 68 ProAns[] proBean = new ProAns[num]; //javaBean數組,用來封裝生成的題目和正確答案 69 for(int i = 0; i< num;i++){ 70 String[] array = cre.proArraryG(grade);//生成一個運算符+數字的數組 71 BinaryTree tree = new BinaryTree(array); //把數組做爲參數傳入生成一棵二叉樹的方法 72 rightAns = tree.CalAndVal(grade); //計算正確結果,獲得的是假分數 73 if(grade != 3 && grade != 4){ 74 rightAns = fractin.falseToTrue(rightAns); //將結果的假分數化簡爲帶分數 75 } 76 //生成的題目字符串(必須放在計算結果後,由於在計算結果時,該樹結構還會由於 負數 或者 除數爲0 而變化) 77 problem = tree.toString(); 78 proBean[i] = new ProAns(); //數組中每一個元素都必需要new成一個對象不然會拋出空指針異常 79 proBean[i].setId(i+1); 80 proBean[i].setProblem(problem); 81 proBean[i].setRightAns(rightAns); 82 } 83 return proBean; 84 } 85 86 87 /** 88 * 根據用戶輸入的參數生成題目(按參數答題) 89 * @param hasmd 指定有無乘除法(Y/N) 90 * @param hasfs 指定有無真分數(Y/N) 91 * @param hasgd 指定運算符個數是否固定(Y/N) 92 * @param range 指定運算式取值範圍 93 * @param num 指定出題個數 94 * @param synum 指定固定的運算符個數或者最大運算符個數 95 * @return 生成好的題目對象數組(包括題目表達式和正確答案) 96 */ 97 public ProAns[] produce(String hasmd,String hasfs,String hasgd,int range,int num,int synum){ 98 mpd.resert(); //重置數據表 99 String rightAns = ""; //程序計算出來的正確答案 100 String problem = ""; //生成的隨機表達式 101 int grade = 0; 102 ProAns[] proBean = new ProAns[num]; //javaBean數組,用來封裝生成的題目和正確答案 103 for(int i = 0; i< num;i++){ 104 String[] array = cre.proArrary( range, hasmd, hasfs,hasgd,synum); //生成一個運算符+數字的數組 105 BinaryTree tree = new BinaryTree(array); //把數組做爲參數傳入生成一棵二叉樹的方法 106 rightAns = tree.CalAndVal(grade); //計算正確結果,獲得的是假分數 107 rightAns = fractin.falseToTrue(rightAns); //將結果的假分數化簡爲帶分數 108 //生成的題目字符串(必須放在計算結果後,由於在計算結果時,該樹結構還會由於 負數 或者 除數爲0 而變化) 109 problem = tree.toString(); 110 proBean[i] = new ProAns(); //數組中每一個元素都必需要new成一個對象不然會拋出空指針異常 111 proBean[i].setId(i+1); 112 proBean[i].setProblem(problem); 113 proBean[i].setRightAns(rightAns); 114 } 115 return proBean; 116 } 117 } 118 119 業務邏輯處理
回顧錯題的service類代碼:
1 package cn.dmego.service; 2 /************************ 3 * 錯題表業務邏輯處理 4 * @author dmego 5 * 6 */ 7 import java.util.ArrayList; 8 9 import cn.dmego.dao.MysqlWrongProDao; 10 import cn.dmego.domain.WrongPro; 11 12 public class WrongProService { 13 MysqlWrongProDao mwp = new MysqlWrongProDao(); 14 /** 15 * 將全部錯題顯示出來 16 * @return 錯題Bean 17 */ 18 public ArrayList<WrongPro> showWrong(){ 19 return mwp.getWrongPro(); 20 } 21 22 /** 23 * 從錯題表中刪除題 24 * @param wrongBean 25 */ 26 public void wipeWrongInDB(){ 27 mwp.delWrongPro(); 28 } 29 30 /** 31 * 先重置錯題表,而後將本次答題中的錯題存入錯題表中 32 * @param wrongBean 33 */ 34 public void reSaveWrongToDB(ArrayList<WrongPro> wrongBean){ 35 mwp.resertWro(); //先重置 數據表 36 mwp.addWrongPro(wrongBean); 37 } 38 /** 39 * 將本次答題中的錯題存入錯題表中 40 * @param wrongBean 41 */ 42 public void saveWrongToDB(ArrayList<WrongPro> wrongBean){ 43 mwp.addWrongPro(wrongBean); 44 } 45 46 /** 47 * 檢查練習錯題時的答題狀況, 48 * @param wrongBean 錯題集(增長了用戶輸入的答案) 49 * @return 校驗完成的錯題集 50 */ 51 public ArrayList<WrongPro> checkWrAnswer(ArrayList<WrongPro> wrongBean){ 52 53 for(int i= 0;i < wrongBean.size(); i++){ 54 if(wrongBean.get(i).getYourAns().equals(wrongBean.get(i).getRightAns())){ 55 wrongBean.get(i).setChecks( 1 ); 56 } 57 else{ 58 //----將該題的答錯次數加1---- 59 wrongBean.get(i).setTimes( wrongBean.get(i).getTimes() + 1 ); 60 wrongBean.get(i).setChecks( -1 ); 61 } 62 } 63 return wrongBean; 64 } 65 } 66 67 錯題業務邏輯處理
檢查在線答題的servlet:
1 package cn.dmego.web; 2 /** 3 * 檢查在線答題的答案正確性 4 */ 5 import java.io.IOException; 6 import java.util.Enumeration; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 import javax.servlet.http.HttpSession; 12 import cn.dmego.domain.ProAns; 13 import cn.dmego.service.ProAnsService; 14 15 public class CheckServlet extends HttpServlet { 16 ProAnsService service = new ProAnsService(); 17 public void doGet(HttpServletRequest request, HttpServletResponse response) 18 throws ServletException, IOException { 19 HttpSession session = request.getSession(); 20 ProAns[] proBean = (ProAns[]) session.getAttribute("proBean"); 21 Enumeration<String> enumeration = request.getParameterNames(); 22 int i = 0; 23 while(enumeration.hasMoreElements()){ 24 String name = (String) enumeration.nextElement(); 25 String yourAns = request.getParameter(name); 26 proBean[i].setYourAns(yourAns); 27 i++; 28 } 29 proBean = service.checkAnswer(proBean); 30 session.setAttribute("proBean", proBean); 31 service.saveToDB(proBean); 32 response.sendRedirect(request.getContextPath()+"/Result.jsp"); //重定向到結果界面 33 } 34 35 public void doPost(HttpServletRequest request, HttpServletResponse response) 36 throws ServletException, IOException { 37 doGet(request, response); 38 } 39 40 } 41 42 檢查在線答題的答案正確性
檢查練習錯題的servlet:
1 package cn.dmego.web; 2 /** 3 * 檢查練習答題的答案正確性 4 */ 5 import java.io.IOException; 6 import java.util.ArrayList; 7 import java.util.Enumeration; 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 import javax.servlet.http.HttpSession; 13 import cn.dmego.domain.WrongPro; 14 import cn.dmego.service.WrongProService; 15 16 public class checkWrServlet extends HttpServlet { 17 WrongProService wroService = new WrongProService(); 18 @SuppressWarnings("unchecked") 19 public void doGet(HttpServletRequest request, HttpServletResponse response) 20 throws ServletException, IOException { 21 HttpSession session = request.getSession(); 22 ArrayList<WrongPro> wrongBean = new ArrayList<WrongPro>(); 23 wrongBean = (ArrayList<WrongPro>)session.getAttribute("wrongBean"); 24 Enumeration<String> enumeration = request.getParameterNames(); 25 int i = 0; 26 while(enumeration.hasMoreElements()){ 27 String name = (String) enumeration.nextElement(); 28 String yourAns = request.getParameter(name); 29 wrongBean.get(i).setYourAns(yourAns); 30 i++; 31 } 32 wrongBean = wroService.checkWrAnswer(wrongBean); 33 session.setAttribute("wrongBean", wrongBean); 34 wroService.reSaveWrongToDB(wrongBean); //先重置錯題表,再存 35 wroService.wipeWrongInDB(); //而後從錯題表中刪除答對的題 36 response.sendRedirect(request.getContextPath()+"/pwResult.jsp");//重定向到練習錯題的結果界面 37 38 39 } 40 41 public void doPost(HttpServletRequest request, HttpServletResponse response) 42 throws ServletException, IOException { 43 doGet(request, response); 44 } 45 46 } 47 48 檢查練習答題的答案正確性
注:完整的項目源代碼已經上傳到gitHub,gitHub地址爲:https://github.com/fightxin/arithmeticWeb
4、項目文件截圖,程序運行結果截圖:
1.項目工程截圖:
2.程序運行結果截圖:
5、結對編程的總結體會:
經過這一次結對編寫四則運算web版,我體會到告終對開發中的兩我的關係的的一步步正規化,從萌芽階段到創造階段,從簡單生成題目回答題目到有記錄錯題和練習錯題等功能正是兩我的經過不斷交流和溝通,一塊兒創造ideal的結果。在這個過程當中,我學會了如何給人提意見,若是把本身腦海中的想法更加具體的表達給別人。
經過此次合做,讓本身的自學能力獲得提升,也漸漸懂得如何合做,和隊友交流溝通觀點,讓本身的思惟更加開闊。