java 可扩展_四则运算(可拓展)-java

题目:

小学老师要每周给小学生出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;

}

}

用户在运行时选择不同的选项可以得到不同的执行结果,部分截图如下所示:

fd0d3d98872a94370af907a2cc29467d.png

e22acffe0c4f0ad887a165e3c110860d.png

总结:

在实现时即考虑日后需求的可能变动,因此将程序中的约束条件封装成一个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;}}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值