Skip to content

Repository files navigation

吴家未-25361160-第二次人工智能编程作业

仓库链接: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

功能列表

  1. 查询学生信息(按学号)
  2. 随机点名(含边界检查)
  3. 生成考场安排表
  4. 生成准考证文件
  5. 退出系统

1. 任务拆解与 AI 协作策略

这次作业要求面向对象 + 模块化 + 文件读写,我没有一上来就让 AI 把整套系统写完,而是按功能拆开做的。

步骤1: 先自己理清楚三个文件怎么分:Student 只负责存数据,ExamSys 负责业务,main.py 只启动。然后让 AI 帮忙写了 Student 类和从 txt 读名单的基本代码。

步骤2: 接着让 AI 补菜单循环和“按学号查询”,我本地跑一遍,确认能读出 10 个学生、查询 2001107 正常。

步骤3: 再单独要“随机点名”,特别强调要用 random.sample 保证不重复,并且要对非数字、小于等于 0、超过总人数这三种情况做处理。

步骤4: 最后做考场安排和准考证。准考证要和考场座位一致,所以我要求先把打乱后的列表存到成员变量里,两边共用。

步骤5: 用 Git 按功能点分多次提交,最后补 README 和示例结果文件。


2. 核心 Prompt 迭代记录

第一次 Prompt

用 Python 写一个学生管理系统,能读 txt 名单,查询、随机点名、生成考场表和准考证。

AI 生成的问题/缺陷:

  • 把所有代码塞在一个文件里,不符合作业“三个文件模块化”的要求
  • 没有用类,就是一堆函数
  • 读文件时没跳过表头,序号那一行会被当成学生数据
  • 随机点名没有 try-except,输入字母会直接崩

优化后的 Prompt(追问)

请按下面约束重写:

  1. 必须定义 Student 类和 ExamSys 类
  2. 拆成 main.py、student.py、exam_system.py 三个文件
  3. 只允许用标准库里的 os 和 random
  4. 名单文件第一行是表头要跳过
  5. 随机点名用 try-except 处理非数字、人数<=0、人数超过总数
  6. 考场安排表格式:座位号,姓名,学号
  7. 准考证写到“准考证”文件夹,文件名 01.txt、02.txt...,文件夹已存在时不要报错

这次生成的结构基本对了,我又自己改了几处输出提示文字,让它和作业示例更接近。


3. Debug 与异常处理记录

报错类型/漏洞现象:
一开始运行时提示 FileNotFoundError,找不到学生名单文件。

解决过程:
我自己看了 Traceback,发现是工作目录不对——我在别的文件夹里运行 python main.py,相对路径就读不到文件。后来统一在项目根目录下运行就好了。
另外有一次准考证路径写成了硬编码字符串拼接,我改成了 os.path.join,在不同系统下更稳妥。

最终修改:

  • 确认相对路径以项目根目录为准
  • 文件夹创建用 os.path.exists 判断后再 os.mkdir
  • 点名输入异常时打印提示,不让程序退出

4. 人工代码审查(Code Review)

下面是随机点名的核心逻辑,我逐行写了中文注释,说明自己理解运行机制:

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}")

理解要点:

  1. int() 转换失败会进 except,程序不会中断。
  2. 先判断 count 范围,再调用 random.sample,避免库本身抛异常。
  3. sample 从列表里无不放回抽取,满足“不重复点名”的要求。

运行示例(简要)

【系统】已成功加载 10 名学生信息。

===== 学生信息与考场管理系统 =====
1. 查询学生信息
2. 随机点名
3. 生成考场安排表
4. 生成准考证文件
+-------------------------------------
0. 退出系统
请输入功能编号:1
请输入要查询的学号:2001107
查询结果:
序号: 7  姓名: 赵十  性别: 男 班级: 1  学号: 2001107  学院: 外国语

完成人:吴家未
学号:25361160
课程:《人工智能编程语言》第 2 次作业

About

人工智能编程语言第2次作业:学生信息与考场管理系统(吴家未)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages