这次作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166

我的github远端库地址:https://github.com/yuxuan111/zyx

 

第一部分:要求

具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11。

 

第二部分:设计

1.需求分析

   (1)随机产生 100 之内的正整数或者真分数的题目。
    (2)答案不能是负数。
    (3)题目数根据用户而定。
      (4)运算式子必须至少有两个运算符。
.     (5)判断用户输入值的对错,并给出用户的正确题目数和分数。

2.功能设计

      1.根据用户要求的题目数,循环num次输出随机四则运算。

      2.判断用户输入值是否正确,并给出正确题目数和算出分数。

      3.答案不能小于0,小于0就重新输出题目。

      4.能出和真分数 (二分之一, 十二分之五,等)相关的练习题。

 

第三部分:代码实现

总体设计:

①随机产生100以内的正整数,运算符号的值,运算符号数目;随机生成的运算符号的值在运算符号数组调用,用switch语句输出两个运算符或者三个运算符的题目,乘除和加减优先级别:先乘除后加减,两个运算符情况有四种特殊运算位置考虑,三个运算符情况有16种特殊运算位置考虑。

②当随机产生的正整数题目结果为负数则j--(即当前产生的题目数减1),结果为正数则根据随机生成的运算符号个数产生题目后,输入用户的回答,正确即统计正确题数,错误即输出正确结果,输出每道题就h++之后输出h*100/num(分数)。

③真分数的设计:分子>分母,用分母的值放在取随机数的最大值上,分数运算时,如果出现分母不同时则需要通分,将分子和分母的最小值的数值,从大到小去除分子和分母,如果能够同时被整除,则以此数值约分。

 

 

运行结果:

 

 

 

 

 

关键代码讲解:

一、根据随机生成的运算符号值参与运算,两数运算结果为为sum1,三数运算结果为为sum,do while(J<num)为题目数循环。

do {
                     //sum1为两数运算的结果,sum为三数运算的结果,sum2为四数运算的结果
                    int sum = -1, sum1 = -1, sum2 = -1;
                    //生成100以内的正整数
                    for (int i1 = 0; i1 < 4; i1++) {
                        b[i1] = (int) (Math.random() * 100+1);
                    }
                    //随机生成1到4的值
                    for (int i1 = 0; i1 < 4; i1++) {
                        c[i1] = (int) (Math.random() * 4+1);
                    }
                    //随机生成运算符的个数
                    k = (int) (Math.random() * 3 + 2);
                    switch (c[0]) {
                        case 1:
                            sum1 = b[0] + b[1];
                            break;
                        case 2:
                            sum1 = b[0] - b[1];
                            break;
                        case 3:
                            sum1 = b[0] * b[1];
                            break;
                        case 4:
                                sum1 = b[0] / b[1];
                            break;
                    }
                    switch (c[1]) {
                        case 1:
                            sum = sum1 + b[2];
                            break;
                        case 2:
                            sum = sum1 - b[2];
                            break;
                        case 3:
                            if (c[0] == 1) {
                                sum = b[0] + b[1] * b[2];break;
                            }
                            if (c[0] == 2) {
                                sum = b[0] - b[1] * b[2];
                                break;
                            }
                        case 4:
                            if (c[0] == 1) {
                                sum = b[0] + b[1] / b[2];break;
                            }
                        if (c[0] == 2) {
                            sum = b[0] - b[1] / b[2];
                                break;

 

二、产生真分数与约分,分数题目通过if实现。

产生真分数:

for (i = 0; i < x; i++) {
                    m1 = 1 + (int) (Math.random() * B);//随机生成一个小于B的分母
                    x1 = (int) (Math.random() * m1);//生成一个比分母小的分子,实现真分数
                    m2 = 1 + (int) (Math.random() * B);//随机生成一个小于B的分母
                    x2 = (int) (Math.random() * m2);//生成一个比分母小的分子,实现真分数
                    int c = (int) (Math.random() * 3);//生成运算符
                    if (c == 0) {
                        Z = x1 * m2 + x2 * m1;
                        M = m1 * m2;
                        d = yuefen(Z, M);
                        System.out.print(x1 + "/" + m1 + "+" + x2 + "/" + m2 + "= " + d + "  "+"\n");
                    }
                    if (c == 1) {
                        Z = x1 * m2 - x2 * m1;
                        M = m1 * m2;
                        d = yuefen(Z, M);
                        System.out.print(x1 + "/" + m1 + "-" + x2 + "/" + m2 + "= " + d + "  "+"\n");
                    }
                    if (c == 2) {
                        Z = x1 * x2;
                        M = m1 * m2;
                        d = yuefen(Z, M);
                        System.out.print(x1 + "/" + m1 + "*" + x2 + "/" + m2 + "= " + d + "   "+"\n");
                    }
                    if (c == 3) {
                        Z = m1 * x2;
                        M = m2 * x1;
                        d = yuefen(Z, M);
                        System.out.print(x1 + "/" + m1 + "/" + x2 + "/" + m2 + "= " + d + "  "+"\n");
                    }

 

约分:

public static String yuefen(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;
    }

 

 

第四部分:问题及解决方法

1.怎么解决先乘除后加减的问题?

如果是两个运算符先判断第二个运算符是否乘除,有就前两个数不能先算结果,保留到与第三个数运算;如果三个运算符先判断第三个运算符是否乘除,然后看第二个运算符是否加减,有就前三个数不能先算结果,保留到与第四个数运算。

2.结果可以为负数,试了很多方法,最终找了一个好的方法?

定义一个在结果为负数和下一次循环的变量,用来控制题目数量,大于0就输出题目。

3.分数怎么约分?

将分子和分母的最小值的数值,从大到小去除分子和分母,如果能够同时被整除,则以此数值约分。

总结:

这个实验,找到了自己编程的不足之处,然后通过查找资料解决,有不懂的问题也向同学请教,但是觉得自己的代码思想不够渊博;明白了一个好的程序开发是一件不容易的事情,没有好的知识功底是无法创造出好的软件。天生我才必有用,千金散尽还复来,我会用这句话激励自己用功学习。

 不足之处:

1.代码的容错性不够好。

2.没有使用复杂的方法,例如封装。

第四部分:个人软件过程耗时估计与统计表