软件工程结对作业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 }
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 }
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 }
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的主要内容,如果未能解决你的问题,请参考以下文章