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类图

截图

问题

最早使用的是Scanner语句进行参数输入,后来请教了同学学习使用命令行输入,在终端java的时候一起输入参数,输入方式感觉极为奇怪,暂时没有发现这样输入的优势。

猜你喜欢

转载自www.cnblogs.com/SANFENs/p/10656427.html