第一次作业
项目地址:地址
需求分析
- [√] 控制生成题目的个数。
- [√] 控制题目中数值(自然数、真分数和真分数分母)的范围。
- [x] 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。
- [x] 每道题目中出现的运算符个数不超过3个。
- [√] 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。
- [√] 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件。
- [√] 程序应能支持一万道题目的生成。
- [x] 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,并会输出所有题目中重复的题目。
功能设计
- 基本功能
生成四则运算题目
判断题目是否重复
计算答案
存入文件
设计实现
One():生成一个运算符的题目
oneMore():生成多个运算符的题目
compare2():判断题目重复
readFile(File file):读取txt文件
calculateAndPrint (String s) :计算答案
代码说明
1.主方法
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.Random; import java.util.Scanner; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class First { private static int One[][]=new int[10001][10001];// private static int temp[]=new int[10001]; private static char symbol[]= new char[] {'+','-','*','/'}; private static int realCount=0;// private static int count=0; private static int number=22; private static int range=9; private static int oneIndex=1; private static int tempIndex=1; private static int member=2;// //member=2 public static void main(String args[]) throws IOException { File file1=new File("Exercises.txt"); PrintWriter pw1=new PrintWriter(file1);// File file2=new File("answer.txt"); PrintWriter pw2=new PrintWriter(file2); System.out.println("输入生成题目的个数:"); Scanner s1 = new Scanner(System.in); number=s1.nextInt(); System.out.println("输入范围:"); range=s1.nextInt(); One(); }
2.生成题目
//产生一个运算符的题目 public static void One() throws IOException { for(int i=0;realCount<number;i++) { if(realCount==0) { One[0][0]=new Random().nextInt(range); twoPlus(member); realCount++; // File file=new File("Exercises.txt"); FileWriter fw = new FileWriter(file, true); PrintWriter pw = new PrintWriter(fw); pw.print(realCount+"."+One[realCount-1][0]+(char)One[realCount-1][1]+One[realCount-1][2]); pw.println(); pw.close(); // System.out.println("题目:"); System.out.print(One[realCount-1][0]); System.out.print((char)One[realCount-1][1]); System.out.print(One[realCount-1][2]); System.out.println(); // } else { temp[0]=new Random().nextInt(range); tempPlus(member); if(!compare2() ) { One[realCount][0]=temp[0]; twoWithTemp(member); realCount++; // File file=new File("Exercises.txt"); FileWriter fw = new FileWriter(file, true); PrintWriter pw = new PrintWriter(fw); pw.print(realCount+"."+One[realCount-1][0]+(char)One[realCount-1][1]+One[realCount-1][2]); pw.println(); pw.close(); // System.out.print(One[realCount-1][0]); System.out.print((char)One[realCount-1][1]); System.out.print(One[realCount-1][2]); System.out.println(); // } } if(i==12) { member++; oneMore(number-realCount); } } File file=new File("Exercises.txt"); readFile(file); } //产生多个运算符的题目 public static void oneMore(int remainNumber) throws IOException { int index=1; if(realCount==number) return ; else { count=0; for(int i=0;count<remainNumber;i++) { if(i==0) { One[realCount][0]=new Random().nextInt(range); twoPlus(member); count++; realCount++; File file=new File("Exercises.txt"); FileWriter fw = new FileWriter(file, true); PrintWriter pw = new PrintWriter(fw); pw.print(realCount+"."+One[realCount-1][0]); for(int i3=0;i3<member-1;i3++) { pw.print((char)One[realCount-1][index]); pw.print(One[realCount-1][index+1]); index+=2; } pw.println(); pw.close(); index=1; // System.out.print(One[realCount-1][0]); for(int i3=0;i3<member-1;i3++) { System.out.print((char)One[realCount-1][index]); System.out.print(One[realCount-1][index+1]); index+=2; } index=1;// System.out.println(); // } else { temp[0]=new Random().nextInt(range); tempPlus(member); if(!compare2() ) { One[realCount][0]=temp[0]; twoWithTemp(member); count++; realCount++; File file=new File("Exercises.txt"); FileWriter fw = new FileWriter(file, true); PrintWriter pw = new PrintWriter(fw); pw.print(realCount+"."+One[realCount-1][0]); for(int i3=0;i3<member-1;i3++) { pw.print((char)One[realCount-1][index]); pw.print(One[realCount-1][index+1]); index+=2; } pw.println(); pw.close(); index=1; // System.out.print(One[realCount-1][0]); for(int i3=0;i3<member-1;i3++) { System.out.print((char)One[realCount-1][index]); System.out.print(One[realCount-1][index+1]); index+=2; } index=1;// System.out.println(); // } } if(i==12) { member++; oneMore(number-realCount); break; } } } }
3.判断题目重复
public static boolean compare2() { int arr2[][]=new int[10001][10000]; int temp2[]=new int[10000]; for(int i=0;i<realCount;i++) {//拷贝二维数组 arr2[i]=One[i].clone(); } temp2=temp.clone(); //拷贝临时数组 for(int i=0;i<realCount;i++) { //二维数组排序 Arrays.sort(arr2[i]); } Arrays.sort(temp2); //临时数组排序 for(int i=0;i<realCount;i++) { if(Arrays.equals(temp2,arr2[i])) { return true; } else continue; } return false; }
4.
//数组赋值 public static int twoPlus(int member) { if(member==1) { oneIndex=1; return 0; } else { One[realCount][oneIndex]=symbol[new Random().nextInt(4)]; One[realCount][oneIndex+1]=new Random().nextInt(range); oneIndex+=2; return twoPlus(member-1); } } //数组赋值 public static int tempPlus(int member) { if(member==1) { tempIndex=1; return 0; } else { temp[tempIndex]=symbol[new Random().nextInt(4)]; temp[tempIndex+1]=new Random().nextInt(range); tempIndex+=2; return tempPlus(member-1); } } //数组合并 public static int twoWithTemp(int member) { if(member==1) { oneIndex=1; return 0; } else { One[realCount][oneIndex]=temp[oneIndex]; One[realCount][oneIndex+1]=temp[oneIndex+1]; oneIndex+=2; return twoWithTemp(member-1); } }
5.计算答案
//读取txt public static String readFile(File file){ StringBuilder result = new StringBuilder(); try{ BufferedReader br = new BufferedReader(new FileReader(file)); String s = null; int i=1; System.out.println("答案:"); while((s = br.readLine())!=null) {;// i++; if(i<=10) { String s1=s.substring(2); calculateAndPrint(s1); }else if(i<100) { String s2=s.substring(3); calculateAndPrint(s2); } else if(i<1000) { String s3=s.substring(4); calculateAndPrint(s3); } else if(i<10001) { String s4=s.substring(5); calculateAndPrint(s4); } } br.close(); }catch(Exception e){ e.printStackTrace(); } return result.toString(); } //计算答案 public static void calculateAndPrint (String s) throws IOException { ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript"); String str = s; try { Integer i =10; double tmp=Double.valueOf(i.toString()); double d = Double.valueOf(se.eval(str).toString()); System.out.println(d); File file=new File("answer.txt"); FileWriter fw = new FileWriter(file, true); PrintWriter pw = new PrintWriter(fw); pw.println(d); pw.close(); } catch (ScriptException e) { e.printStackTrace(); } }
测试运行
控制台
文件
PSP表格
小结
还有一些功能没完成。