|
|
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()
|