zoukankan      html  css  js  c++  java
  • 随机生成四则运算表达式02

    自动出题系统

    1.题目避免重复;

    2.可定制(数量/打印方式);

    3.可以控制下列参数:

      °是否有乘除法;
      °是否有括号(最多可以支持十个数参与计算);
      °数值范围;
      °加减有无负数;
      °除法有无余数!
    1.程序设计思想:
      本程序采用java语言编写,采用面向对象的思想来写程序,即把所有的功能都用一个类来封装,每一个功能或者是选项都对应一个函数。对于每个可选功能都有一个可设置其状态值的函数,用来设置该函数是否使用。
    2.程序源代码:
      
    package classWork;
    
    import java.math.*;
    import java.util.Scanner;
    public class MathTest2 
    {
        public static void main(String args[])
        {
            mathOperation P = new mathOperation();
            P.SetValue();
            P.output();
            P.ProduceRandom();
            P.Output();    
        }
    }
    
    class mathOperation
    {
        private int[] firNum = new int[100];//分别代表左右操作数集
        private int[] secNum = new int[100];
        private int[] operNum = new int[100];//记录了100个表达式的100个运算符
        private int index;//记录数组位置索引
        private int amout;//记录用户要求产生题目的数量
        private int mulAndDiv;//记录是否有乘除法的状态值      0代表无1代表有
        private int numLowBound;//记录数值下限
        private int numHighBound;//记录数值上限
        private int neviNum;//记录加减是否有负数           0代表无1代表有
        private int remainder;//记录除法是否有余数       0代表无1代表有
        
        //构造函数对数值进行初始化
        public mathOperation()
        {
            for(int i=0;i < 100;i++)
            {
                firNum[i] = -1;
                secNum[i] = -1;
            }//为了避免查重失败将其初始化为-1
            mulAndDiv = 1;
            numLowBound = 1;
            numHighBound = 99;
            neviNum = 0;
            remainder = 0;
            index = 0;
            amout = 100;
        }
        
        //设置是否有乘除法
        public void set_mulAndDiv(int n)
        {
            mulAndDiv = n%2;
        }
        
        //设置是否有负数
        public void set_neviNum(int n)
        {
            neviNum = n%2;
        }
        
        //设置是否有余数
        public void set_remainder(int n)
        {
            remainder = n%2;
        }
        
        //设置计算下限
        public void set_numLowBound(int n)
        {
            if(n < 0)
            {
                System.out.println("您设置的计算下限为负值!系统自动将其恢复为1");
                numLowBound = 1;
            }
            else
            {    
                numLowBound = n;
            }
        }
        //设置计算上限
        public void set_numHighBound(int n)
        {
            if(n < 0)
            {
                System.out.println("您设置的计算上限为负值!系统自动将其恢复为1");
                numHighBound = 99;
            }
            else
            {    
                numHighBound = n;
            }
        }
            
        //设置用户要求产生题目的数量
        public void set_amout(int n)    
        {
            if(n >= 1 && n <= 100)
                amout = n;
            else
                System.out.println("对不起,您设置的题目量已经超出本程序的运行能力之外!");
        }
            
        public void SetValue()
        {
            int amoutValue;//记录用户要求产生题目的数量
            int mulAndDivValue;//记录是否有乘除法的状态值      0代表无1代表有
            int numLowBoundValue;//记录数值下限
            int numHighBoundValue;//记录数值上限
            int neviNumValue;//记录加减是否有负数           0代表无1代表有
            int remainderValue;//记录除法是否有余数       0代表无1代表有
            System.out.println("hello word!");
            
            
            Scanner sc = new Scanner(System.in);
            System.out.println("请您指定要产生题目的数量:(限制范围在1到100之间)");
            amoutValue = sc.nextInt();
            set_amout(amoutValue);
            
            System.out.println("请您指定题目中数值的下限:(限制范围在1到100之间)");
            numLowBoundValue = sc.nextInt();
            set_numLowBound(numLowBoundValue);
            
            System.out.println("请您指定题目中数值的上限:(限制范围在1到100之间)");
            numHighBoundValue = sc.nextInt();
            set_numHighBound(numHighBoundValue);
            
            System.out.println("请您指定题目中是否有乘除法(0代表没有1代表有)");
            mulAndDivValue = sc.nextInt();
            set_mulAndDiv(mulAndDivValue);
            
            System.out.println("请您指定题目中减法的结果是否有负数(0代表没有1代表有)");
            neviNumValue = sc.nextInt();
            set_neviNum(neviNumValue);
            
            if(mulAndDivValue == 1)
            {
                System.out.println("请您指定题目中的除法结果是否有余数(0代表没有1代表有)");
                remainderValue = sc.nextInt();
                set_remainder(remainderValue);
            }
            
        }
        
        
        //检查产生的运算式是否和前面的运算式有重复
        public boolean RepCheck(int leftNum,int rightNum,int mNum)
        {
            boolean flag = true;//初始默认为不重复
            for(int i = 0;i < index;i++)
            {
                if(firNum[i] == leftNum && secNum[i] == rightNum && operNum[i] == mNum)
                {
                    flag = false;
                    break;
                }
            }
            return flag;
        }
        
        //产生符合用户要求的随机数
        public void ProduceRandom()
        {
            
            boolean f = false;
            while(index <= amout-1)
            {
                int leftNum = (int)(Math.random()*(numHighBound-numLowBound+1))+numLowBound;//生成左操作数
                int rightNum = (int)(Math.random()*(numHighBound-numLowBound+1))+numLowBound;//生成右操作数
                int mNum = (int)(Math.random()*4)+1;//生成1234代表加减乘除
                
                //如果随机生成的运算符是除法但用户不允许有除法就把它转化为加减法
                if(mNum == 3 && mulAndDiv == 0)
                    mNum = 1;
                if(mNum == 4 && mulAndDiv == 0)
                    mNum = 2;
                
                //如果随机生成的运算符是减法但不允许有负数那么就让左操作数大于右操作数
                if(mNum == 2 && neviNum == 0)
                {
                    int midNum;//用mid作为中间数来交换两个数
                    if(leftNum < rightNum)
                    {
                        midNum = leftNum;
                        leftNum = rightNum;
                        rightNum = midNum;
                    }
                }
                
                
                //如果生成的随机运算符是除法而且允许有除法但是不允许有余数
                if(mNum == 4 && mulAndDiv == 1 && remainder == 0)
                {
                    int midNum;//用mid作为中间数来交换两个数
                    if(leftNum < rightNum)
                    {
                        midNum = leftNum;
                        leftNum = rightNum;
                        rightNum = midNum;
                    }
                    leftNum = leftNum/rightNum * rightNum;
                }
                
                //产生随机数的重复性检查
                f = RepCheck(leftNum,rightNum,mNum);
                
                //重复性检查通过就对数组赋值
                if(f == true)
                {
                    firNum[index] = leftNum;
                    secNum[index] = rightNum;
                    operNum[index] = mNum;
                    index++;
                }
            }    
        }
        
        //输出记录数值的数组
        public void Output()
        {
            for(int i = 0;i < amout;i++)
            {
                System.out.print(firNum[i]);
                if(operNum[i] == 1)
                    System.out.print("+");
                if(operNum[i] == 2)
                    System.out.print("-");
                if(operNum[i] == 3)
                    System.out.print("*");
                if(operNum[i] == 4)
                    System.out.print("/");
                System.out.println(secNum[i]);
                
            }
        }
        
        public void output()
        {
            System.out.println("amout "+amout+"mulAndDiv  "+mulAndDiv+"numLowBound  "+numLowBound+
                    "numHighBound  "+numHighBound+"neviNum  "+neviNum+"remainder  "+remainder);
        }
    }

    3.运行结果截图:

    case1:数值范围在15到40之间,有乘除法,减法没负数,除法没余数

    case2:数值范围在10到20之间,有乘除法,减法有负数,除法有余数

    case3:数值下限是20,数值上限是30,无乘除法,减法有余数。

                                                        周活动总结表

                               姓名:王宏伟                         日期 2016/3/19

     

    听课

    编写代码

    阅读课本

     编写代码休息

    日总计

    周日

     

     

    35

     

    35

    周一

    100

    240

    20

     

    360

    周二

     

     

     

     

     

    周三

     

     

     30

     

    30

    周四

     

     

     10

     

    10

    周五

     

     

     50

     

    50

    周六

     

     100

     90

     30

     220

    周总计

    100

    340

    235

     30

    705

                                                          

                                                                                  时间记录日志

                                        学生:王宏伟                   日期:2016/3/19

                                        教师:王建民                    课程:软件工程

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

    C

    U

    3/14

    8:00

    9:50

    10

    100

    听课

    下课,休息

     

     

     

    14:30

    20:40

    130

    240

    编程

     

     

     

    3/15

     

     

     

     

     

     

     

     

    3/16

    15:30

    16:00

    0

    30

    阅读构建之法

     

     

     

    3/17

    15:00

    15:10

    0

    10

    阅读构建之法

     

     

     

    3/18

    17:10

    18:00

    0

    50

    阅读构建之法

     

     

     

    3/20

    15:30

    17:30

    20

    100

    修改程序

     

     

     

     

                                                                                    缺陷记录日志

                                                    学生:王宏伟

                                                    日期:2016/3/19

                                                    教员:王建民

                                                    程序号:四则运算2

    日期

    编号

    类型

    引入阶段

    排除阶段

    修复时间

    修复缺陷

    3/14

    1

     

    编码

    运行

    5min

     

    描述:找不到或无法加载主类。

     

    3/18

     

     

    编码

    编译

    1min

     

     

    描述:数值范围不准确

  • 相关阅读:
    Nginx优化
    Mysql日常操作
    YUM源
    MySQL5.7安装手册
    自律——可以让我们活的更高级
    javascript中with的用法
    js中所有函数的参数(按值和按引用)都是按值传递的,怎么理解?
    base64编码的图片在网页中显示
    form表单提交没有跨域问题,但ajax提交存在跨域问题
    移动端1px的适配问题
  • 原文地址:https://www.cnblogs.com/1102whw/p/5295497.html
Copyright © 2011-2022 走看看