package day02; import java.util.*; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class Test1 { static String[] timu = new String[100]; // 存放題目 static String[] cuoti = new String[100]; // 存放錯題 static int k = 0; // 计录错题个数 /********************************* 计算方法 *********************************/ public static String jisuan(String x) { ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); String result = ""; try { result = String.valueOf(jse.eval(x)); } catch (Exception t) { } return result; } /******************************** 生成题目 *********************************/ public static void shengcheng(int length, int n, int min, int max, int chengchu) { // 题目数量、操作数个数、最小值、最大值、有无乘除 int[] Number = new int[n]; // 随机数存放数组 String[] Fh = new String[n]; // 随机运算符存放数组 Random rand = new Random(); String[] fuhao = new String[] { "+", "-", "*", "/" }; for (int i = 0; i < length; i++) { // 此循环用于控制题目数量 System.out.print("(" + (i + 1) + ")" + " "); timu[i] = ""; for (int j = 0; j < n; j++) { // 此循环用于生成一道题目 Number[j] = rand.nextInt(max + 1 - min) + min; // 判断是否有乘除 if (chengchu == 1) {// 有乘除时四种符号都有可能随机生成 Fh[j] = String.valueOf(fuhao[rand.nextInt(4)]); } if (chengchu == 0) {// 无乘除时只随机生成加号或减号 Fh[j] = String.valueOf(fuhao[rand.nextInt(2)]); } Fh[n - 1] = " "; timu[i] = timu[i] + Number[j] + Fh[j]; } System.out.print(timu[i]); // 输入答案 System.out.println(); System.out.print("请输入答案:"); Scanner scan = new Scanner(System.in); String result = scan.nextLine(); // 输入的答案 String jieguo = jisuan(timu[i]); // 正确的结果 if (jieguo.equals(result)) { System.out.println("正确!"); } else { System.out.println("错误!"); System.out.println("正确结果为:" + jieguo); cuoti[k] = timu[i]; k++; } } } /************************************ 菜单 *******************************/ public static void menu() { System.out.println("*********************主菜单*******************"); System.out.println("1.设置参数"); System.out.println("2.小学二年级题目"); System.out.println("3.小学三年级题目"); System.out.println("4.小学四年级题目"); System.out.println("5.错题集"); System.out.println("请输入你的选择:"); System.out.println("**********************************************"); } /**************************** 主函数 ******************************************/ public static void main(String args[]) { int min_ = 0; int max_ = 100; int length_ = 0; int flag = 1; while (flag == 1) { menu(); Scanner scan = new Scanner(System.in); int xuanze = scan.nextInt(); // 用户输入选择 switch (xuanze) { case 1:// 设置参数 System.out.println("题目的个数为?"); length_ = scan.nextInt(); System.out.println("数字的最小值为?"); min_ = scan.nextInt(); System.out.println("数字的最大值为?"); max_ = scan.nextInt(); break; case 2:// 小学二年级题目 shengcheng(length_, 2, min_, 10, 1); break; case 3:// 小学三年级题目 shengcheng(length_, 4, min_, 1000, 1); break; case 4:// 小学四年级题目 shengcheng(length_, 5, min_, 1000, 1); break; case 5:// 错题集 for (int i = 0; i < k; i++) { System.out.println(cuoti[i]); } break; default:// 输入选择有误,重新输入 System.out.println("您输入的指令错误,请重新输入"); break; } System.out.println("若退出程序请输入0,否则输入1"); flag = scan.nextInt(); } } }
主菜单的打印:
1、设置参数:
2、二年级算术题:
3、三年级算术题:
4、四年级算术题:
5、错题库:
此代码大体完成了在线答题功能、错题库功能、以及生成不同试卷功能。
存在的问题:
1、没有查重功能,当题目数量过于庞大时,无法保证题目始终不重复。此问题会在接下来的学习中进行改善。
2、在随机生成四则运算符号时,并没有考虑当生成除号时,分母不能为0的情况,存在隐患,不够完善。
3、无法保证除法是整除,当存在除法运算时,小数点后位数太多,根本不能输入正确的结果,不实用。
4、分工不够清晰,不能做到一个方法完成一个任务,想法不透彻。
5、代码不够健壮,没有考虑输入错误数据时的情况。
6、还是没有实现插入括号以及括号运算的功能。
收获:
1、java执行字符串中的运算公式
JDK自带的类可以实现调用JS的功能,可以实现执行字符串中的运算公式的功能。
public class runString { static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); /** * @param args */ public static void main(String[] args) { String strs = "1+1*2+(10-(2*(5-3)*(2-1))-4)+10/(5-0)"; try { System.out.println(jse.eval(strs)); } catch (Exception t) { } } }
需要引用的类:
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager;
经过改动,在此代码中的应用:
public static String jisuan(String x) { ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); String result = ""; try { result = String.valueOf(jse.eval(x)); } catch (Exception t) { } return result; }
2、将生成的题目转化为字符串
for(int i=0;i<length;i++){ for(int j=0;j<n;j++){ timu[i] = ""; ... Fh[n - 1] = " "; ... timu[i] = timu[i] + Number[j] + Fh[j]; ... } System.out.print(timu[i]); ... }