随机生成四则运算表达式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

 

 

描述:数值范围不准确

原文地址:https://www.cnblogs.com/1102whw/p/5295497.html