软件工程结对作业01

Posted ╄冷丶夜♂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程结对作业01相关的知识,希望对你有一定的参考价值。

程序设计思想:

大致思路:定义表达式类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

以上是关于软件工程结对作业01的主要内容,如果未能解决你的问题,请参考以下文章

软件工程网络15结对编程作业

软件工程结对作业01

软件工程结对作业01

软件工程结对作业01

软件工程结对作业01

软件工程结对作业01