首页 > 代码库 > 软件工程结对作业01

软件工程结对作业01

一、题目:

  结对项目开发-四则运算四
  把程序变成一个网页程序,用户通过设定参数,就可以得到各种题目,并可实现在线答题并评判。

  注:这是一个两人结对开发的项目,开发人员:曾凯    刘雨鑫

二、程序设计思想:

  (1)功能分析:

    1.这是一个可以在线答题的web版四则运算程序,用户可以通过设点一些参数来生成题目,然后回答这些题目,提交后程序检查回答的正确性,然后将题目的回答情况通过页面显示的方式反馈给用户。

    2.由于参数设置导致交互不太方便,用户需要考虑参数如何搭配,由此实现按照年级答题,用户只需要选择年级,就可以生成按照年级配置好一套题

    3.用户在做错题后,实现错题的记录和每道错题做错多数次的记录,并且还有错题练习的功能,如果这道错题回答对了,就会将这道错题从错题表中删除

  (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中,如果回答正确就将该道题从错题表中删除,如果回答错误,则将该道题的回答错误次数加一。

  (4)核心代码:

    在线答题的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 }
业务逻辑处理

 

软件工程结对作业01