本次使用java語言,實現了四則運算習題的生成。
一、主要功能:
(1)算式個數
(2)是否有乘除法
(3)結果集數值范圍
(4)加減法有無負數
(5)除法有無余數
(6)除法出現小數是否支持分數顯示
(7)選擇生成算式導入的文件
(8)輸出打印每行個數
二、代碼實現:
(1)IFormulaGeneration
package cn.zhl.software;
import java.util.Map;
public interface IFormulaGeneration {
//加法生成接口,結果范圍,加法有無負數,生成個數
public Map<String,Integer> Add(int resultRange,boolean is,int num);
//減法生成接口,結果范圍,減法有無負數,生成個數
public Map<String,Integer> Sub(int resultRange,boolean is,int num);
//乘法生成接口,生成個數
public Map<String,Integer> Mul(int resultRange,int num);
//除法生成接口,結果范圍,除法有無余數,是否支持分數,生成個數
public Map<String,String> Div(int resultRange,boolean is,boolean is2,int num);
//檢測算式是否存在重復,如果存在返回true
public boolean Repeat(Map<?,?> map,String formula);
//生成特定范圍的數值
public int nextInt(int min, int max);
//化簡小數
public String fracReduction(int numerator, int denominator);
//算法生成器:算式個數,是否有乘除法,數值范圍,加減法有無負數,除法又無余數,是否支持分數,打印每行個數
public Map<String,?> FormulaCustom(int formulaNum,boolean if_MulDiv,int range,
boolean ifNeg_AddSub,boolean ifRem_Div,
boolean ifRed_Div,int lineNum);
}
(2)FormulaRealization
package cn.zhl.software;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
public class FormulaRealization implements IFormulaGeneration {
Random random = new Random();
@Override
public Map<String, Integer> Add(int resultRange, boolean is, int num) {
if (resultRange < 0) {
resultRange = -resultRange;
}
Map<String, Integer> addMap = new HashMap<>();
int r1 = 0, r2 = 0, n = 0;
String formula = "";
for (; n < num; ) {
r1 = nextInt(-resultRange, resultRange);
if (is) {//加法允許出現負數
r2 = nextInt(-resultRange - r1, resultRange - r1);
} else {
r2 = nextInt(-r1, resultRange - r1);
}
formula = (r1 < 0 ? "(" + r1 + ")" : r1) + "+" + (r2 < 0 ? "(" + r2 + ")" : r2);
if (Repeat(addMap, formula)) {
addMap.put(formula, r1 + r2);
n++;
}
}
return addMap;
}
@Override
public Map<String, Integer> Sub(int resultRange, boolean is, int num) {
if (resultRange < 0) {
resultRange = -resultRange;
}
Map<String, Integer> subMap = new HashMap<>();
int r1 = 0, r2 = 0, n = 0;
String formula = "";
for (; n < num; ) {
r1 = nextInt(-resultRange, resultRange);
if (is) {//加法允許出現負數
r2 = nextInt(-resultRange + r1, resultRange + r1);
} else {
r2 = nextInt(r1, resultRange + r1);
}
formula = (r1 < 0 ? "(" + r1 + ")" : r1) + "-" + (r2 < 0 ? "(" + r2 + ")" : r2);
if (Repeat(subMap, formula)) {
subMap.put(formula, r1 - r2);
n++;
}
}
return subMap;
}
@Override
public Map<String, Integer> Mul(int resultRange, int num) {
if (resultRange == 0) {
resultRange = 1;
}
if (resultRange < 0) {
resultRange = -resultRange;
}
Map<String, Integer> mulMap = new HashMap<>();
int r1 = 0, r2 = 0, n = 0;
String formula = "";
for (; n < num; ) {
while (r1 == 0) {
r1 = nextInt(-resultRange, resultRange);
}
r2 = nextInt(-(int) (resultRange / Math.abs(r1)), (int) (resultRange / Math.abs(r1)));
formula = (r1 < 0 ? "(" + r1 + ")" : r1) + "*" + (r2 < 0 ? "(" + r2 + ")" : r2);
if (Repeat(mulMap, formula)) {
mulMap.put(formula, r1 * r2);
n++;
r1 = nextInt(-resultRange, resultRange);
}
}
return mulMap;
}
@Override
public Map<String, String> Div(int resultRange, boolean is, boolean is2, int num) {
if (resultRange == 0) {
resultRange = 1;
}
if (resultRange < 0) {
resultRange = -resultRange;
}
Map<String, String> divMap = new HashMap<>();
int r1 = 0, r2 = 0, n = 0;
String formula = "";
for (; n < num; ) {
//r1 = nextInt(-resultRange, resultRange);
while (r2 == 0) {
r2 = nextInt(-resultRange, resultRange);
}
if (!is) {//除法沒有余數
r1 = r2 * nextInt(-(resultRange), resultRange);
} else {//有余數
r1 = nextInt(-resultRange, resultRange);
}
formula = (r1 < 0 ? "(" + r1 + ")" : r1) + "/" + (r2 < 0 ? "(" + r2 + ")" : r2);
if (Repeat(divMap, formula)) {
String result = "";
if (is && is2) {//有余數且化為分數
if(r1*r2<0){
result = "-"+fracReduction(Math.abs(r1), Math.abs(r2));
}else {
result = fracReduction(Math.abs(r1), Math.abs(r2));
}
if(r1%r2==0){
result = ((double) r1 / r2) + "";
}
} else {
if (!is) {//無余數
result = ((double) r1 / r2) + "";
}
if (is) {
result = ((double) r1 / r2) + "";
}
}
if(r1==0){
result=0.0+"";
}
if (r1==-r2){
result="-1.0";
}
divMap.put(formula, result);
n++;
}
}
return divMap;
}
@Override
public boolean Repeat(Map<?, ?> map, String formula) {
if (map.isEmpty()) {
return true;
} else {
Set<String> strings = (Set<String>) map.keySet();
for (String string : strings) {
//如果當前算式與前面算式重復返回false
if (string.equals(formula)) {
return false;
}
}
//如果當前算式與前面算式不存在重復返回true
return true;
}
}
@Override
public int nextInt(int min, int max) {
if (min == max) {
return max;
}
return random.nextInt(max - min + 1) + min;
}
@Override
public String fracReduction(int numerator, int denominator) {
//找到最大公約數,然后分別處以最大公約數
int m = numerator;
int n = denominator;
int r;
while (numerator > 0) {
r = denominator % numerator;
denominator = numerator;
numerator = r;
}
// if ((m / denominator)==-(n / denominator)){
// return "-1.0";
// }
return m / denominator + "/" + n / denominator;
}
@Override
//算法生成器:算式個數,是否有乘除法,數值范圍,加減法有無負數,除法又無余數,是否支持分數,打印每行個數
public Map<String, ?> FormulaCustom(int formulaNum, boolean if_MulDiv, int range, boolean ifNeg_AddSub, boolean ifRem_Div, boolean ifRed_Div, int lineNum) {
int add = 0, sub = 0, mul = 0, div = 0;
add = nextInt(formulaNum/5,formulaNum/3);
sub = nextInt((formulaNum - add)/4,(formulaNum - add)/2);
mul = nextInt((formulaNum - add - sub)/3,(formulaNum - add - sub)/1);
div = formulaNum - add - sub - mul;
Map map = new HashMap();
if (if_MulDiv) {//如果存在乘除法將算式總數分為四份
Map<String, Integer> addMap = Add(range, ifNeg_AddSub, add);
Map<String, Integer> subMap = Sub(range, ifNeg_AddSub, sub);
Map<String, Integer> mulMap = Mul(range, mul);
Map<String, String> divMap = Div(range, ifRem_Div, ifRed_Div, div);
map.putAll(addMap);
map.putAll(subMap);
map.putAll(mulMap);
map.putAll(divMap);
} else {//不存在則分為兩份
Map<String, Integer> addMap = Add(range, ifNeg_AddSub, add);
Map<String, Integer> subMap = Sub(range, ifNeg_AddSub, sub);
map.putAll(addMap);
map.putAll(subMap);
}
return map;
}
}
(3)FormulaRealizationTest
package cn.zhl.test;
import cn.zhl.software.FormulaRealization;
import org.junit.Test;
import java.util.Map;
import java.util.Set;
public class FormulaRealizationTest {
FormulaRealization formulaRealization = new FormulaRealization();
@Test
public void testAdd() {
Map<String, Integer> add = formulaRealization.Add(100, false, 5);
for (String s : add.keySet()) {
System.out.print(s+"="+add.get(s)+" ");
}
}
@Test
public void testSub() {
Map<String, Integer> sub = formulaRealization.Sub(100, true, 5);
for (String s : sub.keySet()) {
System.out.print(s+"="+sub.get(s)+" ");
}
}
@Test
public void testMul() {
Map<String, Integer> mul = formulaRealization.Mul(100, 5);
for (String s : mul.keySet()) {
System.out.print(s+"="+mul.get(s)+" ");
}
}
@Test
public void testDiv() {
Map<String, String> div = formulaRealization.Div(100, true, true, 5);
for (String s : div.keySet()) {
System.out.print(s+"="+div.get(s)+" ");
}
}
@Test
public void test1() {
String div = formulaRealization.fracReduction(25,5);
System.out.print(div);
}
}
(4)IFileGeneration
package cn.zhl.fileCreate;
import java.util.Map;
public interface IFileGeneration {
//用於將產生的算式寫入到文件中
public void fileShow(Map<String,?> stringMap,int lineNum,String fileName);
}
(5)FileRealization
package cn.zhl.fileCreate;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
public class FileRealization implements IFileGeneration {
@Override
public void fileShow(Map<String,?> stringMap, int lineNum, String fileName) {
int n=0;
String answerName=fileName+"_Answer.txt";
fileName=fileName+".txt";
/*File file1 = new File("\\cn\\zhl\\formulaFile\\" + fileName);
File file2 = new File("\\cn\\zhl\\formulaFile\\" + answerName);*/
File file1 = new File("Arithmetic_question_generation_system\\src\\cn\\zhl\\formulaFile\\"+fileName);
File file2 = new File("Arithmetic_question_generation_system\\src\\cn\\zhl\\formulaFile\\"+answerName);
for (String s : stringMap.keySet()) {
n++;
try(FileWriter formulaWriter = new FileWriter(file1,true); FileWriter answerWriter = new FileWriter(file2,true)) {
formulaWriter.write(s+"= ");
answerWriter.write(s+"="+stringMap.get(s)+" ");
if(n%lineNum==0){
formulaWriter.write("\n");
answerWriter.write("\n");
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("未成功將算式保存到"+fileName+"中,答案保存到"+answerName+"中,請聯系開發人員!");
}
}
System.out.println("已成功將算式保存到"+fileName+"中,答案保存到"+answerName+"中,歡迎您的下次使用!");
}
}
(6)FormulaCustomTest
package cn.zhl.software;
import cn.zhl.fileCreate.FileRealization;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.Scanner;
public class FormulaCustomTest {
public static void main(String[] args) {
int formulaNum;
boolean if_MulDiv;int range;
boolean ifNeg_AddSub;boolean ifRem_Div;
boolean ifRed_Div;int lineNum;
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入需要算式個數:");
formulaNum=scanner.nextInt();
System.out.println("請輸入需要乘除法(Y/N):");
if(scanner.next().equals("y")||scanner.next().equals("Y")){
if_MulDiv=true;
}else {
if_MulDiv=false;
}
System.out.println("請輸入需要結果集范圍(默認-n~n):");
range=scanner.nextInt();
System.out.println("請輸入允許加減法出現負數(Y/N):");
if(scanner.next().equals("y")||scanner.next().equals("Y")){
ifNeg_AddSub=true;
}else {
ifNeg_AddSub=false;
}
System.out.println("請輸入允許除法出現小數(Y/N):");
if(scanner.next().equals("y")||scanner.next().equals("Y")){
ifRem_Div=true;
}else {
ifRem_Div=false;
}
System.out.println("請輸入允許除法結果換算成分數(Y/N):");
if(scanner.next().equals("y")||scanner.next().equals("Y")){
ifRed_Div=true;
}else {
ifRed_Div=false;
}
System.out.println("請輸入算式每行個數:");
lineNum=scanner.nextInt();
//文件名
String fileName="";
System.out.println("請輸入算式需要導入的文件名:");
fileName=scanner.next();
System.out.println("定制完成,正在隨機生成算式。。。。");
long l = System.currentTimeMillis();
//算法生成器:算式個數,是否有乘除法,數值范圍,加減法有無負數,除法又無余數,是否支持分數,打印每行個數
FormulaRealization formulaRealization = new FormulaRealization();
Map<String, ?> stringMap = formulaRealization.FormulaCustom(formulaNum,if_MulDiv,range,
ifNeg_AddSub,ifRem_Div,
ifRed_Div,lineNum);
long l2 = System.currentTimeMillis();
System.out.println("算式生成成功,耗時"+(l2-l)+"毫秒!");
FileRealization fileRealization = new FileRealization();
fileRealization.fileShow(stringMap,lineNum,fileName);
}
}
三、運行結果:
test1.txt
test1_Answer.txt