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.没有使用复杂的方法,例如封装。

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

  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/zyx1998/p/9764003.html
Copyright © 2011-2022 走看看