这次作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166
我的github远端库地址:https://github.com/yuxuan111/zyx
第一部分:要求
具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11。
第二部分:设计
1.需求分析
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.没有使用复杂的方法,例如封装。
第四部分:个人软件过程耗时估计与统计表