第一次作业——四则运算

需求分析

   1、控制运算表达式题目数量,控制题目中数值的大小

   2、题目中存在分数形式要进行约分

   3、运算符个数不能超过3个

   4、不能出现重复题目,即两个运算表达式的计算步骤不能完全相同

   5、程序同时支持计算生成的每道题目,并对结果进行约分

   6、对用户所做答案进行判断,并且输出正确答案或错误答案

功能设计

   基本功能 

       1、根据控制台输入的数字随机生成指定运算元个数和算式数目的运算符

          2、基本的四则运算功能

          3、式子中的分数和最终计算结果均约分到最简

设计实现

  环境

    windows10+java

程序结构设计

 

程序设计

功能点1:生成随机数

随机数生成方法:public class CreateNum
public class CreateNum{//产生操作数
    public String Num() {
        String Num = "";
        Reduction rdct = new Reduction();
        int numerator; //分子
        int denominator; //分母
        numerator = (int)(Math.random() * 10);
        denominator = (int)(Math.random() * 9) + 1;
        int i = (int)(Math.random() * 3);
        if(i<2){//控制整数概率为2/3
            Num += numerator;
        }else{
        Num= rdct.reductNum(numerator, denominator);
        }
        return Num;
    }
}

功能点2:生成随机运算符

随机运算符生成方法:public class CreateSymbol
public class CreateSymbol {
    public String Symbol(){
        String symbol = null;
        int i = (int) (Math.random() * 4);
        
        switch (i) {//生成加减乘除运算符
        case 0:
            symbol = "+";
            break;
        
        case 1:
            symbol = "-";
            break;
        
        case 2:
            symbol = "*";
            break;
        
        case 3:
            symbol = "÷";
            break;
        }
        return symbol;
    }
}

功能点3:组成算数表达式

组成算数表达式方法: public class CreateExp

public class CreateExp {//产生表达式
     public ArrayList<Object> createexp() {
         ArrayList<Object> list = new ArrayList<Object>();
         CreateNum cnum = new CreateNum();
         CreateSymbol csymbol = new CreateSymbol();
         int sybno =  (int) (Math.random() * 3)+1;//随机运算符个数为1-3
         list.add(cnum.Num());
             for(int i=0;i<sybno;i++){
                 list.add(csymbol.Symbol());
                 list.add(cnum.Num());
             }
        int p =   (int) (Math.random() * 3);//控制生成括号的概率为1/3
        if(p<1){
            if(sybno != 1){//一个运算符不加括号
                int LeftPosition = (int)(Math.random()*sybno)*2;//左括号位置
                list.add(LeftPosition, "(");
                int tempLeft =list.indexOf("(");
                if((tempLeft+4) != list.size()){
                    int RightPosition =tempLeft+4+(int)(Math.random()*sybno-1)*2;
                    list.add(RightPosition, ")");
                }else{
                    int RightPosition =list.size();
                    list.add(RightPosition, ")");
                }
                
            }
        }
        return list;
     }
     
}

功能点4:约分

public static String reductNum(int numerator,int denominator)

public static String reductNum(int numerator,int denominator) {
        String rdNum = "";
        if(denominator==0) {
            System.exit(0);
        }
        if(numerator%denominator==0) {
            rdNum+=(numerator/denominator);
        }else {
            if(numerator<denominator) {
                int maxFactor = getDivisor(numerator,denominator);
                if(maxFactor==0) {
                    rdNum+=0;
                }else {
                    int tempNumerator = numerator/maxFactor;
                    int tempDenominator = denominator/maxFactor;
                    rdNum+=tempNumerator+"/"+tempDenominator;
                }
            }else {
                int theMod = numerator%denominator;
                int theTimes = numerator/denominator;
                int maxFactor = getDivisor(theMod,denominator);
                if(maxFactor==0) {
                    rdNum+=0;
                }else {
                    theMod = theMod/maxFactor;
                    denominator = denominator/maxFactor;
                    rdNum+=theTimes+"'"+theMod+"/"+denominator;
                }
            }
        }
        return rdNum;
    }


 功能点5:逆波兰式

public ArrayList<Object> RPN(String formula);

public ArrayList<Object> RPN(String formula) {
        //用哈希键值对映射左运算符的优先级
        HashMap<String, Integer> lpri = new HashMap<String,Integer>();
        lpri.put("=",0);
        lpri.put("(",1);
        lpri.put("*",5);
        lpri.put("÷",5);
        lpri.put("+",3);
        lpri.put("-",3);
        lpri.put(")",6);
        //用哈希键值对映射右运算符的优先级
        HashMap<String, Integer> rpri = new HashMap<String,Integer>();
        rpri.put("=",0);
        rpri.put("(",6);
        rpri.put("*",4);
        rpri.put("÷",4);
        rpri.put("+",2);
        rpri.put("-",2);
        rpri.put(")",1);
        //创建栈
        Stacks op = new Stacks();
        op.data = new char[200];
        op.top=-1;
        op.top++;
        op.data[op.top]='=';
        //把传入的表达式转化成字符数组
        char[] exp = formula.toCharArray();
        //用来存储后缀表达式
         ArrayList<Object> list = new ArrayList<Object>();
        int j=0;
        while(j<exp.length) {
            if(!inOp(exp[j])) {
                while(j<exp.length&&((exp[j]>='0'&& exp[j]<='9')||(exp[j]=='\'')||(exp[j]=='/'))) {
//                    System.out.println(exp.length);
                    list.add(exp[j]);
                    j++;
                }
                list.add('#');
            }else {
                switch(precede(lpri.get(op.data[op.top]+""),rpri.get(exp[j]+""))){
                case -1:
                    op.top++;
                    op.data[op.top]=exp[j];
                    j++;
                    break;
                case 0:
                    op.top--;
                    j++;
                    break;
                case 1:
                    list.add(op.data[op.top]);
                    op.top--;
                    break;
                }
            }    
        }
        while(op.data[op.top]!='=') {
            list.add(op.data[op.top]);
            op.top--;
        }
        return list;
    }

运行结果

 

 

 

 

 

代码:https://coding.net/u/chen556644/p/Job1/git

psp表格

PSP2.1 Personal Software Process Stages Time Senior Student Time
Planning 计划 10 10
· Estimate 估计这个任务需要多少时间 10 8
Development 开发 158 280
· Analysis 需求分析 (包括学习新技术) 13 15
· Design Spec 生成设计文档 17 8
· Design Review 设计复审 5 3
· Coding Standard 代码规范 10 15
· Design 具体设计 20 50
· Coding 具体编码 120 180
· Code Review 代码复审 10 30
· Test 测试(自我测试,修改代码,提交修改) 20 20
Reporting 报告 10 NaN
· 测试报告 10 NaN
· 计算工作量 10 NaN
· 并提出过程改进计划 20 NaN
posted @ 2017-09-24 14:02  陈笑林  阅读(274)  评论(2编辑  收藏  举报