【Java】——学生考试系统(万字代码及分析)

本文介绍了使用Java开发的学生考试系统,系统包括题库管理、试卷生成和答题判分功能。利用MySQL数据库存储数据,通过JDBC进行数据库交互。题库管理支持查询和添加试题,试卷生成能随机选取试题,答题判分则按顺序判分并记录答题记录。
摘要由CSDN通过智能技术生成

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

🐠离散数学:离散数学_IT闫的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯功能简介:

🎯分段解析:

🎃题库管理部分:

🎃生成试卷部分: 

🎃答题判分部分:

🎯源代码:

🎯总结分析:


🎯功能简介:

代码中使用了MySQL数据库进行数据存储,通过JDBC连接数据库。主要包括以下几个功能:

  1. 题库管理:可以查询题库中的试题和添加新的试题。
  2. 生成试卷:随机从题库中选择指定数量的试题生成试卷。
  3. 答题判分:按顺序抽取试题,用户输入答案后进行判分,并生成答题记录。

        在题库管理中,可以通过输入题号、题目、选项和答案添加新的试题。查询题库会将题库中的试题信息打印出来。

        在生成试卷中,用户输入想要生成的试题数量,系统会随机从题库中选择相应数量的试题,并打印出来。

        在答题判分中,用户需要输入学号和试题的数量,系统会按顺序抽取试题,用户输入答案后进行判分,并生成答题记录保存到对应的文件中。

🎯分段解析:

🎃题库管理部分:

//题库管理
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.print("请选择您要进行操作的编号:");
        int choice = scan.nextInt();
        switch (choice) {
            case 1:
                selectQuestion(conn);
                break;
            case 2:
                addQuestion(conn);
                break;
            case 3:
                return;
            default:
                System.out.println("无效操作,请重新输入");
                break;
        }
    }
}

        这部分代码实现了题库管理的功能,用户可以选择查询题库或添加试题。其中selectQuestion(Connection conn)函数用于查询题库,从数据库中获取题目信息并输出。addQuestion(Connection conn)函数用于添加试题,通过用户输入的信息插入到数据库中。 


🎃生成试卷部分: 

