1.需求分析
使用Python语言,在Python3.9上设计一个简易的学生成绩管理系统。能够实现学生成绩信息的保存和读取(使用数据库对数据进行存取)。实现所有相关姓名、学号、各科成绩的输入、输出、查找、删除、修改等功能,并通过xlrd和xlwt模块读取和写入Excel文件。
2.系统基本简介
在数据结构上,我采用以下数据结构,即:
score1 = { "姓名":"XXX",
"学号":"XXX",
"作业" : [X,X, X,X],
"测验" : [X,X],
"实验" : [X,X] ,
"分数" :X
}
没有增加新的字段比如排名之类的。这样做的主要是考虑到排名、平均成绩等均可以由上述结构中的信息计算出来,而且也可以避免因为一个某个成绩变动,导致一系列的数据需要重新计算。
在存储在结构上,我采用了Python中常用的列表作为此程序的“数据库”,因为列表操作起来还是非常方便的。在列表中的所有数据实体都是按照成绩高低进行排序的。
文件保存和读取时,采取CSV格式的数据文件。文件头遵循:['序号','姓名','学号','分数','排名','作业1','作业2','作业3','作业4', '测验1', '测验2', '实验1', '实验2']这种格式。
运行环境:采用的是Windows 10 x64位操作系统+anaconda(Python3.9)+Spyder,默认情况下即可运行,不需要安装其他库。
3.程序说明
3.0 主界面
整个程序的主界面如下。
3.1添加学生信息
在添加学生信息中,在实现了手动添加信息的基础上,我又增加了从文件中导入信息的功能。不过在添加信息这块,我规定:在添加学生信息时,如果系统中已经存在该学生的学号,则不能重复添加。这两种方式都遵循该原则,以保证学号的唯一性。
在添加学生信息时,为了保证有序性,所以我采取了插入排序的方式进行添加,代码如下:
# 根据优先级[分数、作业平均、测验平均、实验平均]比较s1是否优于s2
def cmp_student(s1, s2):
if s1["分数"] != s2["分数"]:
return s1["分数"] > s2["分数"]
else:
if np.mean(s1["作业"]) != np.mean(s2["作业"]):
return np.mean(s1["作业"]) > np.mean(s2["作业"])
else:
if np.mean(s1["测验"]) != np.mean(s2["测验"]):
return np.mean(s1["测验"]) > np.mean(s2["测验"])
else:
return np.mean(s1["实验"]) > np.mean(s2["实验"])
# 根据分数大小,将学生信息插入到列表中,插入排序
def add_to_list(stu, stu_list):
if len(stu_list):
if cmp_student(stu, stu_list[0]): # 比第一名还优秀
stu_list.insert(0,stu)
elif not cmp_student(stu, stu_list[-1]): # 比最后一名还差
stu_list.append(stu)
else:
for i in range(len(stu_list)-1):
if (not cmp_student(stu, stu_list[i])) and (cmp_student(stu, stu_list[i+1])):
stu_list.insert(i+1, stu)
return
else:
stu_list.append(stu)
手动添加时,逐个输入学生的信息,最后按照分数插入到相应的位置,注意的是,需要保证在输入成绩时确保获取的是数字,否则提示错误需要用户重新输入,代码如下:
# 输入一个数字
def input_number(information):
while True: