仓库链接:https://github.com/Linboss9/week4-student-exam-system
本项目为《人工智能编程语言》第 2 次作业:学生信息与考场管理系统。
python main.py请保证当前目录下有 人工智能编程语言学生名单.txt。
.
├── main.py # 程序入口
├── student.py # Student 类
├── exam_system.py # ExamSys 类(菜单与各项功能)
├── 人工智能编程语言学生名单.txt # 学生名单数据
├── 考场安排表.txt # 运行功能3后生成的示例结果
├── 准考证/ # 运行功能4后生成的示例准考证
│ ├── 01.txt
│ ├── ...
│ └── 10.txt
└── README.md
- 查询学生信息(按学号)
- 随机点名(含边界检查)
- 生成考场安排表
- 生成准考证文件
- 退出系统
这次作业要求面向对象 + 模块化 + 文件读写,我没有一上来就让 AI 把整套系统写完,而是按功能拆开做的。
步骤1: 先自己理清楚三个文件怎么分:Student 只负责存数据,ExamSys 负责业务,main.py 只启动。然后让 AI 帮忙写了 Student 类和从 txt 读名单的基本代码。
步骤2: 接着让 AI 补菜单循环和“按学号查询”,我本地跑一遍,确认能读出 10 个学生、查询 2001107 正常。
步骤3: 再单独要“随机点名”,特别强调要用 random.sample 保证不重复,并且要对非数字、小于等于 0、超过总人数这三种情况做处理。
步骤4: 最后做考场安排和准考证。准考证要和考场座位一致,所以我要求先把打乱后的列表存到成员变量里,两边共用。
步骤5: 用 Git 按功能点分多次提交,最后补 README 和示例结果文件。
用 Python 写一个学生管理系统,能读 txt 名单,查询、随机点名、生成考场表和准考证。
AI 生成的问题/缺陷:
- 把所有代码塞在一个文件里,不符合作业“三个文件模块化”的要求
- 没有用类,就是一堆函数
- 读文件时没跳过表头,序号那一行会被当成学生数据
- 随机点名没有 try-except,输入字母会直接崩
请按下面约束重写:
- 必须定义 Student 类和 ExamSys 类
- 拆成 main.py、student.py、exam_system.py 三个文件
- 只允许用标准库里的 os 和 random
- 名单文件第一行是表头要跳过
- 随机点名用 try-except 处理非数字、人数<=0、人数超过总数
- 考场安排表格式:座位号,姓名,学号
- 准考证写到“准考证”文件夹,文件名 01.txt、02.txt...,文件夹已存在时不要报错
这次生成的结构基本对了,我又自己改了几处输出提示文字,让它和作业示例更接近。
报错类型/漏洞现象:
一开始运行时提示 FileNotFoundError,找不到学生名单文件。
解决过程:
我自己看了 Traceback,发现是工作目录不对——我在别的文件夹里运行 python main.py,相对路径就读不到文件。后来统一在项目根目录下运行就好了。
另外有一次准考证路径写成了硬编码字符串拼接,我改成了 os.path.join,在不同系统下更稳妥。
最终修改:
- 确认相对路径以项目根目录为准
- 文件夹创建用
os.path.exists判断后再os.mkdir - 点名输入异常时打印提示,不让程序退出
下面是随机点名的核心逻辑,我逐行写了中文注释,说明自己理解运行机制:
def random_roll_call(self):
"""随机点名,抽取不重复的学生"""
total = len(self.student_list) # 先拿到当前学生总数,后面做边界判断要用
if total == 0:
print("当前没有学生数据,无法点名。")
return
try:
# 提示里把总人数也打印出来,方便用户输入
count_str = input(f"请输入需要点名的学生数量(共 {total} 名学生):").strip()
count = int(count_str) # 这里可能抛 ValueError,比如输入了字母 a
if count <= 0:
print("[输入错误] 点名人数必须大于 0。")
return
if count > total:
# 不能点超过实际人数,random.sample 在 k 过大时也会报错
print(f"[输入错误] 点名人数({count})超过学生总人数({total}),请重新输入。")
return
# sample 保证不重复;如果用 choices 就可能抽到同一个人
selected = random.sample(self.student_list, count)
print("本次随机点名结果:")
for i, stu in enumerate(selected, 1):
print(f"{i}.{stu.name} {stu.stu_id}")
except ValueError as e:
# 捕获 int() 转换失败的情况
print(f"[输入错误] {e}")理解要点:
int()转换失败会进except,程序不会中断。- 先判断
count范围,再调用random.sample,避免库本身抛异常。 sample从列表里无不放回抽取,满足“不重复点名”的要求。
【系统】已成功加载 10 名学生信息。
===== 学生信息与考场管理系统 =====
1. 查询学生信息
2. 随机点名
3. 生成考场安排表
4. 生成准考证文件
+-------------------------------------
0. 退出系统
请输入功能编号:1
请输入要查询的学号:2001107
查询结果:
序号: 7 姓名: 赵十 性别: 男 班级: 1 学号: 2001107 学院: 外国语
完成人:吴家未
学号:25361160
课程:《人工智能编程语言》第 2 次作业