zoukankan      html  css  js  c++  java
  • 软件工程个人作业01

    (已改编为网页版)

    程序设计思想:

    创建表达式类Expression、运算数类RationalNumber、表达式随机生成器类ExpressionRandom、表达式组成元素类Element

    每个Element由一个运算数(RationalNumber) + 一个运算符(String)构成

    对每一个表达式,按照以下规则将其拆分:

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

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

    每个表达式为2个或三个Element构成的列表(List),最后一个元素(Element)没有跟着的运算符,补充"#"即表达式“2+3-4/7”由一个列表{2+、3-、4/7#}表示。

    源程序代码:

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

    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,nume,demo;        //循环变量,分子,分母
    17         /***随机生成elementNum个Element(随机分数 + 运算符),并添加到expr***/
    18         for(i = 0;i < elementNum;i++) {
    19             nume = (int) (Math.random() * 101);
    20             if(isFraction)
    21                 demo = (int) (Math.random() * 100 + 1);        //分母不能为0
    22             else demo = 1;
    23             String oper = operator[(int)(Math.random() * 4)];
    24             RationalNumber rb = new RationalNumber(nume,demo);
    25             rb.simply();
    26             expr.add(new Element(rb,oper));
    27         }
    28         expr.get(i-1).setOperator("#");
    29         /****通过expr构造运算表达式,并返回****/
    30         return new Expression(expr);
    31     }
    32     
    33     /****得到经过过滤的表达式*****/
    34     public static Expression getValidExpression(int elementNum,boolean isFraction) {
    35         Expression expr = null;
    36         do {
    37             expr = getExpression(elementNum,isFraction);
    38         }while(expr.getResult() == null);                //(当表达式不合法时,返回计算结果为null)
    39         return expr;
    40     }
    41     
    42     /******测试主函数********/
    43     public static void main(String[] args) {
    44         for(int i = 0;i < 100;) {
    45             Expression expr = ExpressionRandom.getExpression(2, true);
    46             if(expr.getResult() != null) {
    47                 System.out.println(expr.toString() + "=" + expr.getResult() + "
    ");
    48                 i++;
    49             }
    50         }
    51     }
    52 }

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" href="css/style.css"/>
    <title>小学生四则运算</title>
    
    </head>
    <body>
    <img alt="asdfsadf" src="img/pdf.png">
        <form action="arithmetic.jsp" class="option">
            <center><h2>题目定制</h2></center>
            <p>请选择题目类型:
                <select name="elementNum">
                    <option>2</option>
                    <option>3</option>
                </select>元运算<br /></p>
            题目数量:
                    <input name="count" value="10" type="radio" />10
                    <input name="count" value="20" type="radio" />20
                    <input name="count" value="30" type="radio" />30
                    <input name="count" value="40" type="radio" />40
                    <input name="count" value="50" type="radio" />50
                    <input name="count" value="60" type="radio" />60<br/>
                    <input name="count" value="1000000" type="radio" />10000000(极限测试,慎选!!)
                <br /><br />
                <input type="checkbox" name="fraction" /><label>分数计算</label>
            <br />
            <button class="submit" style="margin-top:50px">开始答题!</button>
        </form>
    </body>
    </html>

    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 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     8 <html>
     9 <head>
    10         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    11         <title>小学生算数</title>
    12         <link rel="stylesheet" type="text/css" href="css/style.css"/>
    13         <script type="text/javascript" src="js/jquery-2.1.0.js" ></script>
    14         <script type="text/javascript" src="js/demo.js" ></script>
    15     </head>
    16     <body>
    17     
    18     <%
    19         //题目数量
    20         String str = request.getParameter("count");
    21     
    22         int count = 0;                        //题目数量
    23         int elementNum = 0;                    //运算数个数
    24         boolean isFraction = false;            //分数计算
    25         List<Expression> exprs = new ArrayList<Expression>();    //题目
    26         if(str != null){                    //判断是由用户定制题目页面跳转至该页面
    27             count = Integer.parseInt(str);
    28             elementNum = Integer.parseInt(request.getParameter("elementNum"));
    29             isFraction = (request.getParameter("fraction") != null);
    30             for(int i = 0;i < count;i++){
    31                 exprs.add(ExpressionRandom.getValidExpression(elementNum, isFraction));
    32                 //out.println(exprs.get(i).toString());
    33             }
    34             session.setAttribute("exprs", exprs);
    35         }else{
    36             
    37         }
    38     %>
    39     <form action="result.jsp">
    40         <table class="box" align="center" border="0" cellspacing="10" cellpadding="10">
    41     <%for(int i = 0;i < count;i+=2){%>
    42             <tr>
    43                 <td align="center" class='expr'>
    44                     <%=exprs.get(i).toHtmlDiv()%>
    45                 </td>
    46                 <td><input autocomplete="off" value="" class="result" name="result" type="text"/></td>
    47                 <td align="center" class='expr'>
    48                     <%=exprs.get(i + 1).toHtmlDiv()%>
    49                 </td>
    50                 <td><input autocomplete="off" value="" class="result" name="result" type="text"/></td>
    51             </tr>
    52         <%} %>
    53             <tr>
    54                 <td colspan="4" align="center"><button class="submit">提交</button></td>
    55             </tr>
    56         </table>
    57         <input name="time" class="timer" type="text" />
    58     </form>
    59     </body>
    60 </html>

    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>

    运行结果截图:

    上课未按时完成的原因:未能迅速理清思路。

  • 相关阅读:
    spark
    mongdb
    redis
    mysql
    kylin
    kafka
    hadoop+hive+hbase+kylin
    git
    elasticsearch
    clickhouse
  • 原文地址:https://www.cnblogs.com/lzq666/p/7955376.html
Copyright © 2011-2022 走看看