20175314 结队编程项目——四则运算第一周

20175314 结队编程项目——四则运算第一周

  • 结对小组成员:20175302闫君廷 20175314薛勐

一、任务要求

1、自动生成四则运算题目(加、减、乘、除)
2、支持复合运算(支持整数、多运算符、支持真分数)
3、统计正确率或得分
4、既可以用前缀算法(波兰算法)实现加减乘除也可以用后缀算法实现

二、需求分析

1、自动生成表达式(多运算符,随机数为整数)
2、运用堆栈前缀表达式的计算机求值
3、计算自动生成的表达式的结果
4、判断用户输入的答案是否和正确答案相符
5、统计正确题目的个数

三、本周达成

  • 自动生成四则运算题目(加、减、乘、除)并可控整数范围和题目数量
  • 支持复合运算(支持整数、多运算符、支持真分数)
  • 可以反馈题目正确与否,若错误则给出正确答案

四、代码

PracticeSystem.java

import java.util.*;
public class PracticeSystem {
    public static void main(String[] args) {
        int a, b, c, i, f , y, m1, m2, x1, x2;
        yunsuan yunsuan =new yunsuan();
        Scanner in = new Scanner(System.in);
        System.out.println("欢迎使用四则运算系统");
        System.out.println("请输入题目数量:");
        int total = in.nextInt();
        System.out.println("请输入整数范围:");
        y = in.nextInt();
        for (i = 0; i < total; i++) {
            f = (int) (Math.random() * 2);//随机生成0或1,0是整数,1是真分数,3,4是复杂运算
            if (f == 0) {
                int d = 0;
                int answer;
                a = (int) (Math.random() * (y + 1));//随机生成一个范围内的整数
                b = (int) (Math.random() * (y + 1));//随机生成一个范围内的整数
                if (b == 0)
                    c = (int) (Math.random() * 3);//随机生成一个0-3的整数,0表示加法,1表示减法,2表示乘法,3表示除法
                else
                    c = (int) (Math.random() * 4);
                if (c == 0) {
                    d =yunsuan.jia(a,b);
                }
                if (c == 1) {
                    d =yunsuan.jian(a,b);
                }
                if (c == 2) {
                    d =yunsuan .cheng(a,b);
                }
                if (c == 3) {
                    d =yunsuan.chu(a,b);
                }
                answer = in.nextInt();
                if (answer == d)
                    System.out.println("回答正确");
                else
                    System.out.println("回答错误,正确答案是:" + d);
            }
            if (f == 1) {
                String d = null;
                m1 = 1 + (int) (Math.random() * y);//随机生成一个小于y的分母
                x1 = 1 + (int) (Math.random() * m1);//生成一个比分母小的分子,实现真分数
                m2 = 1 + (int) (Math.random() * y);//随机生成一个小于y的分母
                x2 = 1 + (int) (Math.random() * m2);//生成一个比分母小的分子,实现真分数
                c = (int) (Math.random() * 4);//生成运算符
                if((x1/m1)<(x2/m2)&&c==1)
                    c--;
                if (c == 0) {
                    d=yunsuan.fjia(m1,x1,m2,x2);
                }
                if (c == 1) {
                    d=yunsuan.fjian(m1,x1,m2,x2);
                }
                if (c == 2) {
                    d=yunsuan.fcheng(m1,x1,m2,x2);
                }
                if (c == 3) {
                    d=yunsuan.fchu(m1,x1,m2,x2);
                }
                String answer = in.next();
                if (answer.equals(d))
                    System.out.println("回答正确");
                else
                    System.out.println("回答错误,正确答案是" + d);
            }
        }
    }
}

yunsuan.java

