zoukankan      html  css  js  c++  java
  • 第三次作业:个人项目小学四则运算 “软件”之初版

     

    这次作业的要求来自于: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.没有使用复杂的方法,例如封装。

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

  • 相关阅读:
    new对象数组时的内存布局
    写程序取自己进程的AEP
    类虚函数表原理实现分析(当我们将虚表地址[n]中的函数替换,那么虚函数的实现就由我们来控制了)
    测试 __try, __finally, __except(被__finally捕获的异常, 还会被上一级的__except捕获。反之不行)
    围观M$的new
    将258.369 double值转为内存表示(科学计数法)
    Broadcast Reveiver作用
    DEBUG模式下, 内存中的变量地址分析
    不包含SDK头文件, 补全API定义
    俄罗斯方块SDK版
  • 原文地址:https://www.cnblogs.com/zyx1998/p/9764003.html
Copyright © 2011-2022 走看看