题目:
小学老师要每周给小学生出300道四则运算练习题,为减少老师的工作量,现编写程序为其提供便利:
预期实现以下目标:
1、自动生成加减乘除四则运算习题
2、去除重复习题
3、为方便后续需求变化,提供了许多拓展的可能(例如:分数、括号等)
程序:
package com.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Generate {
static String operator[] = { "+", "-", "×", "÷" };
public static void main(String[] args) {
// TODO Auto-generated method stub
// 前期准备工作
//创建一个对象,用来存放生成的式子是什么类型(是否支持乘法、除法是否支持余数等)
RestrainItem restrainItem = new RestrainItem();
Scanner in = new Scanner(System.in);
System.out.print("请输入题目数:");
int number = in.nextInt();
System.out.print("请输入每行几个题目:");
int nextOne = in.nextInt();
System.out.print("几个运算符(请输入:1~4):");
int items = in.nextInt();
System.out.print("是否支持乘除法?(请输入:1或者0,1表支持)");
int flagMulAndDiv = in.nextInt();
restrainItem.setItems(items);
in.close();
Set tree = new TreeSet<>();
// 生成题目
for (int i = 0; i < number; i++) {
//产生加减法,结果限制在100以内
if(flagMulAndDiv == 0) {
restrainItem.setCommon(true);
restrainItem.setMinus(true);
}else if(flagMulAndDiv == 1) {
restrainItem.setCommon(false);
restrainItem.setMulAndDiv(true);
}
List list = Generate.generateItems(restrainItem);
String result = "";
//不包含括号遍历
for(int k = 0 ;k < list.size()-1; k++) {
result =result+ list.get(k);
}
//添加到set中,如有重复,自动替换
tree.add(result + "="+list.get(list.size()-1)+" ");
list.clear();
}
int k = 1;
for(String str : tree) {
System.out.print(str);
if(k % nextOne == 0) {
System.out.println();
}
k++;
}
}
/**
* (以下属性应该仅存在于RestrainItem对象中,在此列举出来仅为清晰表达其作用)
* @param items 有几个运算符(默认一个)
* @param resultScope 结果的取值范围
* @param minus 结果是否有负数
* @param mulAndDiv 是否包含乘法除法
* @param fraction 是否支持分数
* @return
*/
public static List generateItems(RestrainItem restrainItem) {
Random rand = new Random();
Integer number = null;
List list = new ArrayList<>();// 存放公式
if(restrainItem.isCommon()) {
number = rand.nextInt(100) + 1;// 生成1-100的随机数
list.add(number.toString());
}else if(restrainItem.isMulAndDiv()) {
number = rand.nextInt(10) + 1;// 生成1-100的随机数
list.add(number.toString());
}
Integer result = number;
// 生成第一个数
for (int j = 0; j < restrainItem.getItems();) {
if(restrainItem.isCommon()) {//默认需求:结果100以内,加减法,结果不含负数,不包含乘除分数括号
String option = operator[rand.nextInt(2)];
int operand = 0 ;
//判断结果是否支持负数
if(restrainItem.isMinus() && "-".equals(option)) {
operand = rand.nextInt(100);
}else {
if(number > 50) {
operand = rand.nextInt(101 - number);
}else {
operand = rand.nextInt(50 - number);
}
}
//计算结果
if("+".equals(option)) result = result + operand;
else result = result - operand;
//添加到结果列表
list.add(option + operand);
j++;
}else if(restrainItem.isMulAndDiv()) {//支持乘除法
int operand = 0 ;
String option = operator[rand.nextInt(2)+2];//随机产生乘除运算法则
if("×".equals(option)) {
if(!restrainItem.isFraction()) {//不支持分数
number = rand.nextInt(10)+1;//生成1-10范围内的数
list.add(option+number);
result = result * number;
}
}else {
list.clear();
operand = rand.nextInt(100)+1;//生成100以内的数
int temp = operand % number;
list.add((operand-temp)+"");
list.add(option);
list.add(number.toString());
result = operand / number;
}
j++;
}
}
list.add(result.toString());
return list;
}
}
用户在运行时选择不同的选项可以得到不同的执行结果,部分截图如下所示:
总结:
在实现时即考虑日后需求的可能变动,因此将程序中的约束条件封装成一个object对象,增强了程序的可拓展性,当后期需要更复杂的功能时,在原有的代码上进行新增即可,无需做很大的改动。
package com.test;
import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.Scanner;import java.util.Set;import java.util.TreeSet;
public class Generate {static String operator[] = { "+", "-", "×", "÷" };public static void main(String[] args) {// TODO Auto-generated method stub// 前期准备工作//创建一个对象,用来存放生成的式子是什么类型(是否支持乘法、除法是否支持余数等)RestrainItem restrainItem = new RestrainItem();Scanner in = new Scanner(System.in);System.out.print("请输入题目数:");int number = in.nextInt();System.out.print("请输入每行几个题目:");int nextOne = in.nextInt();System.out.print("几个运算符(请输入:1~4):");int items = in.nextInt();System.out.print("是否支持乘除法?(请输入:1或者0,1表支持)");int flagMulAndDiv = in.nextInt();restrainItem.setItems(items);in.close();Set tree = new TreeSet<>();// 生成题目for (int i = 0; i < number; i++) {//产生加减法,结果限制在100以内if(flagMulAndDiv == 0) {restrainItem.setCommon(true);restrainItem.setMinus(true);}else if(flagMulAndDiv == 1) {restrainItem.setCommon(false);restrainItem.setMulAndDiv(true);}List list = Generate.generateItems(restrainItem);String result = "";//不包含括号遍历for(int k = 0 ;k < list.size()-1; k++) {result =result+ list.get(k);}//添加到set中,如有重复,自动替换tree.add(result + "="+list.get(list.size()-1)+" ");list.clear();}int k = 1;for(String str : tree) {System.out.print(str);if(k % nextOne == 0) {System.out.println();}k++;}}
/** * * @param items 有几个运算符(默认一个) * @param resultScope 结果的取值范围 * @param minus 结果是否有负数 * @param mulAndDiv 是否包含乘法除法 * @param fraction 是否支持分数 * @return */public static List generateItems(RestrainItem restrainItem) {Random rand = new Random();Integer number = null;List list = new ArrayList<>();// 存放公式if(restrainItem.isCommon()) {number = rand.nextInt(100) + 1;// 生成1-100的随机数list.add(number.toString());}else if(restrainItem.isMulAndDiv()) {number = rand.nextInt(10) + 1;// 生成1-100的随机数list.add(number.toString());}Integer result = number;// 生成第一个数for (int j = 0; j < restrainItem.getItems();) {if(restrainItem.isCommon()) {//默认需求:结果100以内,加减法,结果不含负数,不包含乘除分数括号String option = operator[rand.nextInt(2)];int operand = 0 ;//判断结果是否支持负数if(restrainItem.isMinus() && "-".equals(option)) {operand = rand.nextInt(100);}else {if(number > 50) {operand = rand.nextInt(101 - number);}else {operand = rand.nextInt(50 - number);}}//计算结果if("+".equals(option)) result = result + operand;else result = result - operand;//添加到结果列表list.add(option + operand);j++;}else if(restrainItem.isMulAndDiv()) {//支持乘除法int operand = 0 ;String option = operator[rand.nextInt(2)+2];//随机产生乘除运算法则if("×".equals(option)) {if(!restrainItem.isFraction()) {//不支持分数number = rand.nextInt(10)+1;//生成1-10范围内的数list.add(option+number);result = result * number;}}else {list.clear();operand = rand.nextInt(100)+1;//生成100以内的数int temp = operand % number;list.add((operand-temp)+"");list.add(option);list.add(number.toString());result = operand / number;}j++;}}list.add(result.toString());return list;}}