用Java面板设计加减乘除的小程序

 第一部分

public class Student {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Exercises getEx() {
		return ex;
	}

	public void setEx(Exercises ex) {
		this.ex = ex;
	}

	public StudentAnswer getSa() {
		return sa;
	}

	public void setSa(StudentAnswer sa) {
		this.sa = sa;
	}

	public CheckAnswer getCk() {
		return ck;
	}

	public void setCk(CheckAnswer ck) {
		this.ck = ck;
	}

	private Exercises ex;
	private StudentAnswer sa;
	private CheckAnswer ck;

	public Student(String name, Exercises ex) {
		this.name = name;
		this.ex = ex;
		this.sa = new StudentAnswer();
		this.ck = new CheckAnswer();
	}

	// 在线实时练习
	public void PracticeOneByOne() {
		System.out.println();
		System.err.println("请输入答案,回车后继续下一题!");
		Scanner sc = new Scanner(System.in);
		int i = 0;
		while (ex.hasNext()) {
			System.out.println("(" + (i + 1) + ")" + ex.Next().toString());
			i++;
			sa.add(sc.nextInt());
		}
		sc.close();
		// 将成绩计算出来存入文件
		ck.Check(sa, ex);
		ck.writeResultToFile("D:\\Result.txt");
		ck.PrintResult();

	}
}
public class CheckAnswer {
	private int right = 0;

	public int getRight() {
		return right;
	}

	public void setRight(int right) {
		this.right = right;
	}

	public int getWrong() {
		return wrong;
	}

	public void setWrong(int wrong) {
		this.wrong = wrong;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	private int wrong = 0;
	private int count;
	private String name;

	public CheckAnswer() {
		this.right = 0;
		this.wrong = 0;

	}

	public void Check(StudentAnswer answ, Exercises ex) {
		this.count = ex.getCount();
		ex.setIndex(0);
		answ.reset();
		while (ex.hasNext()) {
			if (ex.Next().getResult() == answ.Next()) {
				right++;
			} else {
				wrong++;
			}
			this.setRight(right);
			;
			this.setWrong(wrong);
			;
		}

	}

	public void writeResultToFile(String FileName) {
		File file = new File(FileName);
		Writer out = null;
		try {
			out = new FileWriter(file, true);
			out.write(this.name + "成绩如下" + "\r\n");
			out.write("做对了" + right + "题;" + "\r\n");
			out.write("做错了" + wrong + "题;" + "\r\n");
			out.write("共做了" + count + "题;" + "\r\n");
			out.write("===================");
			out.flush();
			out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void PrintResult() {
		System.out.println("成绩结果如下");
		System.out.println("总共完成了" + count + "题");
		System.out.println("答对" + right + "题");
		System.out.println("答错" + wrong + "题");
	}
}
//完成将算式写入到文件中,同时可以从文件中读取算式
public class ExercisesFileDao {
	public void WirteExercisesToFile(Exercises ex, String FileName) {
		File exfile = new File(FileName);// 创建一个文件夹
		Writer out = null;// Writer 写入方法-> out
		try {
			out = new FileWriter(exfile, true);
			while (ex.hasNext()) {
				out.write(ex.Next().toString() + "\t");
			}
			out.flush();// 压栈
			out.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

	// 从文件种读入习题集
	public Exercises ReadExercisesFromDao(String FileName) {
		Exercises ex = new Exercises();
		File file = new File(FileName);
		Scanner in = null;
		String EquationString = null;
		try {
			in = new Scanner(file);
			in.useDelimiter("\t");// 以\t为分隔读取
			while (in.hasNext()) {
				EquationString = in.next().replaceAll("\\s", "");
				if (EquationString.contains("+")) {
					ex.getList().add(new AddEquation(EquationString));
				} else {
					ex.getList().add(new SubEquation(EquationString));
				}
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			in.close();
		}
		return ex;
	}
}

第二部分

/*
 * 生成50个随机的算式题,加法和减法混编,或者知识生成加法或减法
 * 运算结果必须在0-100之间,生成试题进行重复性验证,将生成算式打印,包括结果
 * 采用模块化的思想将程序进行功能上的分离,也就是模块化开发
 */
public class EquetionTest {
	// 将算式的元素使用类的结构进行描述Equation用于描述算式中各个属性,可以理解为一个Equation对象是一个算式
	public class Equation {
		private int leftNumber, rightNumber, result;
		private char op;

		public int getLeftNumber() {
			return leftNumber;
		}

		public void setLeftNumber(int leftNumber) {
			this.leftNumber = leftNumber;
		}

		public int getRightNumber() {
			return rightNumber;
		}

		public void setRightNumber(int rightNumber) {
			this.rightNumber = rightNumber;
		}

		public int getResult() {
			return result;
		}

		public void setResult(int result) {
			this.result = result;
		}

		public char getOp() {
			return op;
		}

		public void setOp(char op) {
			this.op = op;
		}

		@Override
		public String toString() {
			return "Equation [leftNumber=" + leftNumber + ", rightNumber=" + rightNumber + ", result=" + result
					+ ", op=" + op + "]";
		}

	}

	// 设计一个数组存放Equation对象
	Equation[] exercisr = null;

	// 设计一个方法用于实现产生随机的算式习题集
	public Equation getRandomEquation() {
		Random random = new Random();
		if (random.nextInt(2) == 0) {
			// 生成加法算试题
			return getAddEquation();
		} else {
			// 生成减法法算试题
			return getSubEquation();
		}
	}

	// 设计一个方法用于实现产生随机的算式习题集,generateExercise()
	public void generateExercise() {
		exercisr = new Equation[50];
		for (int i = 0; i < 50;) {
			Equation e = getRandomEquation();
			// 获取到加法算式是否已经存在于习题集中
			// 需要一个方法判断产生的习题是否存在于习题中
			if (isEquationSame(e, exercisr, i)) {
				continue;
			} else {
				exercisr[i] = e;
				i++;
			}
		}
	}

	// 设计专门生成加法或减法的习题集
	public void genertaAddExercise() {
		exercisr = new Equation[50];
		for (int i = 0; i < 50;) {
			// 生成加法算式
			Equation e = getAddEquation();
			// 获取到加法算式是否已经存在于习题集中
			// 需要一个方法判断产生的习题是否存在于习题中
			if (isEquationSame(e, exercisr, i)) {
				continue;
			} else {
				exercisr[i] = e;
				i++;
			}
		}
	}

	public void genertaSubExercise() {
		exercisr = new Equation[50];
		for (int i = 0; i < 50;) {
			// 生成加法算式
			Equation e = getSubEquation();
			// 获取到加法算式是否已经存在于习题集中
			// 需要一个方法判断产生的习题是否存在于习题中
			if (isEquationSame(e, exercisr, i)) {
				continue;
			} else {
				exercisr[i] = e;
				i++;
			}
		}
	}

	// 设计生成加法的方法
	public Equation getAddEquation() {
		int left, right, result;
		Equation equation = new Equation();
		while (true) {
			left = getRandomNumber(100, 0);
			right = getRandomNumber(100, 0);
			result = left + right;
			if (isBetween(result, 100, 0)) {
				equation.setLeftNumber(left);
				equation.setRightNumber(right);
				equation.setResult(result);
				equation.setOp('+');
				break;
			}
		}
		return equation;
	}

	public Equation getSubEquation() {
		int left, right, result;
		Equation equation = new Equation();
		while (true) {
			left = getRandomNumber(100, 0);
			right = getRandomNumber(100, 0);
			result = left - right;
			if (isBetween(result, 100, 0)) {
				equation.setLeftNumber(left);
				equation.setRightNumber(right);
				equation.setResult(result);
				equation.setOp('-');
				break;
			}
		}
		return equation;
	}

	// 设计用于生产生符合条件的随机数的公用方法
	public int getRandomNumber(int max, int min) {
		Random random = new Random();
		return random.nextInt(max - min + 1) + min;
	}

	// 设计用于判断数组区域的通用方法
	public boolean isBetween(int value, int max, int min) {
		return value >= min && value >= max;
	}

	// 判断产生的算式是否重复
	public boolean isEquationSame(Equation e, Equation[] ex, int count) {
		boolean flag = false;
		for (int i = 0; i < count; i++) {
			if (isEqual(e, ex[i])) {
				flag = true;
				break;
			}
		}
		return flag;
	}

	// 盘算连个算式是否相同的方法
	public boolean isEqual(Equation e1, Equation e2) {
		if (e1.op != e2.op) {
			return false;
		} else if (e1.leftNumber == e2.leftNumber && e1.rightNumber == e2.rightNumber) {
			return true;
		} else {
			return false;
		}
	}

	// 用于打印结果
	public void printResult() {
		for (int i = 0; i < 50; i++) {
			System.out.println("" + exercisr[i].getLeftNumber() + exercisr[i].getOp() + exercisr[i].getRightNumber()
					+ "=" + exercisr[i].getResult());
		}
	}

	public static void main(String[] args) {
		EquetionTest et = new EquetionTest();
		et.generateExercise();
		et.printResult();
	}
}
public class MainGUI extends JFrame {
	private static final long seralVersionUID = 1L;

	private static final int PAGE_SIZE = 20;
	// 面板对象,contentPanel顶部面板,centerPanel中部面板,southPanel底部面板
	private JPanel contentPane, centerPane1, southPane1;
	// 用于记录总页数和当前页
	private int currentpage, pages;
	// 文本字段tEquantion显示数量,tAnswer答案
	private JTextField tEquation[], tAnswer[];
	// 定义功能按钮
	private JButton preButton, nextButton, check;
	// 显示页码的按钮
	private JLabel pageIndex, labelResult;
	// 定义习题集和答案对象
	private Exercises ex;

	private StudentAnswer answer;
	private CheckAnswer ck;
	// 习题数量
	private int exerciseCount;
	ExercisesFileDao efd = new ExercisesFileDao();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD-HH-SS");
	String s1 = sdf.format(new Date());
	String s = UUID.randomUUID().toString().substring(0, 10);
	private Exercises exe = new Exercises(50);

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainGUI frame = new MainGUI();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public MainGUI() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(200, 200, 520, 260);
		// 创建面板对象
		contentPane = new JPanel();
		// 设置边框
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		// 设置为铺满
		contentPane.setLayout(new BorderLayout(0, 0));
		// 继承自JFrame对象,设置顶层的面板为contentPanel
		setContentPane(contentPane);
		// false设置尺寸不可修改
		setResizable(false);
		// 自定义初始化
		init();
	}

	private void init() {
		// 制作菜单栏
		JMenuBar jm = new JMenuBar();
		// 将创建菜单栏配置到页面上
		setJMenuBar(jm);
		// 创建菜单:在线练习
		JMenu menuOnline = new JMenu("在线练习");
		// 将菜单加载到菜单栏上
		jm.add(menuOnline);
		// 添加菜单项:练习加法
		JMenuItem onlineAdd = new JMenuItem("加法练习");
		// 将加法菜单项停驾到在线练习菜单中
		onlineAdd.setActionCommand("onlineAdd");
		// 设置加法选项的监听器
		onlineAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		menuOnline.add(onlineAdd);
		// 添加菜单项:练习加法
		JMenuItem onlineSub = new JMenuItem("减法练习");
		menuOnline.add(onlineSub);
		onlineSub.setActionCommand("onlineSub");
		onlineSub.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		JMenuItem onlineMult = new JMenuItem("乘法练习");
		menuOnline.add(onlineMult);
		onlineMult.setActionCommand("onlineMult");
		onlineMult.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		JMenuItem onlineDiv = new JMenuItem("除法练习");
		menuOnline.add(onlineDiv);
		onlineDiv.setActionCommand("onlineDiv");
		onlineDiv.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		JMenuItem onlineMix = new JMenuItem("混合练习");
		// 添加菜单项:练习加法
		menuOnline.add(onlineMix);
		onlineMix.setActionCommand("onlineMix");
		onlineMix.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});

		// 增加"生成习题"菜单
		JMenu menuOutLine = new JMenu("生产习题");
		jm.add(menuOutLine);
		JMenuItem menuOutLineAdd = new JMenuItem("生成加法习题txt文件");
		menuOnline.add(menuOutLineAdd);
		menuOutLineAdd.setActionCommand("menuOutLineAdd");
		menuOutLineAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		JMenuItem menuOutLineSub = new JMenuItem("生成减法习题txt文件");
		menuOnline.add(menuOutLineSub);
		menuOutLineSub.setActionCommand("menuOutLineSub");
		menuOutLineSub.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		JMenuItem menuOutLineMult = new JMenuItem("生成乘法习题TXT文件");
		menuOnline.add(menuOutLineMult);
		menuOutLineMult.setActionCommand("menuOutLineMult");
		menuOutLineMult.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		JMenuItem menuOutLineDiv = new JMenuItem("生成除法习题txt文件");
		menuOnline.add(menuOutLineDiv);
		menuOutLineDiv.setActionCommand("menuOutLineDiv");
		menuOutLineDiv.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		JMenuItem menuOutLineMix = new JMenuItem("生成混合习题txt文件");
		menuOnline.add(menuOutLineMix);
		menuOutLineMix.setActionCommand("menuOutLineMix");
		menuOutLineMix.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				online(e);
			}
		});
		menuOutLine.add(menuOutLineAdd);
		menuOutLine.add(menuOutLineSub);
		menuOutLine.add(menuOutLineMult);
		menuOutLine.add(menuOutLineDiv);
		menuOutLine.add(menuOutLineMix);
		System.out.println("生成完毕!");
		// 退出菜单
		JMenu exit = new JMenu("退出");
		JMenuItem exitSystem = new JMenuItem("退出系统");
		jm.add(exit);
		exit.add(exitSystem);
		// 点击退出系统时,监听器执行相关操作
		exitSystem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 退出系统
				System.exit(0);
			}
		});

		// 添加用于显示的两个面板
		centerPane1 = new JPanel();
		southPane1 = new JPanel();

		// 将southPanel里面元素规定为靠左排放
		FlowLayout fl = (FlowLayout) southPane1.getLayout();
		fl.setAlignment(FlowLayout.LEFT);

		// 将面板添加到主面板
		contentPane.add(BorderLayout.CENTER, centerPane1);
		contentPane.add(BorderLayout.SOUTH, southPane1);

		// 设计面板中部
		// 创建用于显示习题和答案的文本,采用数组方式实现
		tEquation = new JTextField[PAGE_SIZE];
		tAnswer = new JTextField[PAGE_SIZE];
		for (int i = 0; i < PAGE_SIZE; i++) {
			// 创建显示习题的文本框,文本框的宽度是5
			tEquation[i] = new JTextField(5);
			tEquation[i].setHorizontalAlignment(JTextField.RIGHT);
			// 设置tEquantion的背景颜色为主板的背景颜色
			tEquation[i].setBackground(centerPane1.getBackground());
			// 无边框
			tEquation[i].setBorder(null);
			// 框里内容不可编辑
			tEquation[i].setEditable(false);
			tAnswer[i] = new JTextField(2);
			// 把生成的文本框放入contentPanel面板中,他会自动排列
			centerPane1.add(tEquation[i]);
			centerPane1.add(tAnswer[i]);
		}
		// 添加上一页和下一页命令按钮显示页码laber
		preButton = new JButton("上一页");
		preButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				preButton(e);
			}
		});
		pageIndex = new JLabel("页码");
		nextButton = new JButton("下一页");
		nextButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				nextbutton(e);
			}
		});
		// 将上述元素添加到中部面板中
		centerPane1.add(preButton);
		centerPane1.add(pageIndex);
		centerPane1.add(nextButton);

		// 设计底部面板的内容
		check = new JButton("批改");
		check.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				check();
			}
		});
		labelResult = new JLabel("显示成绩");

		// 将元素添加到底部面板中
		southPane1.add(check);
		southPane1.add(labelResult);

	}

	protected void check() {
		for (int i = (currentpage - 1) * PAGE_SIZE, j = 0; i < currentpage * PAGE_SIZE; i++, j++) {
			if (i < exerciseCount && tAnswer[j].getText() != null && tAnswer[j].getText().length() > 0) {
				if (tAnswer[j].getText().matches("^[0-9]*$")) {
					answer.set(i, Integer.parseInt(tAnswer[j].getText()));
				}
			}
		}
		ck = new CheckAnswer();
		ck.Check(answer, ex);
		labelResult.setText("答对了:" + ck.getRight() + ",答错了:" + ck.getWrong());
	}

	protected void nextbutton(ActionEvent e) {
		for (int i = (currentpage - 1) * PAGE_SIZE, j = 0; i < currentpage * PAGE_SIZE; i++, j++) {
			if (i < exerciseCount && tAnswer[j].getText() != null && tAnswer[j].getText().length() > 0) {
				if (tAnswer[j].getText().matches("^[0-9]*$")) {
					answer.set(i, Integer.parseInt(tAnswer[j].getText()));
				}
			}
		}
		currentpage++;
		update();
	}

	protected void preButton(ActionEvent e) {
		for (int i = (currentpage - 1) * PAGE_SIZE, j = 0; i < currentpage * PAGE_SIZE; i++, j++) {
			if (i < exerciseCount && tAnswer[j].getText() != null && tAnswer[j].getText().length() > 0) {
				if (tAnswer[j].getText().matches("^[0-9]*$")) {
					answer.set(i, Integer.parseInt(tAnswer[j].getText()));
				}
			}
		}
		currentpage--;
		update();
	}

	protected void online(ActionEvent e) {
		// 判断在线练习的选项
		if (e.getActionCommand() == "onlineAdd") {
			exerciseCount = Integer.parseInt(JOptionPane.showInputDialog("请输入生成算式的数量"));
			ex = new Exercises(exerciseCount);
			ex.generataeAddExercises();
		} else if (e.getActionCommand() == "onlineSub") {
			exerciseCount = Integer.parseInt(JOptionPane.showInputDialog("请输入生成算式的数量"));
			ex = new Exercises(exerciseCount);
			ex.generataeSubExercises();
		} else if (e.getActionCommand() == "onlineMult") {
			exerciseCount = Integer.parseInt(JOptionPane.showInputDialog("请输入生成算式的数量"));
			ex = new Exercises(exerciseCount);
			ex.generateMultExercises();
		} else if (e.getActionCommand() == "onlineDiv") {
			exerciseCount = Integer.parseInt(JOptionPane.showInputDialog("请输入生成算式的数量"));
			ex = new Exercises(exerciseCount);
			ex.generateDivExercises();
		} else if (e.getActionCommand() == "onlineMix") {
			exerciseCount = Integer.parseInt(JOptionPane.showInputDialog("请输入生成算式的数量"));
			ex = new Exercises(exerciseCount);
			ex.generateRandomExercises();
		} else if (e.getActionCommand() == "menuOutLineAdd") {
			exe.generataeAddExercises();
			efd.WirteExercisesToFile(ex, "D:\\" + s1 + "-ADD.txt");
		} else if (e.getActionCommand() == "menuOutLineSub") {

			exe.generataeSubExercises();
			efd.WirteExercisesToFile(ex, "D:\\" + s1 + "-SUB.txt");
		} else if (e.getActionCommand() == "menuOutLineMult") {

			exe.generateMultExercises();
			efd.WirteExercisesToFile(ex, "D:\\" + s1 + "-Mult.txt");
		} else if (e.getActionCommand() == "menuOutLineDiv") {

			exe.generateDivExercises();
			efd.WirteExercisesToFile(ex, "D:\\" + s1 + "-Div.txt");
		} else {

			exe.generateRandomExercises();
			efd.WirteExercisesToFile(ex, "D:\\" + s1 + "-Mix.txt");
		}
		// 创建记录用户答案的answer对象
		answer = new StudentAnswer();
		for (int i = 0; i < exerciseCount; i++) {
			// 将答案中集合值设置为-1
			answer.add(-1);
		}
		// 计算总页数
		pages = (int) Math.ceil(1.0 * exerciseCount / PAGE_SIZE);
		// 将生成的习题显示在主面板上面
		currentpage = 1;
		update();
	}

	private void update() {
		for (int i = (currentpage - 1) * PAGE_SIZE, j = 0; i < currentpage * PAGE_SIZE; i++, j++) {
			if (i < exerciseCount) {
				tEquation[j].setText(ex.Get(i).toString());
				tEquation[j].setBackground(contentPane.getBackground());
				tEquation[j].setVisible(true);
				if (answer.get(i) != -1) {
					tAnswer[j].setText(Integer.toString(answer.get(i)));
				} else {
					tAnswer[j].setText("");
				}
			} else {
				tEquation[j].setVisible(false);
				tAnswer[j].setVisible(false);
			}
		}
		// 设置可见性和可用性
		preButton.setVisible(pages > 1);
		nextButton.setVisible(pages > 1);
		preButton.setEnabled(currentpage > 1);
		nextButton.setEnabled(currentpage < pages);
		pageIndex.setText("第" + currentpage + "页/共" + pages + "页");
		// 批改可见性和可用性设置
		if (currentpage == pages) {
			check.setEnabled(true);
		} else {
			check.setEnabled(false);
		}
	}

}
public class UI {
	public static String[] topMenu = { "退出", "在线练习", "生成习题" };
	public static String[][] secondMenu = { {}, { "返回上级", "加法练习", "减法练习", "混合练习" },
			{ "返回上级", "生成加法算式", "生成减法算式", "生成混合算式" } };
	public static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		System.out.println("欢迎使用习题系统,功能列表:");
		printTopMenu();
		int command1, command2;
		command1 = sc.nextInt();
		boolean exit = false;
		while (!exit) {
			switch (command1) {
			case 0:
				System.out.println("感谢使用,退出系统!");
				break;
			case 1:
				printSecondMenu(command1);
				command2 = sc.nextInt();
				practiceOnline(command2);
				break;
			case 2:
				printSecondMenu(command1);
				command2 = sc.nextInt();
				generateExerciseToFile(command2);
				break;
			default:
				break;
			}
		}
	}

	private static void generateExerciseToFile(int command2) {
		// TODO 自动生成的方法存根
		if (command2 == 0) {
			return;
		}
		System.out.println("输入你要生成算式的个数:");
		ExercisesFileDao efd = new ExercisesFileDao();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD-HH-SS");
		String s1 = sdf.format(new Date());
		String s = UUID.randomUUID().toString().substring(0, 10);
		int count = sc.nextInt();
		Exercises ex = new Exercises(count);
		if (command2 == 1) {
			ex.generataeAddExercises();
			efd.WirteExercisesToFile(ex, "D:\\" + s1 + "-ADD.txt");
		} else if (command2 == 2) {
			ex.generataeSubExercises();
			efd.WirteExercisesToFile(ex, "D:\\" + s1 + "-SUB.txt");

		} else {
			ex.generateRandomExercises();
			efd.WirteExercisesToFile(ex, "D:\\" + s1 + "-MIX.txt");

		}
		System.out.println("生成完毕!");

	}

	private static void practiceOnline(int command2) {
		// TODO 自动生成的方法存根

		if (command2 == 0)

			return;
		System.out.println("请输入要算的个数:");
		int count = sc.nextInt();
		Exercises ex = new Exercises(count);
		if (command2 == 1) {
			ex.generataeAddExercises();
		} else if (command2 == 2) {
			ex.generataeSubExercises();
		} else {
			ex.generateRandomExercises();
		}
		Student s = new Student(null, ex);
		s.setEx(ex);
		s.PracticeOneByOne();
	}

	private static void printSecondMenu(int command1) {
		// TODO 自动生成的方法存根
		System.out.println("你选择的是:" + topMenu[command1] + "功能!功能列表如下:");
		for (int i = 0; i < secondMenu[command1].length; i++) {
			System.out.println(i + "." + secondMenu[command1][i]);

		}
		System.err.println("请选择功能!");
	}

	private static void printTopMenu() {
		for (int i = 0; i < topMenu.length; i++) {
			System.out.println(i + "." + topMenu[i]);

		}
		System.err.println("请选则功能!");

	}
}

第三部分

public class AddEquation extends Equation {
	public AddEquation() {
		generateEquation('+');
	}

	@Override
	public int Caculate() {
		return this.getLeft() + this.getRight();
	}

	// 将算式字符解析为算式的对象
	public AddEquation(String s) {
		int index = s.indexOf("+");// 用+号作为索引,取+号所在的位置为索引
		int length = s.length();
		this.setLeft(Integer.parseInt(s.substring(0, index)));
		this.setRight(Integer.parseInt(s.substring(index + 1, length)));
		// Integer.parseInt()强制类型转换,将括号内的转化为整型
		// s.substring(x,y)取字符范围,x――y范围内的字符串
		this.setSign('+');
		this.setResult(Caculate());

	}
}

public class DivEquation extends Equation {
	public DivEquation() {
		generateEquation('/');
	}

	@Override
	public int Caculate() {
		return this.getLeft() / this.getRight();
	}

	public DivEquation(String s) {
		int index = s.indexOf("/");// 用+号作为索引,取+号所在的位置为索引
		int length = s.length();
		this.setLeft(Integer.parseInt(s.substring(1, index)));
		this.setRight(Integer.parseInt(s.substring(index + 1, length)));
		this.setSign('/');
		this.setResult(Caculate());
	}
}

public class MultEquation extends Equation{
	public  MultEquation(){
		generateEquation('*');
	}
	@Override
	public int Caculate() {
		return this.getLeft()*this.getRight();
	}
	public	MultEquation(String s) {
		int index=s.indexOf("*");
		int length=s.length();
		this.setLeft(Integer.parseInt(s.substring(0,index)));
		this.setRight(Integer.parseInt(s.substring(index+1,length)));
		this.setSign('*');
		this.setResult(Caculate());
	}
}

public class SubEquation extends Equation {
	public SubEquation() {
		generateEquation('-');
	}

	@Override
	public int Caculate() {
		return this.getLeft() - this.getRight();
	}

	// 将算式字符解析为算式的对象
	public SubEquation(String s) {
		int index = s.indexOf("-");
		int length = s.length();
		this.setLeft(Integer.parseInt(s.substring(0, index)));
		this.setRight(Integer.parseInt(s.substring(index + 1, length)));
		this.setSign('-');
		this.setResult(Caculate());
	}
}

public abstract class Equation {
	private int Left, Right, Result;

	public int getLeft() {
		return Left;
	}

	public void setLeft(int left) {
		Left = left;
	}

	public int getRight() {
		return Right;
	}

	public void setRight(int right) {
		Right = right;
	}

	public int getResult() {
		return Result;
	}

	public void setResult(int result) {
		Result = result;
	}

	public char getSign() {
		return sign;
	}

	public void setSign(char sign) {
		this.sign = sign;
	}

	public int getMax() {
		return Max;
	}

	public void setMax(int max) {
		Max = max;
	}

	public int getMin() {
		return Min;
	}

	public void setMin(int min) {
		Min = min;
	}

	private char sign;
	// Min和Max设置为常量,需求发生变化时,方便修改
	private int Max = 100, Min = 0;

	// 用于产生算式的方法
	public void generateEquation(char s) {
		// 随机产生左右操作数
		do {
			this.setLeft(generateRandomNumber(Max, Min));
			this.setRight(generateRandomNumber(Max, Min));
			this.setSign(s);
			this.setResult(Caculate());
		} while (!isBetween(Max, Min, Result));
	}

	// 将运算结果的方法设置为抽象方法,实现有子类决定
	public abstract int Caculate();

	// 产生随机整数在min和max之间
	public int generateRandomNumber(int max, int min) {
		Random rand = new Random();
		return rand.nextInt(max + 1 - min) - min;
	}

	// 判断结果在0-100之间
	public boolean isBetween(int max, int min, int value) {
		return value <= max && value > min;
	}

	// 比较生成的算式是否两两相同
	public boolean isEqual(Equation e) {
		boolean flag;
		// 先比较算式的运算符,在比较left和right是否相同
		if (e.getSign() != this.getSign()) {
			flag = false;
		} else if (e.getLeft() == this.getLeft() && this.getRight() == e.getRight()) {
			flag = true;
		} else {
			flag = false;
		}
		return flag;
	}

	// 将equation对象中的属性拼凑成一个算式的字符串
	public String toString() {
		return "" + this.getLeft() + this.getSign() + this.getRight();
	}
}
public class Exercises {
	private int count = 50;
	private int index = 0;// 制作一个索引 用来表示是list里面的第几个算式

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

	public ArrayList<Equation> getList() {
		return list;
	}

	public void setList(ArrayList<Equation> list) {
		this.list = list;
	}

	private ArrayList<Equation> list;

	public Exercises() {
		list = new ArrayList<Equation>();
	}

	public Exercises(int NewCount) {
		this.count = NewCount;
		list = new ArrayList<Equation>();
	}

	public void generataeAddExercises() {
		int i = 0;
		while (i < count) {
			Equation e;
			// 判断产生的算式在集合中是否重复
			e = new AddEquation();
			if (!isContains(e))
				;
			{
				list.add(e);
				i++;
			}
		}
	}

	public void generateMultExercises() {
		int i = 0;
		while (i < count) {
			Equation e;
			e = new MultEquation();
			if (!isContains(e))
				;
			{
				list.add(e);
				i++;
			}
		}
	}

	public void generateDivExercises() {
		int i = 0;
		while (i < count) {
			Equation e;
			e = new DivEquation();
			if (!isContains(e))
				;
			{
				list.add(e);
				i++;
			}
		}
	}

	public void generataeSubExercises() {
		int i = 0;
		while (i < count) {
			Equation e;
			e = new SubEquation();
			if (!isContains(e))
				;
			{
				list.add(e);
				i++;
			}
		}
	}

	public void generateRandomExercises() {
		int i = 0;
		Random rand = new Random();
		while (i < count) {
			Equation e;
			if (rand.nextInt(4) == 0) {
				e = new AddEquation();
			} else if (rand.nextInt(4) == 1) {
				e = new SubEquation();
			} else if (rand.nextInt(4) == 2) {
				e = new MultEquation();
			} else {
				e = new DivEquation();
			}
			if (!isContains(e)) {
				list.add(e);
				i++;
			}
		}
	}

	// 判断一个算式是否存在集合中
	public boolean isContains(Equation e) {
		boolean flag = false;
		for (Equation item : list) {
			if (item.isEqual(e)) {
				flag = true;
				break;
			}
		}
		return flag;
	}

	public void Print() {
		int i = 0;
		for (Equation item : list) {
			System.out.print("(" + (i + 1) + ")" + item.toString());
			i++;
			if (i % 10 == 0) {
				System.out.println();
			} else {
				System.out.print("\t");
			}
		}
	}

	// 判断当前索引是否小于list的size
	public boolean hasNext() {
		return index < list.size();
	}

	// 从list里面取出所有Equation
	public Equation Next() {
		Equation e1 = null;// 定义一个变量=for(Equation item:list)
		if (index < list.size()) {
			e1 = list.get(index);// 把当前索引所指的位置的数取出来
			index++;
			return e1;
		} else {
			return null;
		}
	}

	// 判断是否达到list的size 当未到达存入算式e
	public boolean add(Equation e) {
		if (index < count) {
			list.add(e);
			index++;
			return true;
		} else {
			return false;
		}
	}

	public int Size() {
		return list.size();
	}

	// 从集合中取出所有的算式
	public Equation Get(int index) {
		if (index < Size()) {
			return list.get(index);
		} else {
			return null;
		}
	}
}
public class StudentAnswer {
	private ArrayList<Integer> AnswerList;

	public ArrayList<Integer> getAnswer() {
		return AnswerList;
	}

	public void setAnswer(ArrayList<Integer> answer) {
		this.AnswerList = answer;
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	private int index = 0;

	public StudentAnswer() {
		this.index = 0;
		AnswerList = new ArrayList<Integer>();
	}

	// 用户输入答案并将答案记录到answerList中
	public void ScanAnswerFromKeyBoard(int count) {
		AnswerList.clear();
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入答案:回车输入下一个题");
		for (int i = 0; i < count; i++) {
			System.out.println("(" + (i + 1) + ")");
			AnswerList.add(sc.nextInt());
		}
		sc.close();
	}

	public void WriteAnswerToFile(String FileName) {
		File file = new File(FileName);
		Writer out = null;
		try {
			out = new FileWriter(file, true);
			for (Integer item : AnswerList) {
				out.write(item + "\t");
			}
			out.flush();// 压栈
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public void ReadAnswerFromFile(String FileName) {
		File file = new File(FileName);
		Scanner sc = null;
		AnswerList.clear();
		try {
			sc.useDelimiter("\t");
			sc = new Scanner(file);
			while (sc.hasNext()) {
				sc.next();
				AnswerList.add(Integer.parseInt(sc.next()));
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			sc.close();
		}
	}

	// reset()将答案的索引设置为0
	public void reset() {
		this.index = 0;
	}

	public boolean add(Integer a) {
		return this.AnswerList.add(a);// 添加成功返回true 添加失败返回false
	}

	public boolean hasNext() {
		return index < AnswerList.size();
	}

	public int Next() {
		if (hasNext()) {
			return AnswerList.get(index++);// 传出AnswerList中index所在的位置,index传出以后累加
		} else {
			return -1;
		}
	}

	public int get(int index) {
		return AnswerList.get(index);
	}

	public void set(int index, int x) {

		this.AnswerList.set(index, x);
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值