Bootstrap

Java课程设计“单项选择题标准化考试系统设计”

大二时做的java课设,代码能力不是很行,给需要做课设的同学一个参考

题目如下

   单项选择题标准化考试系统设计

1、问题描述

设计一个单项选择题标准化考试系统,该系统要求能自动组卷和评分。

2、功能要求

(1)用数据库保存试题。(每个试题包括题干、4个备选答案、标准答案)。

(2)试题录入:可随时增加试题到试题库中。

(3)试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)。

(4)答题:用户可实现输入自己的答案。

(5)自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。

(6)退出。


该项目连接并使用mysql数据库保存试题,项目结构比较简单,当时也没有发现很严重的bug

废话不多说,代码如下

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashSet;
import java.util.Random;
import java.util.Scanner;

public class test {

    public static void main(String[] args) {

        try {
            // 注册数据库的驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 通过DriverManger获取数据库连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/shitiku", "root", "123456");

            while (true) {
                Scanner scan = new Scanner(System.in);
                System.out.println("============考试系统菜单============");
                System.out.println("1.题库管理");
                System.out.println("2.答题判分");
                System.out.println("3.退出系统");
                System.out.print("请选择您要进行操作的编号:");
                int choice = scan.nextInt();
                switch (choice) {
                    case 1:
                        questionManage(conn);
                        break;
                    case 2:
                        answertest(conn);
                        break;
                    case 3:
                        System.out.println("感谢使用,再见!");
                        conn.close();
                        System.exit(0);
                    default:
                        System.out.println("无效操作,请重新选择");
                }

            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    // 题库管理
    private static void questionManage(Connection conn) {
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.println("============题库管理============");
            System.out.println("1.查询题库");
            System.out.println("2.添加试题");
            System.out.println("3.删除试题");
            System.out.println("4.返回上一级菜单");
            System.out.print("请选择您要进行操作的编号:");
            int choice = scan.nextInt();
            switch (choice) {
                case 1:
                    selectQuestion(conn);
                    break;
                case 2:
                    addQuestion(conn);
                    break;
                case 3:
                    selectQuestion(conn);
                    deleteQuestion(conn);
                    break;
                case 4:
                    return;
                default:
                    System.out.println("无效操作,请重新输入");
                    break;
            }
        }
    }

    // 查询当前题目数量并返回题目数
    private static int findmax(Connection conn) {
        int number = 0;
        try {
            String maxQNoSql = "SELECT COALESCE(MAX(q_no), 0) AS max_q_no FROM shitiku.shitibiao";
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery(maxQNoSql)) {
                if (rs.next()) {
                    number = rs.getInt("max_q_no");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return number;
    }

    // 查询试题
    private static void selectQuestion(Connection conn) {
        System.out.println("题库当前共有" + findmax(conn) + "道题目");
        try {
            // 通过Connection对象获取Statement对象
            Statement sta = conn.createStatement();
            // 通过Statement对象执行sql语句
            ResultSet rs = sta.executeQuery("select * from shitiku.shitibiao");
            while (rs.next()) {
                int q_no = rs.getInt("q_no");
                String q_name = rs.getString("q_name");
                String q_a = rs.getString("q_a");
                String q_b = rs.getString("q_b");
                String q_c = rs.getString("q_c");
                String q_d = rs.getString("q_d");
                String q_answer = rs.getString("q_answer");
                System.out.println("题目" + q_no + " " + q_name);
                System.out.println("     a. " + q_a);
                System.out.println("     b. " + q_b);
                System.out.println("     c. " + q_c);
                System.out.println("     d. " + q_d);
                System.out.println("正确答案: " + q_answer);

            }
            rs.close();
            sta.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    // 添加试题
    private static void addQuestion(Connection conn) {
        Scanner scan = new Scanner(System.in);

        // 获取下一个可用的 q_no
        int number = findmax(conn) + 1;

        try {
            // 收集用户输入
            System.out.println("请输入题目 " + number + ":");
            String name = scan.nextLine();
            System.out.println("请输入a选项:");
            String a = scan.nextLine();
            System.out.println("请输入b选项:");
            String b = scan.nextLine();
            System.out.println("请输入c选项:");
            String c = scan.nextLine();
            System.out.println("请输入d选项:");
            String d = scan.nextLine();
            System.out.println("请输入答案:");
            String answer = scan.nextLine();

            // 构建SQL语句并执行插入操作
            String insertSql = "INSERT INTO shitiku.shitibiao (q_no, q_name, q_a, q_b, q_c, q_d, q_answer) VALUES ('"
                    + number + "', '"
                    + name + "', '"
                    + a + "', '"
                    + b + "', '"
                    + c + "', '"
                    + d + "', '"
                    + answer + "')";

            try (Statement stmt = conn.createStatement()) {
                int affectedRows = stmt.executeUpdate(insertSql);
                if (affectedRows > 0) {
                    System.out.println("试题添加成功!");
                } else {
                    System.out.println("试题添加失败!");
                }
            }

        } catch (SQLException e) {
            e.printStackTrace();
            System.err.println("添加题目时发生错误:" + e.getMessage());
        }
    }

    // 删除试题
    private static void deleteQuestion(Connection conn) {
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入要删除的题号:");
        int q_noToDelete = scan.nextInt();

        // 使用事务确保数据一致性
        try {
            conn.setAutoCommit(false); // 开始事务

            // Step 1: 删除指定题号的记录
            String deleteSql = "DELETE FROM shitibiao WHERE q_no = " + q_noToDelete;
            try (Statement stmtDelete = conn.createStatement()) {
                int affectedRows = stmtDelete.executeUpdate(deleteSql);

                if (affectedRows > 0) {
                    // Step 2: 更新后续题目的 q_no
                    String updateSql = "UPDATE shitibiao SET q_no = q_no - 1 WHERE q_no > " + q_noToDelete;
                    try (Statement stmtUpdate = conn.createStatement()) {
                        stmtUpdate.executeUpdate(updateSql);
                    }

                    conn.commit(); // 提交事务
                    System.out.println("成功删除题号为 " + q_noToDelete + " 的题目,并已更新后续题目的编号。");
                } else {
                    conn.rollback(); // 回滚事务
                    System.out.println("未找到题号为 " + q_noToDelete + " 的题目,删除失败。");
                }
            } catch (SQLException e) {
                conn.rollback(); // 发生异常时回滚事务
                e.printStackTrace();
                System.err.println("删除题目时发生错误:" + e.getMessage());
            } finally {
                conn.setAutoCommit(true); // 恢复默认提交模式
            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.err.println("设置事务状态时发生错误:" + e.getMessage());
        }
    }

    // 随机生成考试试卷
    private static void gettest(Connection conn, int num) {
        Random rand = new Random();

        try {
            Statement sta = conn.createStatement();
            HashSet<question> set1 = new HashSet<question>();
            while (true) {
                int r = rand.nextInt(num) + 1;
                ResultSet rs = sta.executeQuery("select * from shitibiao where q_no=" + r);
                while (rs.next()) {
                    int q_no = rs.getInt("q_no");
                    String q_name = rs.getString("q_name");
                    String q_a = rs.getString("q_a");
                    String q_b = rs.getString("q_b");
                    String q_c = rs.getString("q_c");
                    String q_d = rs.getString("q_d");
                    String q_answer = rs.getString("q_answer");
                    question q = new question(q_name, q_a, q_b, q_c, q_d, q_answer);
                    set1.add(q);
                }
                rs.close();
                if (set1.size() >= num) {
                    break;
                }
            }
            System.out.println("============生成试卷============");
            for (question q : set1) {
                System.out.println(q);
                System.out.println();
            }
            sta.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 抽题答题并统分
    private static void answertest(Connection conn) {
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入您的学号:");
        String studentId = scan.next();
        System.out.println("请输入试题数量");
        int num = 0;
        int maxNum = findmax(conn); // 获取题库的最大数量

        System.out.println("题库中的最大题目数量为: " + maxNum);
        while (true) {
            System.out.print("请输入一个不超过 " + maxNum + " 的数字: ");
            if (scan.hasNextInt()) {
                num = scan.nextInt();
                if (num <= maxNum && num > 0) { // 确保输入是一个有效的正整数且不超过最大值
                    break; // 输入有效,退出循环
                } else {
                    System.out.println("输入的值超出了题库的最大数量 " + maxNum + " 或者不是一个有效的正整数,请重新输入。");
                }
            } else {
                System.out.println("无效输入,请输入一个整数。");
                scan.next(); // 清除无效输入
            }
        }
        gettest(conn, num);
        System.out.println("============开始答题============");
        int score = 0;
        try {
            // 通过Connection对象获取Statement对象
            Statement sta = conn.createStatement();
            // 通过Statement对象执行sql语句
            ResultSet rs = sta.executeQuery("select * from shitiku.shitibiao");
            PrintStream out = new PrintStream(new FileOutputStream(studentId + ".txt"));
            for (int i = 0; i < num && rs.next(); i++) {
                int q_no = rs.getInt("q_no");
                String q_name = rs.getString("q_name");
                String q_a = rs.getString("q_a");
                String q_b = rs.getString("q_b");
                String q_c = rs.getString("q_c");
                String q_d = rs.getString("q_d");
                String q_answer = rs.getString("q_answer");
                System.out.println(q_no + ".  " + q_name);
                System.out.println("a. " + q_a);
                System.out.println("b. " + q_b);
                System.out.println("c. " + q_c);
                System.out.println("d. " + q_d);
                System.out.print("\n请输入答案:");
                String answer = scan.next();
                if (answer.equals(q_answer)) {
                    System.out.println("回答正确!");
                    score++;
                } else {
                    System.out.println("回答错误,正确答案为:" + q_answer);
                }
                // 输出答题结果到文件
                out.println(q_no + ".  " + q_name);
                out.println("a. " + q_a);
                out.println("b. " + q_b);
                out.println("c. " + q_c);
                out.println("d. " + q_d);
                out.println("你的答案:" + answer + "    正确答案:" + q_answer);

            }
            System.out.println("该试卷的总分为: " + num + ",   " + "您的得分为" + score);
            out.print("该试卷的总分为: " + num + ",   " + "您的得分为" + score);
            out.close();
            rs.close();
            sta.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}

// 问题类
class question {
    String name;
    String a;
    String b;
    String c;
    String d;
    String answer;

    public question(String name, String a, String b, String c, String d, String answer) {
        this.name = name;
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.answer = answer;
    }

    // 重写描述状态的toString方法
    @Override
    public String toString() {
        return name + "\n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d;
    }

}

sql语句如下

CREATE DATABASE shitiku;
USE shitiku;
CREATE TABLE shitibiao (
                                         q_no INT PRIMARY KEY,
                                         q_name TEXT NOT NULL,
                                         q_a TEXT NOT NULL,
                                         q_b TEXT NOT NULL,
                                         q_c TEXT NOT NULL,
                                         q_d TEXT NOT NULL,
                                         q_answer CHAR(1) NOT NULL CHECK (q_answer IN ('A', 'B', 'C', 'D'))
);

另一个javaswing的版本,ui界面还没有调试完全

import javax.swing.*;
import java.awt.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.HashSet;
import java.util.Random;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class TestSystemSwing {
    private Connection conn;

    // 定义Question类
    static class Question {
        private int q_no;
        private String q_name;
        private String q_a;
        private String q_b;
        private String q_c;
        private String q_d;
        private String q_answer;

        public Question(int q_no, String q_name, String q_a, String q_b, String q_c, String q_d, String q_answer) {
            this.q_no = q_no;
            this.q_name = q_name;
            this.q_a = q_a;
            this.q_b = q_b;
            this.q_c = q_c;
            this.q_d = q_d;
            this.q_answer = q_answer;
        }

        public int getQ_no() {
            return q_no;
        }

        public String getQ_name() {
            return q_name;
        }

        public String getQ_a() {
            return q_a;
        }

        public String getQ_b() {
            return q_b;
        }

        public String getQ_c() {
            return q_c;
        }

        public String getQ_d() {
            return q_d;
        }

        public String getQ_answer() {
            return q_answer;
        }

        @Override
        public String toString() {
            return q_no + ". " + q_name + "\na. " + q_a + "\nb. " + q_b + "\nc. " + q_c + "\nd. " + q_d + "\n正确答案:" + q_answer;
        }
    }

    // 连接并加载数据库数据
    public TestSystemSwing() {
        try {
            // 注册数据库驱动并获取连接
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/shitiku", "root", "123456");

            // 初始化界面
            initUI();
        } catch (ClassNotFoundException | SQLException e) {
            JOptionPane.showMessageDialog(null, "初始化失败:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
            System.exit(1); // 如果初始化失败,直接退出程序
        }
    }

    // 开始菜单界面
    private void initUI() {
        JFrame frame = new JFrame("考试系统");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setLayout(new GridLayout(4, 1, 10, 10));

        JLabel titleLabel = new JLabel("考试系统菜单", JLabel.CENTER);
        titleLabel.setFont(new Font("Arial", Font.BOLD, 20));

        JButton manageQuestionsButton = new JButton("题库管理");
        JButton answerTestButton = new JButton("答题判分");
        JButton exitButton = new JButton("退出系统");

        // 添加按钮监听器
        manageQuestionsButton.addActionListener(e -> questionManage());
        answerTestButton.addActionListener(e -> getTestAndAnswer());
        exitButton.addActionListener(e -> closeApplication());

        // 添加组件到窗口
        frame.add(titleLabel);
        frame.add(manageQuestionsButton);
        frame.add(answerTestButton);
        frame.add(exitButton);

        frame.setVisible(true);
    }

    // 题库管理界面
    private void questionManage() {
        JFrame manageFrame = new JFrame("题库管理");
        manageFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        manageFrame.setSize(400, 300);
        manageFrame.setLayout(new GridLayout(5, 1, 10, 10));

        JLabel titleLabel = new JLabel("题库管理菜单", JLabel.CENTER);
        titleLabel.setFont(new Font("Arial", Font.BOLD, 20));

        JButton viewQuestionsButton = new JButton("查询题库");
        JButton addQuestionButton = new JButton("添加试题");
        JButton deleteQuestionButton = new JButton("删除试题");
        JButton backButton = new JButton("返回");

        // 添加监听器
        viewQuestionsButton.addActionListener(e -> selectQuestion(manageFrame));
        addQuestionButton.addActionListener(e -> addQuestion());
        deleteQuestionButton.addActionListener(e -> deleteQuestion());
        backButton.addActionListener(e -> manageFrame.dispose());

        // 添加组件到窗口
        manageFrame.add(titleLabel);
        manageFrame.add(viewQuestionsButton);
        manageFrame.add(addQuestionButton);
        manageFrame.add(deleteQuestionButton);
        manageFrame.add(backButton);

        manageFrame.setVisible(true);
    }

    // 关闭程序
    private void closeApplication() {
        try {
            if (conn != null && !conn.isClosed()) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        JOptionPane.showMessageDialog(null, "感谢使用,再见!");
        System.exit(0);
    }

    // 查询题库
    private void selectQuestion(JFrame parent) {

        StringBuilder sb = new StringBuilder("题库内容如下:\n");
        try (Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT * FROM shitiku.shitibiao")) {
            while (rs.next()) {
                sb.append("ID: ").append(rs.getInt("q_no"))
                        .append(", Question: ").append(rs.getString("q_name"))
                        .append("\na: ").append(rs.getString("q_a"))
                        .append("\nb: ").append(rs.getString("q_b"))
                        .append("\nc: ").append(rs.getString("q_c"))
                        .append("\nd: ").append(rs.getString("q_d"))
                        .append("\nAnswer: ").append(rs.getString("q_answer")).append("\n\n");
            }
            JTextArea textArea = new JTextArea(sb.toString());
            textArea.setEditable(false);
            JScrollPane scrollPane = new JScrollPane(textArea);
            JOptionPane.showMessageDialog(parent, scrollPane, "题库信息", JOptionPane.INFORMATION_MESSAGE);
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(parent, "查询题库失败:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

    // 添加试题
    private void addQuestion() {

        String name = JOptionPane.showInputDialog(null, "请输入问题文本:");
        String a = JOptionPane.showInputDialog(null, "请输入选项a:");
        String b = JOptionPane.showInputDialog(null, "请输入选项b:");
        String c = JOptionPane.showInputDialog(null, "请输入选项c:");
        String d = JOptionPane.showInputDialog(null, "请输入选项d:");
        String answer = JOptionPane.showInputDialog(null, "请输入正确答案(a/b/c/d):");
        if (name != null && !name.trim().isEmpty() && a != null && !a.trim().isEmpty() && b != null && !b.trim().isEmpty()
                && c != null && !c.trim().isEmpty() && d != null && !d.trim().isEmpty() && answer != null && !answer.trim().isEmpty()) {
            try (Statement stmt = conn.createStatement()) {
                // 自动获取题号
                int nextId = findMax() + 1;
                String sql = "INSERT INTO shitibiao (q_no, q_name, q_a, q_b, q_c, q_d, q_answer) VALUES ('"
                        + nextId + "', '"
                        + name + "', '"
                        + a + "', '"
                        + b + "', '"
                        + c + "', '"
                        + d + "', '"
                        + answer + "')";
                stmt.executeUpdate(sql);
                JOptionPane.showMessageDialog(null, "试题添加成功!");
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, "试题添加失败:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "所有字段都不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

    // 删除试题
    private void deleteQuestion() {

        String idStr = JOptionPane.showInputDialog(null, "请输入要删除的试题ID:");
        if (idStr == null || idStr.trim().isEmpty()) {
            return; // 用户取消输入或输入为空时直接返回
        }

        int q_noToDelete;
        try {
            q_noToDelete = Integer.parseInt(idStr);
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "请输入有效的数字!", "错误", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // 使用事务确保数据一致性
        try {
            conn.setAutoCommit(false); // 开始事务

            // Step 1: 删除指定题号的记录
            String deleteSql = "DELETE FROM shitibiao WHERE q_no = " + q_noToDelete;
            try (Statement stmtDelete = conn.createStatement()) {
                int affectedRows = stmtDelete.executeUpdate(deleteSql);

                if (affectedRows > 0) {
                    // Step 2: 重新排序所有题目的 q_no
                    // 获取所有试题,并按照原始顺序排列
                    try (Statement stmtSelect = conn.createStatement();
                         ResultSet rs = stmtSelect.executeQuery("SELECT * FROM shitiku.shitibiao ORDER BY q_no")) {

                        int newId = 1;
                        while (rs.next()) {
                            int currentId = rs.getInt("q_no");
                            if (currentId != newId) {
                                // 更新当前试题的q_no为新的序列号
                                String updateSql = "UPDATE shitibiao SET q_no = " + newId + " WHERE q_no = " + currentId;
                                try (Statement stmtUpdate = conn.createStatement()) {
                                    stmtUpdate.executeUpdate(updateSql);
                                }
                            }
                            newId++;
                        }
                    }

                    conn.commit(); // 提交事务
                    JOptionPane.showMessageDialog(null, "成功删除题号为 " + q_noToDelete + " 的题目,并已更新所有题目的编号为连续序列。", "成功", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    conn.rollback(); // 回滚事务
                    JOptionPane.showMessageDialog(null, "未找到题号为 " + q_noToDelete + " 的题目,删除失败。", "警告", JOptionPane.WARNING_MESSAGE);
                }
            } catch (SQLException e) {
                conn.rollback(); // 发生异常时回滚事务
                JOptionPane.showMessageDialog(null, "删除题目时发生错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
            } finally {
                conn.setAutoCommit(true); // 恢复默认提交模式
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "设置事务状态时发生错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void getTestAndAnswer() {
        // 获取学号
        String studentId = JOptionPane.showInputDialog(null, "请输入您的学号:");
        if (studentId == null || studentId.trim().isEmpty()) {
            JOptionPane.showMessageDialog(null, "学号不能为空,请重新输入。", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 获取题库的最大题目数量
        int maxNum = findMax();
        if (maxNum <= 0) {
            JOptionPane.showMessageDialog(null, "题库中没有可用的题目。", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 获取试题数量
        String numStr = JOptionPane.showInputDialog(null, "请输入试题数量(不超过当前题库最大数量" + maxNum + "题):");
        if (numStr == null || numStr.trim().isEmpty()) {
            return; // 用户取消输入或输入为空时直接返回
        }

        int num;
        try {
            num = Integer.parseInt(numStr);
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "请输入有效的数字!", "错误", JOptionPane.ERROR_MESSAGE);
            return;
        }

        if (num <= 0 || num > maxNum) {
            JOptionPane.showMessageDialog(null, "输入的值必须是1到" + maxNum + "之间的整数,请重新输入。", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 生成随机数抽取试题
        Random rand = new Random();
        HashSet<Integer> selectedIds = new HashSet<>();
        ArrayList<Question> questionsList = new ArrayList<>();

        try (Statement stmt = conn.createStatement()) {
            while (selectedIds.size() < num) {
                int r = rand.nextInt(maxNum) + 1;
                if (selectedIds.add(r)) {
                    ResultSet rs = stmt.executeQuery("SELECT * FROM shitibiao WHERE q_no=" + r);
                    if (rs.next()) {
                        Question q = new Question(
                                rs.getInt("q_no"),
                                rs.getString("q_name"),
                                rs.getString("q_a"),
                                rs.getString("q_b"),
                                rs.getString("q_c"),
                                rs.getString("q_d"),
                                rs.getString("q_answer")
                        );
                        questionsList.add(q);
                    }
                    rs.close();
                }
            }

            // 试题系统初始化后开始答题
            int score = 0;
            for (Question q : questionsList) {
                String answer = JOptionPane.showInputDialog(null,
                        q.getQ_no() + ". " + q.getQ_name() + "\n" +
                                "a. " + q.getQ_a() + "\n" +
                                "b. " + q.getQ_b() + "\n" +
                                "c. " + q.getQ_c() + "\n" +
                                "d. " + q.getQ_d() + "\n" +
                                "请输入答案:");

                if (answer != null && answer.equalsIgnoreCase(q.getQ_answer())) {
                    JOptionPane.showMessageDialog(null, "回答正确!");
                    score++;
                } else {
                    JOptionPane.showMessageDialog(null, "回答错误,正确答案为:" + q.getQ_answer());
                }
            }

            // 弹出得分情况
            JOptionPane.showMessageDialog(null, "该试卷的总分为: " + num + ", 您的得分为:" + score);

            // 将结果写入文件
            try (PrintStream out = new PrintStream(new FileOutputStream(studentId + ".txt"))) {
                out.println("学生学号: " + studentId);
                out.println("该试卷的总分为: " + num + ", 您的得分为:" + score);
                for (Question q : questionsList) {
                    out.println(q);
                }
            } catch (FileNotFoundException e) {
                JOptionPane.showMessageDialog(null, "创建文件时发生错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
            }

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "操作数据库时发生错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

    // 获取当前试题的最大序号
    private int findMax() {
        int maxNum = 0;
        try (Statement stmt = conn.createStatement()) {
            ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM shitiku.shitibiao");
            if (rs.next()) {
                maxNum = rs.getInt(1);
            }
            rs.close();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "获取题库最大题目数量时发生错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
        return maxNum;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TestSystemSwing::new);
    }
}

;