20175226 2018-2019-2《java程序设计》结对编程-四则运算(第二周-阶段总结)

本文介绍了一款用于自动生成小学四则运算题目的命令行程序,支持整数、真分数运算,以及多运算符组合,包括括号处理。系统能够统计用户的答题正确率,涉及关键技术包括随机数生成、中缀表达式转后缀表达式及计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

  • 自动生成小学四则运算题目(加,减,乘,除)
  • 支持整数
  • 支持多运算符(比如生成包含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;
    }
}

测试方法

1592241-20190414192817201-1611768274.png

运行过程截图

1592241-20190414193005178-1036648128.png

代码托管地址

代码托管

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

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

总结

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

PSP

计划预估耗时(分钟)实际耗时(分钟)
估计这个任务需要多少时间200200
开发
需求分析 (包括学习新技术)120150
生成设计文档3030
设计复审 (和同事审核设计文档)6075
代码规范 (为目前的开发制定合适的规范)90105
具体设计3060
具体编码720810
代码复审6060
测试(自我测试,修改代码,提交修改)9090
报告
测试报告2020
计算工作量1010
事后总结, 并提出过程改进计划240270
合计15001710

参考引用

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.youkuaiyun.com/newgrammer/article/details/757522
https://en.wikipedia.org/wiki/Polish_notation

转载于:https://www.cnblogs.com/20175226wpy/p/10707113.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值