zoukankan      html  css  js  c++  java
  • 20175226 2018-2019-2《java程序设计》结对编程-四则运算(第二周-阶段总结)

    需求分析(描述自己对需求的理解,以及后续扩展的可能性)

    实现一个命令行程序,要求:

    • 自动生成小学四则运算题目(加,减,乘,除)
    • 支持整数
    • 支持多运算符(比如生成包含100个运算符的题目)
    • 支持真分数
    • 统计正确率

    设计思路(同时输出UML类图)

    首先要输入生成题目的数目m

    • 计算机根据输入的数目生成m道题
    • 每道题生成的数字要随机且在0~10之间,且要生成分数
    • 生成的字符也要随机且字符数在1~100之间,字符不止加减乘除,还有括号,除的时候要考虑除数不能为零
      用户输入值和计算机原本结果进行对比
    • 如果正确,则输出正确
    • 如果错误,则输出错误,正确答案为:输出答案,还应包括真分数计算
      答题结束后,计算机自动计算答题正确率

    实现过程中的关键代码解释

    计算生成题目

    package CaculateSystem;
    import java.util.Random;
    
    public class ProduceProblem {
        public int ProduceProblem () {
            String s = "";
            Random shu = new Random();//每个运算式的随机数
            int count = 1; //记录符号;
            char[] operator = new char[]{'+', '-', '*', '/'};
            int m = 2 + (int) (Math.random() * 6); //每个运算式数目的个数
            for (int j = 0; j < m; j++) {
                int num = shu.nextInt(10);
                s = s +" "+ num;
                if (count < m) {
                    int c = shu.nextInt(4);
                    s = s +" "+ operator[c];
                    count++;
                }
            }
            String [] str = s.split(" ");
            System.out.println(s + "=");
            Translate t = new Translate(str);
            return t.flag;
        }
    }
    

    将中缀转换为后缀

    package CaculateSystem;
    import java.util.Stack;
    
    public class Translate extends Judge{
        int flag;
        public Translate (String[] args) {
            Stack<String> z = new Stack<String>();
            String jieguo = "";
            String t = "";
            for (int i = 0; i < args.length; i++) {
                switch (args[i]) {
                    case "(":
                        z.push(args[i]);
                        break;
                    case "+":
                    case "-":
                        while(z.empty() != true) {
                            t = z.pop();
                            if (t.equals("(")) {
                                z.push(t);
                                break;
                            }
                            jieguo = jieguo + t + " ";
                        }
                        z.push(args[i]);
                        break;
                    case "*":
                    case "/":
                        while(z.empty() != true) {
                            t = z.pop();
                            if (t.equals("+") || t.equals("-") || t.equals("(")) {
                                z.push(t);
                                break;
                            }
                            jieguo = jieguo + t + " ";
                        }
                        z.push(args[i]);
                        break;
                    case ")":
                        while (z.empty()== false) {
                            t = z.pop();
                            if (t.equals("(")) {
                                break;
                            } else {
                                jieguo = jieguo + t + " ";
                            }
                        }
                        break;
                    case" ":
                        break;
    
                    default:
                        jieguo = jieguo + args[i] + " ";
                        break;
                }
    
            }
    
            while (z.empty() == false) {
                jieguo = jieguo + z.pop() + " ";
            }
            String [] str = jieguo.split(" ");
            Count py = new Count(str);
            int answer = py.answer;
            flag = A(answer);
        }
    
        public Translate() {
    
        }
    }
    

    生成分数

    package CaculateSystem;
    
    import java.util.Random;
    
    public class CreatOpNum {
        Rational opNum = new Rational();
        Random random = new Random();
        String opnumFile = "";
        String opnumPri = "";
        int flag;
    
        CreatOpNum(int flag1) {
            flag = flag1;
            int a = random.nextInt(9)+1;
            opNum.setNumerator(a);
            if (flag1 == 1) {//是分数
                int b = random.nextInt(9)+1;
                while (b == 0) {
                    b = random.nextInt(9)+1;
                }
                opNum.setDenominator(b);
            } else {//不是分数
                opNum.setDenominator(1);
            }
        }
    
        public void getOpNumFile() {
            opnumFile = opNum.getNumerator() + " / " + opNum.getDenominator();
        }
    
        public void getOpNumPri() {
            if (flag == 0) {
                opnumPri = opNum.getNumerator() + "";//输出整数
            } else if (opNum.getNumerator() > opNum.getDenominator()) {//假分数
                int n = opNum.getNumerator() / opNum.getDenominator();
                int m = opNum.getNumerator() % opNum.getDenominator();
                opnumPri = n + " +  " + m + " / " + opNum.getDenominator();
            } else {
                opnumPri = opNum.getNumerator() + " / " + opNum.getDenominator();
            }
        }
    }
    

    带分数的计算

    package CaculateSystem;
    public class Rational {//有理数
        int numerator = 1;//分子
        int denominator = 1;//分母
    
        void setNumerator(int a) {//设置分子
            int c = f(Math.abs(a), denominator);//计算最大公约数
            numerator = a / c;
            denominator = denominator / c;
            if (numerator < 0 && denominator < 0) {
                numerator = -numerator;
                denominator = -denominator;
            }
        }
    
        void setDenominator(int b) {//设置分母
            int c = f(numerator, Math.abs(b));//计算最大公约数
            numerator = numerator / c;
            denominator = b / c;
            if (numerator < 0 && denominator < 0) {
                numerator = -numerator;
                denominator = -denominator;
            } else if (numerator > 0 && denominator < 0) {
                numerator = -numerator;
                denominator = -denominator;
            }
        }
    
        int getNumerator() {
            return numerator;
        }
    
        int getDenominator() {
            return denominator;
        }
    
        int f(int a, int b) {//求a,b的最大公约数
            if (a == 0) {
                return 1;//c为分母不能为0
            }
            if (a < b) {//令a>b
                int c = a;
                a = b;
                b = c;
            }
            int r = a % b;
            while (r != 0) {
                a = b;
                b = r;
                r = a % b;
            }
            return b;
        }
    
        Rational add(Rational r) {//加法运算
            int a = r.getNumerator();//返回有理数r的分子
            int b = r.getDenominator();//返回有理数r的分母
            int newNumerator = numerator * b + denominator * a;//计算出新分子
            int newDenominator = denominator * b;//计算出新分母
            Rational result = new Rational();
            result.setNumerator(newNumerator);
            result.setDenominator(newDenominator);
            return result;
        }
    
        Rational sub(Rational r) {//减法运算
            int a = r.getNumerator();
            int b = r.getDenominator();
            int newNumerator = numerator * b - denominator * a;
            int newDenominator = denominator * b;
            Rational result = new Rational();
            result.setNumerator(newNumerator);
            result.setDenominator(newDenominator);
            return result;
        }
    
        Rational muti(Rational r) {//乘法运算
            int a = r.getNumerator();
            int b = r.getDenominator();
            int newNumerator = numerator * a;
            int newDenominator = denominator * b;
            Rational result = new Rational();
            result.setNumerator(newNumerator);
            result.setDenominator(newDenominator);
            return result;
        }
    
        Rational div(Rational r) {//除法运算
            int a = r.getNumerator();
            int b = r.getDenominator();
            Rational result = new Rational();
            if (a == 0) {
                System.out.println("分母/除数不能为0");
                result.setNumerator(0);
                System.exit(0);
            } else {
                int newNumerator = numerator * b;
                int newDenominator = denominator * a;
                result.setNumerator(newNumerator);
                result.setDenominator(newDenominator);
            }
            return result;
        }
    }
    

    测试方法

    运行过程截图

    代码托管地址

    代码托管

    对结对的小伙伴做出评价(重点指出需要改进的地方)

    挺开心我的同伴能接受与我组队的请求,在这个阶段的研讨中他就像比喻中的副驾驶的位置,为我观察这我发现不了的坑,也在必要的分叉口给了我很多有用的建议,比如在生成随机式子的时候我在弄出简单的随机生成之后,生成较长式子的算法就是由他提醒编写的,当然这样的情况会有很多,我负责大体,而他就负责细节,检查。他很好的在结对下扮演了一个领航员的位置。不过我觉得我的伙伴需要提升一下自己的自信,其实好多事情他都可以独立很好的完成的。

    总结

    • 总结:
      • 1.我们完成了当初计划的大部分类与主程序的编写
      • 2.运行后能达到我们预期的目的
      • 3.我们没有完成的计划是关于插入括号这一项的编写
      • 4.完成括号(已有思路),且回到博客进行查缺补漏
      • 5.完成扩展需求包括(真分数)
      • .进行测试
    • 未完成项目
      • 1.文件语言包拓展
      • 2.虽然时间到了,不过我们还是会继续完成剩下的内容,然后回来完善博客

    PSP

    计划 预估耗时(分钟) 实际耗时(分钟)
    估计这个任务需要多少时间 200 200
    开发
    需求分析 (包括学习新技术) 120 150
    生成设计文档 30 30
    设计复审 (和同事审核设计文档) 60 75
    代码规范 (为目前的开发制定合适的规范) 90 105
    具体设计 30 60
    具体编码 720 810
    代码复审 60 60
    测试(自我测试,修改代码,提交修改) 90 90
    报告
    测试报告 20 20
    计算工作量 10 10
    事后总结, 并提出过程改进计划 240 270
    合计 1500 1710

    参考引用

    http://www.cnblogs.com/math/p/se-tools-001.html
    http://www.cnblogs.com/vertextao/p/6593339.html
    http://www.cnblogs.com/Vivian517/p/8762830.html
    https://blog.csdn.net/newgrammer/article/details/757522
    https://en.wikipedia.org/wiki/Polish_notation

  • 相关阅读:
    sgg_3_hibernate详解
    sgg_2_hibernate开发步骤
    sgg_1_hibernate概述
    cookie
    exchange 普通用户可以创建通讯组
    DC 维护常用工具命令DCdiag
    cp 复制不覆盖
    powershell 结果输出显示为……
    获得用户完整的autodiscover配置文件
    【转】outlook 2016 配置自动发现
  • 原文地址:https://www.cnblogs.com/20175226wpy/p/10707113.html
Copyright © 2011-2022 走看看