You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

348 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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