zoukankan      html  css  js  c++  java
  • 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%

    十一、结对学习照片

    十二、点评伙伴

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

    十三、参考资料

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

  • 相关阅读:
    20172328《程序设计与数据结构》实验一报告
    20172328《程序设计与数据结构》第三周学习总结
    20172328《程序设计与数据结构》第二周学习总结
    20172328《程序设计与数据结构》第一周学习总结
    预备作业03
    预备作业02
    寒假作业01
    竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生
    Java全栈第二篇-IDEA的安装及教育包领取(高校免费一年)和入门教程
    Java全栈第一篇-流程控制语句
  • 原文地址:https://www.cnblogs.com/SANFENs/p/10656427.html
Copyright © 2011-2022 走看看