• 软件工程第二个程序:“像阿超那样,花20分钟写一个能自动生成小学四则运算题目的 ‘软件’”的功能扩充


    软件工程第二个程序:“像阿超那样,花20分钟写一个能自动生成小学四则运算题目的 ‘软件’”的功能扩充

    四则运算的题目一般含有两个或两个以上运算符号及括号,可以计算出为一个数的结果。
    生成四则运算题目,先来设置下数量,格式,数值范围,再问问负数有没有,余数出不出,分数和小数呢,接着就开始使用 随机生成数函数 生成一个有范围的随机数,再配上运算符,然后输出整个题目,有的在生成题目的时候计算出答案,保存起来;有的在输出题目后 记录题目,对题目进行计算得出结果。接着循环。。。循环结束 给出答案,或判断对错。

    实现起来可能会遇到点困难,问题大多集中在括号的使用上,顺序生成的题目里不好插入括号,也不便计算结果。这时,有的同学想起了编译方法课中所讲的各种文法;有的同学模糊回忆起数据结构里的二叉树;还有的同学直接翻出了大一时的ACM习题集。没有问题,这些都可以解决眼前的困难。而我也找到了我的方法:

    之前在生成两个数之间的加减运算题目时没多想什么,但现在要多生成几个数运算时,觉得应该用递归,循环嵌套,生长,生长?思路来了,于是编写quesGrow()函数(原谅我的英语水),然后依然用到Math.random()函数,递归一层又一层的生成随机数和运算符,定义全局变量来记录生成的随机数和运算符,顺便一步步的计算部分结果,指定递归结束的条件(提前设置 题中数的个数),随机的在某些层中加上括号,递归一层又一层的都结束后,把题目输出,结果也跟上吧,看看答案对不对。然后循环 输出几十上百道的。

    这里每一道题目都用的是一边出题,一边计算结果的方式 得出答案的。还可以在一道题目完全给出的时候,报题目给另一独立的计算函数计算 再返回结果。这个时候,有上进心的同学一定会动手试着编写的,然而像我这样的选手第一时间想起了互联网。。。这种程序不会没人写的。呼呼

    http://blog.csdn.net/lip009/article/details/7768258

    甚合朕意 :) 用之。在包里加个类,把它粘上,在调用一下,加在后面看看计算的结果到底对不对。输出的结果还是可以的。

    代码如下:

    public class cQuestion {
    
        public static String str = "";//保存题目的字符串
        public static int num = 5;//每题中数的个数
        public static int num_i = 0;//题目中已有数的个数    
        public static int numberRange = 100;//运算中数的最大取值    
        public static int sum = 0;//记录结果
        
        public static void main(String[] args) {
    
            for (int i = 0; i < 50; i++) {
                
                GetQuestion();
                System.out.print(i+1);
                System.out.print(". " + str + "                ");
                System.out.print(sum);
                System.out.print("        ");
                System.out.println(Arithmetic.arithmetic(str));//调用人家写好的一个类Arithmetic
            }
        }
    
        private static void GetQuestion() {
            //得到问题函数,在这里调用递归函数quesGrow()。
            str = "";
            sum = 0;
            num_i = num;//用前都清零
            quesGrow();
        }
    
        private static void quesGrow() {
            //
            if( num_i > 1 ) {
                int j = num_i;//记录这是第几层调用。
                num_i--;
                quesGrow();//递归
                
                int w=1+(int)(Math.random()*numberRange);//随机生成一个数
                int t=1+(int)(Math.random()*100);//向左生成,还是向右生成,类似于树。
                int f=1+(int)(Math.random()*100);//运算符控制
                
                if(t>50)//新数往右加
                {
                    if(f>50) {
                        sum = sum + w;
                        str = str + "+" + String.valueOf( w );
                    }
                    else {
                        sum = sum - w;
                        str = str + "-" + String.valueOf( w );        
                    }
                }
                else//否则 新数往左加
                {
                    if(f>50) {
                        sum = w + sum;
                        str = String.valueOf( w ) + "+" + str;    
                    }
                    else {
                        if( j < 3 ) {//3——摸索出的数,不用给自己套上括号。实际上就是j=2
                            sum = w - sum;
                            str = String.valueOf( w ) + "-" + str;
                        }
                        else {
                            sum = w - sum;
                            str = String.valueOf( w ) + "-" + "(" +str+ ")";
                            //向左添减法的时候加括号,打破顺序计算模式。
                        }
                    }
                }
            }
            else if( num_i == 1 ) {
                //最后一层,也是输出的第一层
                int w=1+(int)(Math.random()*numberRange);
                sum = sum + w;
                str = str + String.valueOf( w );
            }
        }
    }

    输出的结果:

    图1

    注释:先输出的是/序号和题目//接着是跟随题目一起计算出的结果//最后是调用网上已写好的程序计算出的结果/

    》》》加上乘除没有太大区别,就是像减法那样 在左添除法的时候 记着加括号!《《《

    上面那句话很错,乘除属于二级运算,新加入乘除必须在已生成的算式外加括号,不然按照预算规则:先算乘除,后算加减,结果就错了。

    改了一上午,格式跟上面的一样,但始终没对齐 :(

    图2

    就酱:)

    >>追加

    我们知道生成四则运算并给出结果的方法有:“一边出题,一边计算的 和 “题目出完,再计算”的,但还有一种新的想法:“先给答案,再凑题目”

    现在我已经用这种方法实现了“出题 给结果”的功能。首先随机给出答案——一个数,对这个数进行递归操作,即对此数进行随机拆分,例如32,对32进行加法拆分就是:24+8;拆分成减法 就比如是60-28;乘除亦然。记录一个数和符号,把另一个数作为参数继续递归调用;指定递归停止节点。输出题目以及答案。

    结果如下图,依然没对其:(

    图3

    注释:格式依然是 /先输出的是序号和答案凑出来的题目//然后随机生成的结果//最后是调用网上已写好的程序计算出的结果/

    所有的代码都已上传到Coding。

    Coding:https://coding.net/u/Mr_winter/p/ESE02/git

    >>>期末记

    像出题这样的程序 最后给出的从答案推题目的方法是最不错的 至少我是这么觉得 好控制

                                                                                                                                                              J.X.Dinosaur

  • 相关阅读:
    分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解
    java 对小数位的处理 BigDecimal DecimalFormat 常用操作 浅解
    事务 锁 悲观锁 乐观锁 概念 应用场景 使用方式 小记
    多项目使用同一个zookeeper,遇到的坑
    java线程关键字之volatile
    数据库事务
    Web.xml配置详解之context-param
    WINDOWS上KAFKA运行环境安装
    hibernate 之session学习
    windows 安装hadoop
  • 原文地址:https://www.cnblogs.com/duasonir/p/5269335.html
Copyright © 2020-2023  润新知