四则运算2

(注:我们在四则运算1的基础上做了改进,故本系统不只满足本次任务需求,例如可以选择是否生成真分数计算的题目。)

程序设计思想:

       大致思路:定义表达式类Expression(包含计算结果),表达式生成器类ExpressionRandom,在页面中根据用户不同操作给ExpressionRandom中生成表达式的方法传递不同的参数,得到用户需要的题目(Expression),同时在页面中使用javascript进行计时。用户输入的数据与每个表达式调用计算结果函数得到的数据一一比较,从页面上给予用户反馈。

       为使本系统支持分数计算和整数计算,将所有在限定范围内运算数看做分数(整数的分母为1)。

首先定义运算数类RationalNumber

  该类包含两个2个int型私有属性:分子numerator与分母denominator,为该类定义加、减、乘、除、化简(不允许出现未约分到最简的分数)方法,返回值仍为RationalNumber。

其次定义表达式组成元素类Element(在Expression类中使用):

  Element有两个私有属性运算数fraction(RationalNumber)和运算符operator(String)。

每道题目由n个运算数与n-1个运算符交错排列构成,将每到题目按以下规则拆分:

   * 如表达式“2+3-4/7”

   * 一个运算数+一个运算符作为一个元素(Element,详见Element.java),如即2+、3-

   * 每个表达式为Element对象构成的列表(List),

   * 最后一个元素(Element)没有跟着的运算符,补充"#"

   *

   * 即表达式“2+3-4/7”由一个列表{2+、3-、4/7#}表示。

由此定义表达式类Expression:

  Expression仅有一个私有属性:List<Element> expr,为该类定义计算结果方法getResult返回一个RationalNumber对象。

  最后定义表达式随机生成器类ExpressionRandom

  在该类中定义静态方法:getExpression,返回一个Expression直接得到一个有效随机题目

  在WebContent目录下,建立index.jsp文件,通过一个表单将用户输入的数据/选择的信息传递至Arithmetic.jsp页面,该页面根据用户输入信息生成数道题目,并调用其toHtmlDiv()方法使其恰当显示,并在每到题后添加input框供用户输入结果,在页面底部设置提交按钮,将用户输入信息以及题目答案信息传递至result.jsp页面,在该页面通过题目答案与用户答案一一对比,统计用户答题情况提示用户正确信息。

源程序代码:

RationalNumber.java

  1 /*******运算数类*******/
  2 
  3 package model;
  4 public class RationalNumber {
  5     private int denominator;    //分母
  6     private int numerator;        //分子
  7     
  8     /***构造函数,整数看做分母为1的分数***/
  9     public RationalNumber(int numerator) {
 10         this.numerator = numerator;
 11         denominator = 1;
 12     }
 13     /****构造函数,第一个参数为分子,第二个为分母****/
 14     public RationalNumber(int numerator,int denominator) {
 15         this.denominator = denominator;
 16         this.numerator = numerator;
 17     }
 18     public int getDenominator() {
 19         return denominator;
 20     }
 21     public void setDenominator(int denominator) {
 22         this.denominator = denominator;
 23     }
 24     public int getNumerator() {
 25         return numerator;
 26     }
 27     public void setNumerator(int numerator) {
 28         this.numerator = numerator;
 29     }
 30     
 31     /***判断两个分数是否相等***/
 32     @Override
 33     public boolean equals(Object obj) {
 34         // TODO Auto-generated method stub
 35         RationalNumber rn = (RationalNumber)obj;
 36         if(this.denominator == rn.denominator && this.numerator == rn.numerator) {
 37             return true;
 38         }else return false;
 39     }
 40     
 41     /*****分数相加*****/
 42     public RationalNumber plus(RationalNumber rb) {
 43         int addNum1 = this.numerator * rb.denominator;
 44         int addNum2 = rb.numerator * this.denominator;
 45         int demo = this.denominator * rb.denominator;
 46         RationalNumber value = new RationalNumber(addNum1 + addNum2,demo);
 47         value.simply();
 48         return value;
 49     }
 50     
 51     /*****分数相减*****/
 52     public RationalNumber minus(RationalNumber rb) {
 53         int addNum1 = this.numerator * rb.denominator;
 54         int addNum2 = rb.numerator * this.denominator;
 55         int demo = this.denominator * rb.denominator;
 56         RationalNumber value = new RationalNumber(addNum1 - addNum2,demo);
 57         value.simply();
 58         return value;
 59     }
 60     
 61     /*****分数相乘*****/
 62     public RationalNumber multiply(RationalNumber rb) {
 63         RationalNumber value = new RationalNumber(this.numerator * rb.numerator,this.denominator * rb.denominator);
 64         value.simply();
 65         return value;
 66     }
 67     
 68     /*****分数相除*****/
 69     public RationalNumber divide(RationalNumber rb) {
 70         RationalNumber value = new RationalNumber(this.numerator * rb.denominator,this.denominator * rb.numerator);
 71         value.simply();
 72         return value;
 73     }
 74     
 75     /*****分数化简*****/
 76     public void simply() {
 77         if(numerator == 0) {
 78             denominator = 1;
 79             return ;
 80         }
 81         
 82         int small,big,temp;
 83         if(numerator > denominator) {
 84             small = denominator;
 85             big = numerator;
 86         }else {
 87             big = denominator;
 88             small = numerator;
 89         }
 90         while(small != 0) {
 91             temp = big % small;
 92             big = small;
 93             small = temp;
 94         }
 95         numerator /= big;
 96         denominator /= big;
 97     }
 98     
 99     /****取得字符串****/
100     @Override
101     public String toString() {
102         if(denominator == 1)
103             return String.valueOf(numerator);
104         else return String.valueOf(numerator + "/" + denominator);
105     }
106     
107     /****取得Html格式字符串****/
108     public String toHtmlDiv() {
109         String str = null;
110         if(denominator == 1)
111             str = "<div class='nomal'>" + this.numerator + "</div>";
112         else
113             str = "<div class='fraction'><div>" + this.numerator + "</div><div style='border-top:2px solid black;'>" + this.denominator + "</div></div>";
114         return str;
115     }
116 }
View Code

Element.java

 1 /**每个Element由一个运算数(RationalNumber) + 一个运算符(String)构成:
 2  * 具体代码如下:
 3  */
 4 
 5 package model;
 6 
 7 public class Element{
 8     
 9     RationalNumber fraction;            //运算数
10     String operator;                    //运算符
11     //构造方法
12     public Element(RationalNumber fraction, String operator) {
13         this.fraction = fraction;
14         this.operator = operator;
15     }
16     //运算数的get/set方法
17     public RationalNumber getFraction() {
18         return fraction;
19     }
20     public void setFraction(RationalNumber fraction) {
21         this.fraction = fraction;
22     }
23     //运算符的get/set方法
24     public String getOperator() {
25         return operator;
26     }
27     public void setOperator(String operator) {
28         this.operator = operator;
29     }
30     //重载equals方法,判读两个元素是否相同
31     @Override
32     public boolean equals(Object obj) {
33         Element element = (Element)obj;
34         if(this.fraction.equals(element.fraction) && this.operator.equals(element.operator))
35             return true;
36         else return false;
37     }
38     
39     
40 }
View Code

Expression.java

  1 /**对每一个表达式,按照以下规则将其拆分:
  2  * 如表达式“2+3-4/7”
  3  * 一个运算数+一个运算符作为一个元素(Element,详见Element.java),如即2+、3-
  4  * 每个表达式为2个或三个Element构成的列表(List),
  5  * 最后一个元素(Element)没有跟着的运算符,补充"#"
  6  * 
  7  * 即表达式“2+3-4/7”由一个列表{2+、3-、4/7#}表示。
  8  */
  9 
 10 package model;
 11 
 12 import java.util.List;
 13 
 14 public class Expression {
 15     private List<Element> expr;                    //Element构成的列表,表示一个表达式
 16     
 17     public Expression()
 18     {
 19         
 20     }
 21     public Expression(List<Element> expr) {        //构造方法,参数为List<Element>类型
 22         this.expr = expr;
 23     }
 24 
 25     //表达式列表的get/set方法
 26     public List<Element> getExpr() {
 27         return expr;
 28     }
 29 
 30     public void setExpr(List<Element> expr) {
 31         this.expr = expr;
 32     }
 33 
 34     //得到表达式字符串,如"1+2/4/7"
 35     @Override
 36     public String toString() {
 37         String exprStr = new String();
 38         for(Element e:expr) {
 39             exprStr += e.getFraction().toString();
 40             if(!e.getOperator().equals("#"))
 41                 exprStr += e.getOperator();
 42         }
 43         return exprStr;
 44     }
 45 
 46     /****取得Html格式字符串
 47      * 如"<div class='nomal'>7</div><div class='nomal'>×</div><div class='nomal'>1</div><div class='nomal'>+</div><div class='nomal'>86</div><div class="nomal">=</div>"
 48      * 在html中直接加入toHtmlDiv()生成的字符串,可规范显示该表达式
 49      */
 50     public String toHtmlDiv() {
 51         String exprStr = new String();
 52         for(Element e:expr) {            //将每个元素转为html格式div,详见Element.java
 53             exprStr += e.getFraction().toHtmlDiv();
 54             if(!e.getOperator().equals("#"))
 55             {
 56                 //存运算符时以"*、/"表示乘除运算符,此处转换为"×、÷"
 57                 if(e.getOperator().equals("*"))
 58                     exprStr += "<div class='nomal'>×</div>";
 59                 else if(e.getOperator().equals("/"))
 60                     exprStr += "<div class='nomal'>÷</div>";
 61                 else
 62                     exprStr += "<div class='nomal'>"+ e.getOperator() + "</div>";
 63             }
 64         }
 65         exprStr += "<div class=\"nomal\">=</div>";
 66         System.out.println(exprStr);
 67         return exprStr;
 68     }
 69     
 70     /****两个算数表达式是否相同****/
 71     @Override
 72     public boolean equals(Object obj) {
 73         Expression expr = (Expression)obj;
 74         if(this.expr.size() != expr.expr.size())
 75             return false;
 76         for(int i = 0;i < this.expr.size();i++)
 77         {
 78             if(!this.expr.get(i).equals(expr.expr.get(i)))
 79                 return false;
 80         }
 81         return true;
 82     }
 83     
 84     /****计算结果,表达式不合法时,返回null****/
 85     public RationalNumber getResult() {
 86         RationalNumber rn = null;                //结果
 87         int length = this.getExpr().size();        //运算数个数
 88         String op1 = this.getExpr().get(0).operator,op2;
 89         if(length == 2)                            //二元运算
 90             rn = calc(this.getExpr().get(0).fraction,op1,this.getExpr().get(1).fraction);
 91         else {
 92             op2 = this.getExpr().get(1).operator;
 93             RationalNumber rn_temp;                //中间数
 94             //运算符优先级判断
 95             if((op1.equals("+") || op1.equals("-"))&&(op2.equals("*")||op2.equals("/"))){
 96                 rn_temp = calc(this.getExpr().get(1).fraction,op2,this.getExpr().get(2).fraction);
 97                 if(rn_temp == null)return null;
 98                 //if(rn_temp == null || rn_temp.getDenominator() > 100 || rn_temp.getNumerator() > 100 || rn_temp.getDenominator() < 0 || rn_temp.getNumerator() < 0 || rn_temp.getDenominator() == 0|| (rn_temp.getDenominator() != 1 && rn_temp.getNumerator() >= rn_temp.getDenominator())) return null;
 99                 rn = calc(this.getExpr().get(0).fraction,op1,rn_temp);
100             }else {
101                 rn = calc(this.getExpr().get(0).fraction,op1,this.getExpr().get(1).fraction);
102                 if(rn == null)return null;
103                 rn = calc(rn,op2,this.getExpr().get(2).fraction);
104             }
105         }
106         
107         if(rn == null || rn.getDenominator() > 100 || rn.getNumerator() > 100 || rn.getDenominator() < 0 || rn.getNumerator() < 0 || rn.getDenominator() == 0|| (rn.getDenominator() != 1 && rn.getNumerator() >= rn.getDenominator()))
108             return null;
109         else
110             return rn;
111     }
112     
113     /****根据单个运算符计算单个结果***/
114     private RationalNumber calc(RationalNumber rn1,String o,RationalNumber rn2) {
115         RationalNumber rn = null;
116         if(rn1.getDenominator() > 100 || rn1.getNumerator() > 100 || rn1.getDenominator() < 0 || rn1.getNumerator() < 0 || rn1.getDenominator() == 0|| (rn1.getDenominator() != 1 && rn1.getNumerator() >= rn1.getDenominator()) || rn2.getDenominator() > 100 || rn2.getNumerator() > 100 || rn2.getDenominator() < 0 || rn2.getNumerator() < 0 || rn2.getDenominator() == 0 || (rn2.getDenominator() != 1 && rn2.getNumerator() >= rn2.getDenominator())){
117             rn = null;
118         }else {
119             if(o.equals("+"))
120                 rn = rn1.plus(rn2);
121             else if(o.equals("-"))
122                 rn = rn1.minus(rn2);
123             else if(o.equals("*"))
124             {
125                 if(rn1.getNumerator()<=9&&rn2.getNumerator()<=9)
126                 {
127                     rn = rn1.multiply(rn2);
128                 }
129                 else return null;
130             }
131             else if(o.equals("/"))
132             {
133                 if((rn2.getNumerator() != 0)&&(rn2.getNumerator()<=9)&&(rn1.getNumerator()%rn2.getNumerator() == 0)&&(rn1.getNumerator()/rn2.getNumerator()<=9))
134                     rn = rn1.divide(rn2);
135                 else return null;
136             }
137         }
138         return rn;
139     }
140 }
View Code

ExpressionRandom.java

  1 /******题目(也称为运算表达式)随机生成器*****/
  2 
  3 package model;
  4 
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 
  8 public class ExpressionRandom {
  9     /***定义运算符****/
 10     private static  String[] operator = {"+","-","*","/"};
 11     
 12     /****随机得到一个表达式,elementNum为元素个数,isFraction表示是否支持分数计算*****/
 13     public static Expression getExpression(int elementNum,boolean isFraction) {
 14         /***表达式列表***/
 15         List<Element> expr = new ArrayList<Element>();
 16         int i;     //循环变量,分子,分母
 17         int nume[] = new int[elementNum];
 18         int demo[] = new int[elementNum];
 19         String[] oper = new String[elementNum];
 20         /***随机生成elementNum个Element(随机分数 + 运算符),并添加到expr***/
 21         if(!isFraction)
 22         {
 23             for(i = 0;i < elementNum ;i ++)
 24             {
 25                 demo[i] = 1;
 26             }
 27         }
 28         else
 29         {
 30             for(i = 0;i < elementNum ;i ++)
 31             {
 32                 demo[i] = (int)(Math.random()*100+1);
 33             }
 34         }
 35         int a = 0,b=0,c=0,d=0;
 36         for(i = 0;i < elementNum; i++)
 37         {
 38             nume[i] = (int)(Math.random()*101);
 39             oper[i] = operator[(int)(Math.random() * 4)];
 40         }
 41         if(elementNum == 2)
 42         {
 43             if(oper[0].equals("*"))
 44             {
 45                 if(nume[0]>9||nume[0]==0)
 46                 {
 47                     nume[0] = (int)(Math.random()*9+1);
 48                 }
 49                 if(nume[1]==0||nume[1]>9)
 50                 {
 51                     nume[1] = (int)(Math.random()*9+1);
 52                 }
 53             }
 54             if(oper[0].equals("/"))
 55             {
 56                 while(true)
 57                 {
 58                     if((nume[1]!=0)&&(nume[0]<=81)&&(nume[1]<=9)&&(nume[0]%nume[1]==0)&&(nume[0]/nume[1]<=9))
 59                     {
 60                         break;
 61                     }
 62                     else
 63                     {
 64                         nume[0] = (int)(Math.random()*81+1);
 65                         nume[1] = (int)(Math.random()*9+1);
 66                     }
 67                 }
 68             }
 69             if(oper[0].equals("-"))
 70             {
 71                 int exchange=0;
 72                 if(nume[0]<nume[1])
 73                 {
 74                     exchange=nume[0];
 75                     nume[0]=nume[1];
 76                     nume[1]=exchange;
 77                 }
 78                 
 79             }
 80             if(oper[0].equals("+"))
 81             {
 82                 while(nume[0]+nume[1]>100)
 83                 {
 84                     for(i = 0;i < elementNum; i++)
 85                     {
 86                         nume[i] = (int)(Math.random()*101);
 87                     }
 88                 }
 89                     
 90             }
 91         }
 92         if(elementNum == 3)
 93         {
 94             
 95             for(i = 0;i<elementNum-1;i++)
 96             {
 97                 if(oper[i].equals("*")||oper[i].equals("/"))
 98                 {
 99                     oper[i] = operator[(int)(Math.random()*2)];
100                 }
101             }
102             //判断三个数运算不能为负数,前两个相减不能为负数
103             if(oper[0].equals("+")&&oper[1].equals("-"))
104             {
105                 while(true)
106                 {            
107                         if((nume[0]+nume[1]-nume[2]<0)||(nume[0]+nume[1]-nume[2]>100)||(nume[0]+nume[1]>100))
108                         {
109                             for(i = 0;i < elementNum; i++)
110                             {
111                                 nume[i] = (int)(Math.random()*101);
112                             }
113                             
114                         }
115                         else
116                         {
117                             break;
118                         }                
119                 }
120                     
121                 
122             }
123             
124             
125             else if(oper[0].equals("-")&&oper[1].equals("-"))
126             {
127                 
128                 while(true)
129                 {            
130                         if((nume[0]-nume[1]-nume[2]<0)||(nume[0]<nume[1]))
131                         {
132                             for(i = 0;i < elementNum; i++)
133                             {
134                                 nume[i] = (int)(Math.random()*101);
135                             }
136                             
137                         }
138                         else
139                         {
140                             break;
141                         }                
142                 }
143                     
144                 
145             }
146             else if(oper[0].equals("-")&&oper[1].equals("+"))
147             {
148                 while(true)
149                 {            
150                         if((nume[0]-nume[1]+nume[2]<0)||(nume[0]<nume[1])||(nume[0]-nume[1]+nume[2]>100))
151                         {
152                             for(i = 0;i < elementNum; i++)
153                             {
154                                 nume[i] = (int)(Math.random()*101);
155                             }
156                             
157                         }
158                         else
159                         {
160                             break;
161                         }                
162                 }
163                     
164                 
165             }
166             else if(oper[0].equals("+")&&oper[1].equals("+"))
167             {
168                 while(true)
169                 {            
170                         if(nume[0]+nume[1]+nume[2]>100)
171                         {
172                             for(i = 0;i < elementNum; i++)
173                             {
174                                 nume[i] = (int)(Math.random()*101);
175                             }
176                             
177                         }
178                         else
179                         {
180                             break;
181                         }                
182                 }
183                 
184             }
185             
186         }
187         for(i = 0;i<elementNum;i++)
188         {
189             RationalNumber rb = new RationalNumber(nume[i],demo[i]);
190             rb.simply();
191             expr.add(new Element(rb, oper[i]));
192         }
193         expr.get(i-1).setOperator("#");
194         /****通过expr构造运算表达式,并返回****/
195         return  new Expression(expr);
196     }
197 
198 
199     /****得到经过过滤的表达式*****/
200     public static Expression getValidExpression(int elementNum,boolean isFraction) {
201         Expression expr = null;
202         do {
203             expr = getExpression(elementNum,isFraction);
204         }while(expr.getResult()== null);                //(当表达式不合法时,返回计算结果为null)
205         return expr;
206     }
207     
208     /******测试主函数,暂时没用********/
209     public static void main(String[] args) {
210         /*for(int i = 0;i < 100;) {
211             Expression expr = ExpressionRandom.getExpression(2, true);
212             if(expr.getResult() != null) {
213                 System.out.println(expr.toString() + "=" + expr.getResult() + "\n");
214                 i++;
215             }
216         }*/
217     }
218 }
View Code

Index.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <link rel="stylesheet" href="css/style.css"/>
 8 <title>小学生四则运算</title>
 9 
10 </head>
11 <body>
12     <form action="arithmetic.jsp" class="option">
13         <center><h2>选择你想做的题目类型</h2></center>
14         <p>选择题目类型:
15             <input name="elementNum" value="2" type="radio" />2元运算
16             <input name="elementNum" value="3" type="radio" checked="checked"/>3元运算<br>
17         题目数量:
18                 <select name="count">
19                     <option>10</option>
20                     <option>20</option>
21                     <option>30</option>
22                     <option>40</option>
23                     <option>50</option>
24                     <option>60</option>
25                 </select>
26                 <!-- <input name="count" value="5000" type="radio" />5000<br/>
27                 <input name="count" value="1000000" type="radio" />10000000(极限测试,慎选!!) -->
28             <br /><br />
29             <input type="checkbox" name="fraction" /><label>分数计算</label>
30         <br />
31         限定时间:<input type="text" name="timelimit"/>分钟
32         <br />
33         <button class="submit" style="margin-top:50px">开始答题喽!</button>
34     </form>
35 </body>
36 </html>
View Code

Arithmetic.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="model.*" 
 4     import="java.util.List"
 5     import="java.util.ArrayList"%>
 6 <%ExpressionRandom exprRand = new ExpressionRandom(); %>
 7 <%
 8         //题目数量
 9         String str = request.getParameter("count");
10     
11         int count = 0;                        //题目数量
12         int elementNum = 0;                    //运算数个数
13         boolean isFraction = false;            //分数计算
14         List<Expression> exprs = new ArrayList<Expression>();    //题目
15         if(str != null){                    //判断是由用户定制题目页面跳转至该页面
16             count = Integer.parseInt(str);
17             elementNum = Integer.parseInt(request.getParameter("elementNum"));
18             isFraction = (request.getParameter("fraction") != null);
19             for(int i = 0;i < count;i++){
20                 exprs.add(ExpressionRandom.getExpression(elementNum, isFraction));
21                 //out.println(exprs.get(i).toString());
22             }
23             session.setAttribute("exprs", exprs);
24         }else{
25             
26         }
27         //时间限制
28         String timeLimit = request.getParameter("timelimit").trim();
29         int time = Integer.parseInt(timeLimit) * 60;
30     %>
31 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
32 <html>
33 <head>
34         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
35         <title>小学生算数</title>
36         <link rel="stylesheet" type="text/css" href="css/style.css"/>
37         <!-- 调整结果输入框位置 -->
38         <%if(isFraction == false) {%>
39         <style type="text/css">
40             .result{
41                 position: relative;
42                 top: 12px;
43             }
44         </style>
45         <%} %>
46         <!-- 调整结束 -->
47         <script type="text/javascript" src="js/jquery-2.1.0.js" ></script>
48         <script type="text/javascript" src="js/demo.js" ></script>
49     </head>
50     <body onload="timing(<%=time %>)">
51     <form action="result.jsp">
52         <table class="box" align="center" border="0" cellspacing="10" cellpadding="10">
53     <%for(int i = 0;i < count;i+=2){%>
54             <tr>
55                 <td align="center" class='expr'>
56                     <%=exprs.get(i).toHtmlDiv()%>
57                 </td>
58                 <td><input autocomplete="off" value="" class="result" name="result" type="text"/></td>
59                 <td align="center" class='expr'>
60                     <%=exprs.get(i + 1).toHtmlDiv()%>
61                 </td>
62                 <td><input autocomplete="off" value="" class="result" name="result" type="text"/></td>
63             </tr>
64         <%} %>
65             <tr>
66                 <td colspan="4" align="center"><button class="submit">提交</button></td>
67             </tr>
68         </table>
69         <input name="time" class="timer" type="text" />
70     </form>
71     </body>
72 </html>
View Code

Result.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="model.*" 
 4     import="java.util.List"
 5     import="java.util.ArrayList"%>
 6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 7 <html>
 8 <head>
 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
10 <title>结果</title>
11 <link rel="stylesheet" type="text/css" href="css/style.css"/>
12 </head>
13 <body>
14 <% List<Expression> exprs =(List<Expression>) session.getAttribute("exprs");        //题目
15     String[] result = request.getParameterValues("result");    //用户答案
16     int right = 0,i = 0;
17     for(String re:result){
18         re = re.trim();            //去除两端空格
19         if(re.equals(exprs.get(i).getResult().toString()))
20             right++;
21         i++;
22     }
23     /*for(i = 0;i < exprs.size();i++){
24         System.out.println(result[i]+"-------"+exprs.get(i).getResult());
25         if(result[i].equals(exprs.get(i).getResult()))
26             right++;
27         i++;
28     }*/
29     
30     %>
31     <table class="box" align="center" border="0" cellspacing="10" cellpadding="10">
32         <tr>
33             <td colspan="6">你共答对了<%=right %>道题,答错<%=exprs.size()-right %>道题,得分:<%=(double)right/exprs.size() * 100 %>,用时:<%=request.getParameter("time") %></td>
34         </tr>
35         <%for(i = 0;i < exprs.size();i+=2){%>
36             <tr>
37                 <td align="center" class='expr'>
38                     <%=exprs.get(i).toHtmlDiv()%>
39                 </td>
40                 <td><input disabled="disabled" value="<%=result[i] %>" class="result" name="result" type="text"/></td>
41                 <%
42                 if(exprs.get(i).getResult().toString().equals(result[i])){
43                 %>
44                     <td></td>
45                 <%
46                 }else{
47                 %>
48                     <td>×&nbsp;&nbsp;正确答案:<%=exprs.get(i).getResult() %></td>
49                 <%    
50                 }
51                 %>
52                 <td align="center" class='expr'>
53                     <%=exprs.get(i + 1).toHtmlDiv()%>
54                 </td>
55                 <td><input disabled="disabled" value="<%=result[i+1] %>" class="result" name="result" type="text"/></td>
56                 <%
57                 if(exprs.get(i + 1).getResult().toString().equals(result[i + 1])){
58                 %>
59                     <td></td>
60                 <%
61                 }else{
62                 %>
63                     <td>×&nbsp;&nbsp;正确答案:<%=exprs.get(i + 1).getResult() %></td>
64                 <%    
65                 }
66                 %>
67             </tr>
68         <%} %>
69             <tr>
70                 <td colspan="6" align="center"><button class="submit" onClick="history.go(-1)">返回</button></td>
71             </tr>
72     </table>
73 </body>
74 </html>
View Code

style.css

 1 @charset "UTF-8";
 2 /****四则运算题目表格(<table>)****/
 3 .box{
 4     margin-top: 50px;
 5 }
 6 /****结果输入框(<input>)****/
 7 .result{
 8     width: 60px;
 9     padding: 5px;
10     border:none;
11     font-size:20px;
12     border-bottom: solid yellowgreen 5px;
13     text-align:center;
14 }
15 /****题目(<td>)****/
16 .expr{
17     font-size: x-large;
18 }
19 
20 /****非分数/运算符(<div>)*****/
21 .nomal{
22     text-align:center;
23     float:left;
24     position: relative;
25     top: 16px;
26     margin-left: 3px;
27     margin-right: 3px;
28     width="20px"
29 }
30 
31 /****分数(<div>)****/
32 .fraction{
33     text-align:center;
34     float: left;
35     margin-left:3px;
36     margin-right: 3px;
37     width="20px"
38 }
39 
40 /****题目选择*****/
41 .option{
42     text-align: center;
43 }
44 /*****提交按钮*****/
45 .submit{
46     padding-top: 10px;
47     padding-bottom: 10px;
48     padding-left: 20px;
49     padding-right: 20px;
50     border-radius: 5px;
51     background: cornflowerblue;
52     border: none;
53     cursor: pointer;
54     color:lightyellow;
55     font-family: "微软雅黑";
56     font-weight: bold;
57     font-size: 20px;
58 }
59 /******计时器*******/
60 .timer{
61     position:fixed;
62     top: 10px;
63     right: 100px;
64     border: none;
65     width:100px;
66     text-align: right;
67     background: none;
68     font-size:30px;
69 }
70 .pause{
71     position:fixed;
72     top: 30px;
73     right: 10px;
74 }
75 /****题目选项****/
76 .option{
77     margin-left:auto;
78     margin-right:auto;
79     width:600px;
80     margin-top: 130px;
81     border:dashed #9ACD32 2px;
82     padding-top: 100px;
83     padding-bottom: 100px;
84 }
View Code

demo.js

 1 //$(document).ready();
 2 
 3 function timing(timelimit){
 4     var time = $(".timer");
 5     var pause = $(".pause");
 6     var date = new Date();
 7     date.setHours(0);
 8     date.setMinutes(timelimit / 60);
 9     date.setSeconds(timelimit % 60);
10     window.setInterval(function(){
11         time.html(date.getMinutes().toString() + ":" + date.getSeconds().toString());
12         time.attr("value",com(date.getMinutes().toString()) + ":" + com(date.getSeconds().toString()));
13         date.setTime(date.getTime() - 1000);
14         var r;
15         if(date.getMinutes() == 0 && date.getSeconds() == 0)
16         {
17             r = confirm("时间到!,是否提交答案?");
18             if(r)
19                 $(".submit").click();
20             else window.clearInterval();
21         }
22     },1000)
23     
24     pause.click(function(){
25         window.clearInterval();
26     });
27 }
28 
29 function com(s){
30     if(s < 10)
31         s = "0" + s;
32     return s;
33 }
View Code

运行结果截图:

 

 

 

编程总结分析:

  完成本项目,我们用到了jsp进行动态页面制作、与用户进行数据交互,并使用CSS给页面添加样式,在计时功能部分,使用javascript脚本使用JQuery库对页面中的元素进行操作。

  编程中遇到的主要问题是:如何随机生成适当的题目。因当直接生成随机题目并根据整数限制将其过滤时,乘除法题目受限制较大,结果生成大量加减法,几乎没有乘除法。

  解决方案:首先考虑题目类型,随机生成加、减、乘、除中的一个运算符,然后再生成运算数。

  在完成本任务的过程中,我们也遇到一些其它问题,见随笔《JAVAWeb问题总结》1、2。

posted @ 2017-12-06 07:34  ╄冷丶夜♂  阅读(267)  评论(0编辑  收藏  举报