class yunsuan {
    int jia(int a, int b){
        System.out.print(a + " + " + b + " = " );
        return a+b;
    }
    int jian(int a, int b){
        System.out.print(a + " - " + b + " = " );
        return a-b;
    }
    int cheng(int a, int b){
        System.out.print(a + " * " + b + " = " );
        return a*b;
    }
    int chu(int a, int b){
        System.out.print(a + " / " + b + " = " );
        return a/b;
    }
    String fjia(int m1,int x1,int m2,int x2){
        int Z,M;
        Z = x1 * m2 + x2 * m1;
        M = m1 * m2;
        System.out.print("("+x1 + "/" + m1 + ") + (" + x2 + "/" + m2 + ") = ");
        return yuefen.yf(Z, M);
    }
    String fjian(int m1,int x1,int m2,int x2){
        int Z,M;
        Z = x1 * m2 - x2 * m1;
        M = m1 * m2;
        System.out.print("("+x1 + "/" + m1 + ") - (" + x2 + "/" + m2 + ") = ");
        return yuefen.yf(Z,M);
    }
    String fcheng(int m1,int x1,int m2,int x2){
        int Z,M;
        Z = x1 * x2;
        M = m1 * m2;
        System.out.print("("+x1 + "/" + m1 + ") * (" + x2 + "/" + m2 + ")  =");
        return yuefen.yf(Z, M);
    }
    String fchu(int m1,int x1,int m2,int x2){
        int Z,M;
        Z = m2 * x1;
        M = m1 * x2;
        System.out.print("("+x1 + "/" + m1 + ") / (" + x2 + "/" + m2 + ") = ");
        return yuefen.yf(Z, M);
    }
}

yuefen.java

class yuefen {
        static String yf(int a, int b) {
        int y = 1;
        for (
                int i = a;
                i >= 1; i--) {
            if (a % i == 0 && b % i == 0) {
                y = i;
                break;
            }
        }
        int z = a / y;
        int m = b / y;
        if (z == 0) {
            return "0";
        }
        return "" + z + "/" + m;
    }
}

五、码云链接

六、UML类图

七、测试结果

简单题目测试结果正常:

分数运算结果和答案格式不同导致错误(测试异常):

复合运算测试结果暂且正常:

八、遇到的问题


分数运算结果和答案格式不同导致错误:(1/1)+(1/1)=2/1=2,但是程序并不能够区别识别不同的表达形式,我们打算在下一周认真分析解决这个问题并加以总结。

九、心得体会

本次结对项目任务与我们大一上学习的程序设计基础实验一类似,所以在算法设计逻辑上没有遇到困难,但也因为本周我和队友其他事情较多(本周有四科的实验),第一周阶段性的结对项目完成的较为粗糙,但是一个完整的四则运算计算器系统已初具模型,并且这次宝贵的机会给了我们做一个较大程序的体验,与课本上测试题不同,与实验也不尽相同,作为一个系统项目开发,我们需要考虑地更面面俱到,而且即使在编程之前尽我们所能做出完善,也还是会在测试的时候遇到意想不到的问题,通过在网上查找我们也发现了很多我们程序的不足之处,需要不断的学习和完善才能使一个简单的系统趋于完美,比如说前缀表达式的计算机求值,这是我们之前没有遇见过的。因为本周的不足,我们已规划好了在下一阶段的目标,除了完成老师的要求,受启发于Example2_1的例题,我们还打算在我们的四则运算系统程序里加入语言包的功能,这会是一次大胆的尝试也是对未来编程学习的基础。

十、Personal Software Process时间

步骤 耗时 百分比
需求分析 30 12.5%
设计 30 12.5%
代码实现 120 50%
测试 30 12.5%
分析总结 30 12.5%

十一、结对学习照片

十二、点评伙伴

本次我的队友对小组做出了很大的贡献,我们一起商量一起操作,互相交流程序实现的方法。配合比较顺利,感觉还是挺好的,渐渐能够发现结对学习的优越性:能够互相监督,而且每个人都有自己的优势,在一起工作的时候互相取长补短,对每个人的成长也有很大的帮助。下周我们小组将继续挑战自己!

十三、参考资料

逆波兰算法
前缀解析
结对编程练习_四则运算

原文地址:https://www.cnblogs.com/SANFENs/p/10656427.html