//随机生成考试试卷
private static void gettest(Connection conn) {
    Random rand = new Random();
    Scanner scan = new Scanner(System.in);
    System.out.print("请输入考试数量:");
    int num = scan.nextInt();
    try {
        Statement sta = conn.createStatement();
        HashSet<question> set1 = new HashSet<question>();
        while (true) {
            int r = rand.nextInt(4) + 1;
            ResultSet rs = sta.executeQuery("select * from shitibiao where q_deflag=0 and q_no=" + r);
            while (rs.next()) {
                int q_no = rs.getInt("q_no");
                int q_deflag = rs.getInt("q_deflag");
                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 = scan.nextInt();
    System.out.println("==========开始答题==========");
    int score = 0;
    try {
        Statement sta = conn.createStatement();
        ResultSet rs = sta.executeQuery("select * from 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");
            int q_deflag = rs.getInt("q_deflag");
            if (q_deflag == 0) {
                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();
    }
}

        这部分代码实现了顺序抽题答题的功能。用户需要输入学号和试题数量,程序会从数据库中顺序获取试题,要求用户输入答案并进行判分,最后输出得分和试题答案。 


🎯源代码:

package one;

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;

import javax.naming.spi.DirStateFactory.Result;

public class One {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			// 注册数据库的驱动程序
			Class.forName("com.mysql.cj.jdbc.Driver");
			// 通过DriverManger获取数据库连接
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/shitiku", "root", "200454");

			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.println("4.退出系统");
				System.out.print("请选择您要进行操作的编号:");
				int choice = scan.nextInt();
				switch (choice) {
				case 1:
					questionManage(conn);
					break;
				case 2:
					gettest(conn);
					break;
				case 3:
					answertest(conn);
					break;
				case 4:
					System.out.println("感谢使用,再见!");
					conn.close();
					System.exit(0);
				default:
					System.out.println("无效操作,请重新选择");
				}

			}
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			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.print("请选择您要进行操作的编号:");
			int choice = scan.nextInt();
			switch (choice) {
			case 1:
				selectQuestion(conn);
				break;
			case 2:
				addQuestion(conn);
				break;
			case 3:
				return;
			default:
				System.out.println("无效操作,请重新输入");
				break;
			}
		}
	}

//查询试题
	private static void selectQuestion(Connection conn) {
		// TODO Auto-generated method stub
		try {
			// 通过Connection对象获取Statement对象
			Statement sta = conn.createStatement();
			// 通过Statement对象执行sql语句
			ResultSet rs = sta.executeQuery("select * from 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");
				int q_deflag = rs.getInt("q_deflag");
				if (q_deflag == 0) {
					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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

//添加试题
	private static void addQuestion(Connection conn) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		System.out.print("请输入题号(不要与题库中重复):");
		int x = scan.nextInt();
		System.out.println("请输入题目");
		String name = scan.next();
		System.out.println("请输入a选项");
		String a = scan.next();
		System.out.println("请输入b选项");
		String b = scan.next();
		System.out.println("请输入c选项");
		String c = scan.next();
		System.out.println("请输入d选项");
		String d = scan.next();
		System.out.println("请输入答案");
		String answer = scan.next();
		try {
			// 通过Connection对象获取Statement对象
			Statement sta = conn.createStatement();
			// 通过Statement对象执行sql语句
			String sql = "insert into shitibiao(q_no,q_name,q_a,q_b,q_c,q_d,q_answer) values('" + x + "','" + name
					+ "','" + a + "','" + b + "','" + c + "','" + d + "','" + answer + "')";
			sta.executeUpdate(sql);
			sta.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("试题添加成功!");
	}

//随机生成考试试卷
	private static void gettest(Connection conn) {
		Random rand = new Random();
		Scanner scan = new Scanner(System.in);
		System.out.print("请输入考试数量:");
		int num = scan.nextInt();
		try {
			Statement sta = conn.createStatement();
			HashSet<question> set1 = new HashSet<question>();
			while (true) {
				int r = rand.nextInt(4) + 1;
				ResultSet rs = sta.executeQuery("select * from shitibiao where q_deflag=0 and q_no="+r);
				while(rs.next()) {
				int q_no = rs.getInt("q_no");
				int q_deflag = rs.getInt("q_deflag");
						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)
	{
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}

//顺序抽题答题
	private static void answertest(Connection conn) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		System.out.print("请输入您的学号:");
		String studentId = scan.next();
		System.out.println("请输入试题数量");
		int num = scan.nextInt();
		System.out.println("==========开始答题==========");
		int score = 0;
		try {
			// 通过Connection对象获取Statement对象
			Statement sta = conn.createStatement();
			// 通过Statement对象执行sql语句
			ResultSet rs = sta.executeQuery("select * from 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");
				int q_deflag = rs.getInt("q_deflag");
				if (q_deflag == 0) {
					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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			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) {
		super();
		this.name = name;
		this.a = a;
		this.b = b;
		this.c = c;
		this.d = d;
		this.answer = answer;
	}

	@Override
	public String toString() {
		return name + "\n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d ;
	}

}

🎯总结分析:

        这是一个简单的考试系统程序,可以进行题库管理、生成试卷和答题判分等功能。

程序的主要逻辑如下:

  1. 注册数据库的驱动程序,并通过DriverManager获取数据库连接。
  2. 进入一个无限循环,根据用户选择执行相应的操作。
  3. 题库管理:用户可以选择查询题库或添加试题。
    • 查询题库:通过执行SQL语句查询数据库中的试题信息,并将结果打印输出。
    • 添加试题:用户输入题号、题目、选项和答案等信息,然后将试题信息插入数据库中。
  4. 生成试卷:用户输入考试数量,程序随机从数据库中选取指定数量的试题,并打印输出。
  5. 答题判分:用户输入学号和试题数量,程序顺序从数据库中选取指定数量的试题,用户输入答案并进行判分,最后将答题情况写入文件中。

        在代码中使用了Java的JDBC API来连接和操作数据库。数据库使用的是MySQL,并需要提前安装MySQL数据库并创建名为"shitiku"的数据库,以及一个名为"shitibiao"的表来存储试题信息。

        代码中的question类表示试题对象,其中包含题目、选项和答案等属性。在生成试卷时,程序随机选择试题,并将选择的试题存储在HashSet集合中,确保试题不重复。

请注意,在使用代码之前,需要根据实际情况修改数据库连接的URL、用户名和密码等信息。

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y小夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值