import os import time class Problem: # 定义试题信息的类 def __init__(self, num, question, choice_a, choice_b, choice_c, choice_d, answer): self.num = num self.question = question self.choice_a = choice_a self.choice_b = choice_b self.choice_c = choice_c self.choice_d = choice_d self.answer = answer class Student: # 定义学生信息的类 def __init__(self, name, user_name, user_password, grade, usetime): self.name = name self.user_name = user_name self.user_password = user_password self.grade = grade self.usetime = usetime # 基本功能都由这个类的方法实现 class Manage: def __init__(self): self.StudentInfo = [] self.ProblemInfo = [] @staticmethod def main_menu(): print("***************") print("1.管理员端登录") print("2.学生端登录") print("3.注册学生端账户") print("4.退出系统") print("***************") @staticmethod def administrator_menu(): print("***************") print("1.录入试题信息") print("2.查看学生信息") print("3.排名学生成绩") print("4.查看试题信息") print("5.分析总体答题情况") print("6.删除学生信息") print("7.删除试题信息") print("8.返回上级") print("***************") @staticmethod def student_menu(): print("***************") print("1.开始答题") print("2.返回上级") print("***************") @staticmethod def log_in(): psw = int(input("请输入管理员密码")) if psw == 123456: Manage.administrator_menu() while 1: operate_administrator = int(input("请输入要选择的操作")) if operate_administrator == 1: Manage.add_problem(start) Manage.administrator_menu() if operate_administrator == 2: Manage.show_student(start) if operate_administrator == 3: Manage.rank_student(start) if operate_administrator == 4: Manage.show_problem(start) if operate_administrator == 5: Manage.analysis_student(start) if operate_administrator == 6: Manage.del_student(start) if operate_administrator == 7: Manage.del_problem(start) if operate_administrator == 8: Manage.main_menu() return else: print("账号或密码错误,已返回上级!") Manage.main_menu() def register(self): print("***************") new_student = Student(name=input("输入你的用户名"), user_name=input("输入你的账号"), user_password=input("输入你的密码"), grade="暂无成绩", usetime="暂无信息") temp = {"用户名": new_student.name, "账号": new_student.user_name, "密码": new_student.user_password, "成绩": new_student.grade, "答题时间": new_student.usetime} # 这里的new_student不能直接传入列表,要放在一个字典里把数据”打包“过去 self.StudentInfo.append(temp) print("注册成功!") self.save_information() self.main_menu() def student_login(self): print("***************") temp1 = input("请输入你的账号") temp2 = input("请输入你的密码") if len(self.StudentInfo) == 0: # 如果学生信息为空,说明还没有账号注册,当作账号或密码错误处理 print("账号或密码错误!已返回上级") self.main_menu() return for stu in self.StudentInfo: # 循环遍历列表判断账号和密码是否正确 if stu["账号"] == temp1 and stu["密码"] == temp2: print("登录成功!欢迎你%s同学" % (stu["用户名"])) self.student_menu() while 1: operate_student = int(input("请输入要选择的操作")) if operate_student == 1: self.test_begin(stu["用户名"]) self.main_menu() return if operate_student == 2: self.main_menu() return else: print("账号或密码错误!已返回上级") self.main_menu() def add_problem(self): new_problem = Problem(num=input("输入题号"), question=input("输入题目"), choice_a=input("输入选项A"), choice_b=input("输入选项B"), choice_c=input("输入选项C"), choice_d=input("输入选项D"), answer=input("输入正确答案")) temp = {"题号": new_problem.num, "题目": new_problem.question, "选项A": new_problem.choice_a, "选项B": new_problem.choice_b, "选项C": new_problem.choice_c, "选项D": new_problem.choice_d, "正确答案": new_problem.answer} self.ProblemInfo.append(temp) # 和学生信息一样,试题信息也要打包在一个字典里面后添加到列表 print("录入成功!") self.save_information() def del_student(self): user_name = input("输入要删除的学生账号") index = 0 for stu in self.StudentInfo: if stu["账号"] == user_name: del self.StudentInfo[index] self.save_information() print("删除成功") self.administrator_menu() return index += 1 print("未查询到学生信息!") self.administrator_menu() return def del_problem(self): num = input("输入要删除的题目题号") index = 0 for pro in self.ProblemInfo: if pro["题号"] == num: del self.ProblemInfo[index] self.save_information() print("删除成功") self.administrator_menu() return index += 1 print("未查询到试题信息!") self.administrator_menu() return def show_student(self): if len(self.StudentInfo) == 0: print("暂无学生信息") self.administrator_menu() return for stu in self.StudentInfo: print(stu) input("按任意键继续") self.administrator_menu() return def show_problem(self): if len(self.ProblemInfo) == 0: print("暂无试题信息") for pro in self.ProblemInfo: print("%s:%s\n" "A.%s\n" "B.%s\n" "C.%s\n" "D.%s\n" "正确答案:%s" % (pro["题号"], pro["题目"], pro["选项A"], pro["选项B"], pro["选项C"], pro["选项D"], pro["正确答案"])) input("按任意键继续") self.administrator_menu() return def test_begin(self, name): # 答题功能的主要功能由循坏遍历列表和time模板实现 if len(self.ProblemInfo) == 0: print("暂无试题信息") self.student_menu() return grade = 0 print("Test Begin!") start_time = time.time() for pro in self.ProblemInfo: print("%s:%s\n" "A.%s\n" "B.%s\n" "C.%s\n" "D.%s\n" % (pro["题号"], pro["题目"], pro["选项A"], pro["选项B"], pro["选项C"], pro["选项D"])) answer = input("输入你的答案") if answer == pro["正确答案"]: grade += 5 end_time = time.time() for stu in self.StudentInfo: if stu["用户名"] == name: stu["成绩"] = str(grade) stu["答题时间"] = str(int((end_time - start_time))) break print("Test Over!\n你的成绩是%d分,用时%d秒" % (grade, end_time - start_time)) self.save_information() return def rank_student(self): if len(start.StudentInfo) == 0: print("暂无学生信息") return tool = self.StudentInfo for del_zero in tool: if del_zero["成绩"] == "暂无成绩": del_zero["成绩"] = -1 temp = sorted(tool, key=lambda x: int(x["成绩"]), reverse=True) rank = 1 for stu in temp: if stu["成绩"] == -1: stu["成绩"] = "暂无成绩" print("第%d名:%s %s分 用时%s秒" % (rank, stu["用户名"], stu["成绩"], stu["答题时间"])) rank += 1 input("按任意键继续") self.administrator_menu() return def analysis_student(self): # 分析参加考试的人数,平均分 if len(self.StudentInfo) == 0: print("暂无答题信息") self.administrator_menu() return print("本次测试有%d道题目" % (len(self.ProblemInfo))) print("满分%d分" % (len(self.ProblemInfo) * 5)) student_num = 0 total = 0 for stu in self.StudentInfo: if stu["成绩"] == "暂无成绩": continue total += int(stu["成绩"]) student_num += 1 if student_num == 0: print("暂无答题信息") self.administrator_menu() return print("参与测试%d人" % student_num) print("平均分:%0.2f" % (total / student_num)) input("按任意键继续") self.administrator_menu() return def save_information(self): # 以字符串的数据类型向文件中写入 with open("StudentInfo.txt", "w", encoding="utf_8") as fp: for stu in self.StudentInfo: fp.write(stu["用户名"]) fp.write(",") fp.write(stu["账号"]) fp.write(",") fp.write(stu["密码"]) fp.write(",") fp.write(stu["成绩"]) fp.write(",") fp.write(stu["答题时间"]) fp.write(",") fp.close() # 写入的时候数据之间用”,“分割开,读取的时候再用split函数分割分别读取 with open("ProblemInfo.txt", "w", encoding="utf_8") as fp1: for pro in self.ProblemInfo: fp1.write(pro["题号"]) fp1.write(",") fp1.write(pro["题目"]) fp1.write(",") fp1.write(pro["选项A"]) fp1.write(",") fp1.write(pro["选项B"]) fp1.write(",") fp1.write(pro["选项C"]) fp1.write(",") fp1.write(pro["选项D"]) fp1.write(",") fp1.write(pro["正确答案"]) fp1.write(",") fp1.close() return def read_information(self): if not os.path.exists("StudentInfo.txt"): print("暂无学生信息,跳过读取!") else: with open("StudentInfo.txt", "r", encoding="utf_8") as fp: stu = fp.read() stu = stu.split(",") # 文件的字符串split后变成列表类型,再通过列表循环读取,每次读取一批数据打包成一个字典,再append到程序当前存储信息的列表中 stu.pop() for i in range(len(stu) // 5): stu_pass = {"用户名": stu[5 * i + 0], "账号": stu[5 * i + 1], "密码": stu[5 * i + 2], "成绩": stu[5 * i + 3], "答题时间": stu[5 * i + 4]} self.StudentInfo.append(stu_pass) fp.close() print("学生信息读取成功!") if not os.path.exists("ProblemInfo.txt"): print("暂无试卷信息,跳过读取!") else: with open("ProblemInfo.txt", "r", encoding="utf_8") as fp1: pro = fp1.read() pro = pro.split(",") pro.pop() for j in range(len(pro) // 7): pro_pass = {"题号": pro[7 * j + 0], "题目": pro[7 * j + 1], "选项A": pro[7 * j + 2], "选项B": pro[7 * j + 3], "选项C": pro[7 * j + 4], "选项D": pro[7 * j + 5], "正确答案": pro[7 * j + 6]} self.ProblemInfo.append(pro_pass) fp1.close() print("试卷信息读取成功!") start = Manage()