#定义学生类型 姓名、学号、科目
class Student:
def __init__(self, id1,name,python_input,c_score_input,math_input, foreign_language_input):
self.ID=id1
self.name=name
self.python =python_input
self.math = math_input
self.foreign_language = foreign_language_input
self.C=c_score_input
def __str__(self):
return f"学号:{self.id}\n总分:{self.total()}\n"
#计算它自己的总成绩
def total(self):
return self.python+ self.math + self.foreign_language+self.C
# 查询函数
def query():
def menu():
print("\t\t\t\t\t\t\t-------------------------------")
print("\t\t\t\t\t\t\t 欢迎进入查询模块 ")
print("\t\t\t\t\t\t\t------------------------------ ")
print("\t\t\t\t\t\t\t 1.查询单个学生成绩 ")
print("\t\t\t\t\t\t\t 2.查询所有学生成绩 ")
print("\t\t\t\t\t\t\t 3.查询不及格名单 ")
print("\t\t\t\t\t\t\t 4.查询班级平均成绩 ")
print("\t\t\t\t\t\t\t 5. 退出模块 ")
print("\t\t\t\t\t\t\t------------------------------")
#功能1
def single():
global Data
print("\t\t\t\t\t\t\t查看学员成绩:")
print()
# 列表生成式
b = [i.ID for i in Data]
# 判断该生是否存在
while 1:
id_input = input("\t\t\t\t\t\t\t请输入学号:")
if id_input in b:
break
print('\t\t\t\t\t\t\t该生信息不存在,请重新输入!')
# 过滤函数+匿名函数
a = list(filter(lambda i: i.ID == id_input, Data))[0]#注意这个[0]
print("\t\t\t\t\t\t\t学号:{:} 姓名:{:}".format(a.ID,a.name))
print("\t\t\t\t\t\t\tpython成绩:{:} C语言:{:} 高等数学:{:} 外语:{}".format(a.python,a.C,a.math,a.foreign_language))
print("\t\t\t\t\t\t\t",end="")
if a.python<60:
print("python成绩不及格",end=" ")
if a.foreign_language<60:
print("外语成绩不及格",end=" ")
if a.math<60:
print("数学成绩不及格",end=" ")
if a.C<60:
print("C语言成绩不及格",end=" ")
print()
#功能2
def all():
global Data
for i in Data:
print("\t\t\t\t\t\t\t学号:{:} 姓名:{:}".format(i.ID,i.name))
print("\t\t\t\t\t\t\tpython成绩:{:} C语言:{:} 高等数学:{:} 外语:{}".format(i.python,i.C,i.math,i.foreign_language))
print()
# 查看不及格名单
def failed():
math_f = []
python_f = []
foreign_language_f= []
c_f=[]
global Data
for i in Data:
if i.math < 60:
math_f.append([i.ID,i.name,i.math])
if i.python < 60:
python_f.append([i.ID,i.name,i.python])
if i.foreign_language < 60:
foreign_language_f.append([i.ID,i.name,i.foreign_language])
if i.C < 60:
c_f.append([i.ID,i.name,i.C])
print("\t\t\t\t\t\t\t高等数学不及格名单:")
for i in math_f:
print("\t\t\t\t\t\t\t学号:{} 姓名:{} 成绩:{}".format(i[0],i[1],i[2]))
print()
print("\t\t\t\t\t\t\tC语言不及格名单:")
for i in c_f:
print("\t\t\t\t\t\t\t学号:{} 姓名:{} 成绩:{}".format(i[0], i[1], i[2]))
print()
print("\t\t\t\t\t\t\tPython不及格名单:")
for i in python_f:
print("\t\t\t\t\t\t\t学号:{} 姓名:{} 成绩:{}".format(i[0],i[1],i[2]))
print()
print("\t\t\t\t\t\t\t外语不及格名单:")
for i in foreign_language_f:
print("\t\t\t\t\t\t\t学号:{} 姓名:{} 成绩:{}".format(i[0],i[1],i[2]))
#平均数查询
def average():
global Data
c_score=[]
python=[]
math=[]
foreign_language=[]
num=len(Data)
for i in Data:
c_score.append(i.C)
python.append(i.python)
math.append(i.math)
foreign_language.append(i.foreign_language)
print("\t\t\t\t\t\t\t------------------------")
print("\t\t\t\t\t\t\t 班级平均成绩 ")
print("\t\t\t\t\t\t\t 高等数学:%.2f "%(sum(math)/num))
print("\t\t\t\t\t\t\t C语言:%.2f "%(sum(c_score)/num))
print("\t\t\t\t\t\t\t Python:%.2f "%(sum(python)/num))
print("\t\t\t\t\t\t\t 外语:%.2f "%(sum(foreign_language)/num))
print("\t\t\t\t\t\t\t-------------------------")
#主区域:
menu()
times=0
while 1:
if times>=2:
print("\t\t\t\t\t\t\t按8可以查看菜单")
print()
times=0
print()
choose=eval(input("\t\t\t\t\t\t\t选择:"))
print()
if choose == 1:
single()
times+=1
elif choose == 2:
all()
times+=1
elif choose==3:
failed()
times+=1
elif choose==4:
average()
times+=1
elif choose==8:
menu()
times+=1
else:
break
#菜单
def menu_select():
print("""
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ ヾ(≧▽≦*)o ~hello
✨----欢迎使用成绩管理系统-----✨
✨-+------------------------+-✨ (*^▽^*)按下对应的键位即可~
✨ 1.进入信息管理模块 ✨
✨----------------------------✨ ( ̄▽ ̄)"信息管理就是存入或删除学生学号姓名之类的
✨ 2.进入信息排序模块 ✨
✨----------------------------✨ (^∀^●)ノシ按学号或科目排序啦
✨ 3.进入信息查询模块 ✨
✨----------------------------✨ (/▽\)查询平均成绩、不及格名单啦
✨ 4. 退 出 系 统 ✨
✨-+------------------------+-✨ (~ ̄▽ ̄)~ 按4可以退出系统啦~
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
""")
#信息管理
def student_manage():
#增加信息
def record():
global Data
#列表生成式
b = [i.ID for i in Data]
while 1:
id_input = input("\t\t\t\t\t\t\t请输入学号:").strip()#移除输入数字之前的0比如001 移除之后就是1
# 检测重复输入学号
if id_input not in b:
break
print('\t\t\t\t\t\t\t该生信息已存在,请重新输入!')
name=input("\t\t\t\t\t\t\t姓名:")
python = int(input("\t\t\t\t\t\t\tpython成绩:"))
c_score=eval(input("\t\t\t\t\t\t\tC语言成绩:"))
math = int(input("\t\t\t\t\t\t\t高等数学成绩:"))
foreign_language = int(input("\t\t\t\t\t\t\t外语成绩:"))
Data.append(Student(id_input,name,python,c_score,math,foreign_language))
print("\t\t\t\t\t\t\t添加成功!")
#删除学生信息
def delete():
global Data
b = [i.ID for i in Data]
while 1:
id_input = input("\t\t\t\t\t\t\t请输入学号:")
if id_input in b:
break
print('\t\t\t\t\t\t\t该生信息不存在,请重新输入!')
#匿名函数+筛选元素构成新列表,用新列表替换旧列表
a = list(filter(lambda i: i.ID != id_input, Data))
#替换
Data = a
print("\t\t\t\t\t\t\t删除成功!")
#子菜单
def menu():
print("\t\t\t\t\t\t\t-------------------------------")
print("\t\t\t\t\t\t\t 欢迎进入学生信息管理模块 ")
print("\t\t\t\t\t\t\t------------------------------ ")
print("\t\t\t\t\t\t\t 1. 添加学生信息 ")
print("\t\t\t\t\t\t\t 2. 删除学生信息 ")
print("\t\t\t\t\t\t\t 3. 退出模块 ")
print("\t\t\t\t\t\t\t------------------------------")
menu()
while 1:
print()
choose=eval(input("\t\t\t\t\t\t\t选择:"))
print()
if choose==1:
record()
elif choose==2:
delete()
elif choose==8:
menu()
else:
break
#单科成绩排序、学号排序
def sort_made():
def menu():
print("\t\t\t\t\t\t\t-------------------------------")
print("\t\t\t\t\t\t\t 欢迎进入排列模块 ")
print("\t\t\t\t\t\t\t------------------------------ ")
print("\t\t\t\t\t\t\t 1. 按学号排列 ")
print("\t\t\t\t\t\t\t 2. 按单科成绩排列 ")
print("\t\t\t\t\t\t\t 3. 退出模块 ")
print("\t\t\t\t\t\t\t------------------------------")
menu()
global Data
times=0
while 1:
if times>=2:
print("\t\t\t\t\t\t\t按8可以显示菜单")
print()
times=0
print()
choose=eval(input("\t\t\t\t\t\t\t请选择:"))
if choose==1:
Data=sorted(Data,key=lambda x:eval(x.ID))
times+=1
elif choose==2:
subject=input("\t\t\t\t\t\t\t请输入科目:")
times+=1
if subject=="高等数学"or subject=="数学":
Data=sorted(Data,key=lambda x:x.math,reverse=True)
if subject=="外语":
Data = sorted(Data, key=lambda x: x.foreign_language,reverse=True)
if subject=="Python":
Data = sorted(Data, key=lambda x: x.python,reverse=True)
if subject=="C语言":
Data = sorted(Data, key=lambda x: x.C,reverse=True)
elif choose==8:
menu()
else:
break
#起始
from random import randint
#提前创建对象0=99号 作用调试程序
Data=[]
for i in range(0,11):
Data.append(Student(f"{i}","student"+ str(i), randint(40, 100), randint(50, 100),randint(30,100),randint(50,100)))
# print(Data[i].ID)
#截止
#主函数
def main():
menu_select()
times=0
while 1:
if times>=2:
print("\t\t\t\t\t\t\t按8可显示主菜单")
print()
times=0
print()
choose=eval(input("\t\t\t\t\t\t\t请输入:"))
print()
if choose==1:
student_manage()
times+=1
elif choose==2:
sort_made()
times+=1
elif choose==3:
query()
times+=1
elif choose==4:
break
elif choose==8:
menu_select()
if __name__=="__main__":
main()
我们设计了主菜单和子菜单。主菜单能大概说明系统功能,子菜单能细说系统功能。我在主菜单中写入了,以下内容:
一、 信息管理模块
二、 信息排序模块
三、 信息查询模块
用户进入模块后会有子菜单弹出,来进一步向用户阐明该系统的功能。比如,用户进入了信息管理模块,子菜单就会有一下内容:
一、 添加学生信息
二、 删除学生信息
三、 退出模块
用户看完这些内容,就知道主菜单各模块的意义,也能够进一步理解主菜单想表达的意思。当然为了方便用户在主菜单进行选择时不感到迷茫,我们在主菜单的右侧进行了趣味的批注,这样批注增加了整个程序趣味性,用户使用我们程序的次数也会有所提高。不过为了不让其他成员编写模块时任意指定功能顺序,我们把子菜单都放入各个模块当中。至于主菜单的外观,我们使用了有趣的符号来进行构架,让整个程序亮闪闪的,简约而不简单。
创建学生类,实例属性有学号、姓名、科目成绩,其中的科目仅有四科,高等数学、C语言、Python和外语。为了方便后面调用对象的属性,我们尽量地把各属性的名字编写的容易记住,我们把学号,姓名,外语成绩,数学成绩,Python成绩,C语言成绩分别用ID,name,foreign_language,math,python,C来表示。为了不让单独调用对象时显得单调,我们在对象中定义了一个__str__方法,来打印他的学号和总分。
(一)学生信息添加函数:
输入函数,负责让用户输入学生的学号、姓名、成绩来创建一个学生对象,并将该对象添加到一个空的列表中,我们把这个装满对象的列表取名为Data,让其他成员在编写时知道这是一个很重要的数据。
实现列表添加对象的代码为:
Data.append(Student(id_input,name,python,c_score,math,foreign_language))
当然为了安全起见,不让用户下次输入重复的学号,我们需要在函数的开头先生成一个装满学生学号的列表,具体代码实现:b = [i.ID for i in Data]
之后我们会使用while 1 语句来判断用户输入的学号是否在列表b中,如果是则会给用户相应的警告“该生已存在”,如果不是用户可以进行姓名和成绩的输入,这样下来信息输入函数就算是完成了。
(二)学生信息删除函数:
删除函数的设计,我们采用的是以新换旧的方式,也就是将用户指定的元素除外,把剩余的元素全部转移到一个空的列表当中,然后再用这个新得到的列表代替整个学生对象列表Data,由于学号的指向性强,所以我们需要让用户输入学号,并通过筛选学号来得到新的列表。
具体代码实现:
a = list(filter(lambda i: i.ID != id_input, Data))
当然为防止用户指定学生对象列表DaTa中不存在的,我们还需要提前把学生对象列表Data中的对象的学号全部拷贝到一个新的列表当中,使用while 1语句并加入判断使用户能够指定正确且存在的元素,比如当用户输入001时,而我们的列表中没有这个学号,之后程序弹出警告,让用户重新输入,直到用户输入成功为止。
设计排序函数时,需要用到学生对象列表Data,所以需要在函数内部声明全局变量Data(global Data)。在排序函数中,我设计了一个菜单方便用户在排序函数中进行操作,为了用户一直使用,这里采取了while 1语句,之后使用if-elif-else语句来让用户完成选择功能,例如:当用户输入1时,则对应的功能是按学号排序,在考虑排序时使用sorted函数,针对用户的不同要求,按照对象的不同属性进行排序的,例如按照数学的成绩进行排序通过语句:
Data=sorted(Data,key=lambda x:x.math)
按照学号进行排序通过语句:
Data=sorted(Data,key=lambda x:eval(x.ID))
当然整个程序是为了适应用户,所以在用户选择按科目进行排序时,多加入了一些判定条件的运行,如: if choose==”高等数学”or”数学”这样的语句来贴合用户。这就好比输入法的纠错功能,都是为了满足用户输入的要求。
(一)查询全部学生信息函数:
查询多个学生成绩,即把学生对象列表Data中的对象通过for循环全部遍历,然后把所有对象的所有属性全部打印出来。
(二)查询单个学生信息函数:
查询单个学生成绩,需要筛选列表Data,把那个学生单独放在一个新的列表当中然后,打印把该对象的所有属性全部打印出来,除此之外,我们还在里边加入不及格判断,判断该对象的成绩属性是否超过六十,没有超过六十的会被打印出来视作不及格,比如:print(“python成绩不及格”,end=" "),为了安全,防止用户在输入不存在的学号,我们需要把列表Data中学生的学号全部放在一个新的列表中,来核对用户输入的学号,是否存在。
(三)学生不及格成绩输出:
实现不及格输出,我们考虑了两种思路,以数学为例,一种是遍历列表Data,判断出数学科目不及格的对象,然后把这些对象装入记录数学科目不及格的列表中最后单独打印这些对象的属性(学号、姓名、成绩),另一种是直接遍历列表Data,然后判断出数学不及格的对象,最后直接把对象的属性输出来。两种方法都可取,为了增加代码的可读性,这里采取了第一种方式,也就是多建立了四个列表来存储不及格的名单,最后分别把他们的各个属性打印出来。
(四)计算班级平均成绩:
模块的最后一步,计算平均数,我们依旧是通过for循环遍历列表Data,的各对像的成绩,比如外语成绩就放进外语列表中,数学成绩就放入数学列表中……。最后分别对各科列表求和然后除以列表Data总长度也就是班级总人数,获取平均数。
终于来到了整个程序的尾声,请把灯光转向主函数。主函数很简单,通过菜单函数,引导用户输入,之后判断用户输入的值,来进入相应的模块,用户每执行一次操作,我们会记数一次,超过两次会提醒用户按“8”打开菜单,之后计数清零,再次等待用户执行两次操作。其实主函数的一直都在python中,只是他一直很低调,没把自己的名字展现出来,就像那些抗“疫”的无名英雄,等某天我们的孩子问我们?“为何世界这样斑斓?”我们只能微笑着说一句“因为有他们”。
本程序圆满完成任务,最开始我们计划是考虑用字典内嵌列表的形式来存储信息,但考虑到后期的排序,我们就放弃了这个选择,然后又想出了字典内嵌字典的形式,发现更不可取,最终选择了面向对象的方式来存储信息。本系统很多地方用到了匿名函数和列表推导式 ,能使程序变得更简洁。总的来说,这个系统有待我们进一步扩展下去,让其交互性变得更好!
附上程序概括流程图: