我的Java学习之路(七)-- 模拟考试系统

模拟考试系统

  • 一、功能描述
  • 二、实现代码
    • 1. 定义考题类
    • 2. 定义单选题类,继承考题类
    • 3. 定义多选题类,继承考题类
    • 4. 定义测试类
  • 四、演示效果图

一、功能描述

定义考题类(Question)及其子类,目前先实现了单选和多选两种题型,其他题型可以扩展
完成考题类(Question),单选题(SingleChoice)和多选题(MultiChoice)是其子类
要求:

  1. Question包含题干属性(text)
  2. Question包含检测标准答案的方法 boolean check(int[] answers)
    • 参数answers:用户提供的答案(注意:单选题只有一个答案)
  3. 单选题(SingleChoice)和多选题(MultiChoice)是Question的子类
    • MultiChoice包含属性:
      选项:String[] options
      多选标准答案:int[] answers
    • SingleChoice包含属性:
      选项:String[] options
      单选标准答案:int answers
  4. 在MultiChoice实现参数为(String text,String[] options,int[] answers)的构造方法
    • 参数text:题干
    • 参数options:选项
    • 参数answers:多选标准答案(正确选项的序号)
  5. 在SingleChoice实现参数为(String text,String[] options,int answers)的构造方法
    • 参数text:题干
    • 参数options:选项
    • 参数answers:单选标准答案(正确选项的序号)
  6. 在SingleChoice和MultiChoice类中重写Question类中的check方法
    • 方法中提供具体的检查用户答案的逻辑

二、实现代码

1. 定义考题类

Question.java

package com.feonix;

/**
 * 考题类
 * 
 * @author FeoniX
 *
 */
public abstract class Question {
	/** 题干 */
	private String text;

	/**
	 * 有参构造器
	 * 
	 * @param text 题干
	 */
	public Question(String text) {
		this.text = text;
	}

	/**
	 * 检测标准答案的方法
	 * 
	 * @param answers 考生填写的答案
	 * @return
	 */
	public abstract boolean check(int[] answers);

	/**
	 * 获取题干
	 * 
	 * @return
	 */
	public String getText() {
		return text;
	}

	/**
	 * 设置题干
	 * 
	 * @param text
	 */
	public void setText(String text) {
		this.text = text;
	}

}

2. 定义单选题类,继承考题类

SingleChoise.java

package com.feonix;

/**
 * 单选题类
 * 
 * @author FeoniX
 *
 */
public class SingleChoice extends Question {
	/** 单选题题目选项 */
	private String[] options;
	/** 单选题标准答案 */
	private int answers;

	/**
	 * 有参构造器
	 * 
	 * @param text 题干
	 * @param options 题目选项
	 * @param answers 题目答案
	 */
	public SingleChoice(String text, String[] options, int answers) {
		super(text);
		this.options = options;
		this.answers = answers;
	}

	/**
	 * 检测标准答案的方法
	 * 
	 * @param answers 考生填写的答案
	 * @return
	 */
	@Override
	public boolean check(int[] answers) {
		// 单选题不能有多个答案
		if (answers.length > 1) {
			return false;
		}
		return answers[0] == this.answers;
	}

	/**
	 * 获取题目选项
	 * 
	 * @return
	 */
	public String[] getOptions() {
		return options;
	}

	/***
	 * 设置题目选项
	 * 
	 * @param options
	 */
	public void setOptions(String[] options) {
		this.options = options;
	}

	/**
	 * 获取标准答案
	 * 
	 * @return
	 */
	public int getAnswers() {
		return answers;
	}

	/**
	 * 设置标准答案
	 * 
	 * @param answers
	 */
	public void setAnswers(int answers) {
		this.answers = answers;
	}

	@Override
	public String toString() {
		String text = this.getText() + "\n";

		for (String op : this.getOptions()) {
			text += op + "\n";
		}

		return text;
	}

}

3. 定义多选题类,继承考题类

MultiChoise.java

package com.feonix;

/**
 * 多选题类
 * 
 * @author FeoniX
 *
 */
public class MultiChoice extends Question {
	/** 多选题题目选项 */
	private String[] options;
	/** 多选题标准答案 */
	private int[] answers;

	public MultiChoice(String text, String[] options, int[] answers) {
		super(text);
		this.options = options;
		this.answers = answers;
	}

	/**
	 * 检测标准答案的方法
	 * 
	 * @param answers 考生填写的答案
	 * @return
	 */
	@Override
	public boolean check(int[] answers) {
		// 如果考生选择的选项个数和答案的选项个数不一致,说明这题答错了
		if (answers.length != this.answers.length) {
			return false;
		}
		// 正确的选项个数
		int corrects = 0;
		// 因为考生的选项个数和答案一致,但是顺序不一定一致
		for (int i = 0; i < answers.length; i++) {
			for (int j = 0; j < answers.length; j++) {
				// 所以找到一个一致的,就记录一下
				if (answers[i] == this.answers[j]) {
					corrects++;
				}
			}
		}
		// 如果正确的个数和答案个数不一致,就说明答错了,否则就是答对了
		return this.answers.length == corrects;
	}

	/**
	 * 获取题目选项
	 * 
	 * @return
	 */
	public String[] getOptions() {
		return options;
	}

	/***
	 * 设置题目选项
	 * 
	 * @param options
	 */
	public void setOptions(String[] options) {
		this.options = options;
	}

	/**
	 * 获取标准答案
	 * 
	 * @return
	 */
	public int[] getAnswers() {
		return answers;
	}

	/**
	 * 设置标准答案
	 * 
	 * @param answers
	 */
	public void setAnswers(int[] answers) {
		this.answers = answers;
	}

	@Override
	public String toString() {
		String text = this.getText() + "\n";

		for (String op : this.getOptions()) {
			text += op + "\n";
		}

		return text;
	}
}

4. 定义测试类

package com.feonix;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {
	/** 存放考题的list集合 */
	private static List<Question> list = new ArrayList<Question>();

	public static void main(String[] args) {
		// 这里调用初始化考题的方法
		initQuestions();

		Scanner key = new Scanner(System.in);
		String answer = "";
		String[] answers = new String[4];

		System.out.println("模拟考试现在开始");
		System.out.println("本套试题分为单选题和多选题,单选题只能选择一个选项,多选题多个选项中间以英文逗号“,”分隔\n");

		for (Question question : list) {
			System.out.println(question);
			System.out.println("请选择:");
			answer = key.next();
			answers = answer.split(",");

			boolean result = question.check(stringArrayToIntegerArray(answers));

			System.out.println("回答" + (result ? "正确" : "错误") + "\n");
			
			System.out.println("==========================================================================\n");
		}

		key.close();
	}

	/**
	 * 初始化生成试卷
	 * 这里手动写的两个,后续可以添加从数据库里面读取
	 */
	private static void initQuestions() {
		String text = "1. (单选题)下面的程序执行结果为:( )\npublic class Point {\n\tint y = 7;\n\tpublic void step(int y) {\n\t\ty += y;\n\t\tSystem.out.println(y);}\n\tpublic static void main(String[] args) {\n\t\tPoint p = new Point();\n\t\tp.step(10);\n\t}\n}\n";
		String[] options = new String[] { "1. 14", "2. 20", "3. 10", "4. 17" };
		int answer = 2;
		Question singleChoose = new SingleChoice(text, options, answer);
		list.add(singleChoose);

		text = "2. (多选题)下列关于JVM的内存结构描述正确的是:( )\n";
		options = new String[] { "1. 类的各种信息在堆中保存", "2. 栈用于存放程序运行过程中所有的局部变量", "3. 堆一般用于存储使用new关键字创建的对象",
				"4. 类是JVM的内存结构" };
		int[] answers = { 2, 3 };
		Question multiChoose = new MultiChoice(text, options, answers);
		list.add(multiChoose);
	}

	/**
	 * String类型的数组转为Integer类型的数组
	 * 
	 * @param array
	 * @return
	 */
	private static int[] stringArrayToIntegerArray(String[] array) {
		int[] ins = new int[array.length];

		for (int i = 0; i < array.length; i++) {
			ins[i] = Integer.parseInt(array[i]);
		}

		return ins;
	}
}

四、演示效果图

我的Java学习之路(七)-- 模拟考试系统_第1张图片

你可能感兴趣的:(Java)