实训案例1 学生成绩管理系统 1.1 功能介绍 学生成绩管理系统用于实现对学生基本信息的管理,主要包括以下功能。 (1)输入并存储学生信息:输入学生的学号、姓名和分数,把数据保存在创建的 students.txt文件中。 (2)打印学生信息:通过打印函数把学生的所有信息打印在屏幕上。 (3)修改学生信息:通过查询功能查询某学生是否存在,如果存在就对该学生的信息 进行修改,如果不存在则返回到主界面。 (4)删除学生信息:对相应的学生进行删除操作,如果某学生存在就查找并进行删除。 (5)按学生成绩进行排序:按照学生的总分从高到低进行排序。 (6)查找学生信息:输入学生的学号,查找该学生的相关信息,如果查找到就输出该学 生的信息,如果没有查找到则提示输入的学号不存在。 1.2 程序设计的思路 将学生信息设计成一个Student类,这里假设学生有语文、数学和英语三门课的成绩。 class Student: #定义一个学生类 def _ _init_ _(self): self.name = " self.ID =" self.score1 = 0 #语文成绩 self.score2 = 0 #数学成绩 self.score3 = 0 #英语成绩 self.sum = 0 #总分 学生成绩管理系统在开始使用之前先进行初始化,判断students.txt文件中是否保存 了学生的信息,如果保存了就把文件的内容读取出来,供接下来的操作使用;如果没有保存 就初始化一个空的列表,用来保存用户的输入,程序中接下来的所有数据都会保存在该列 表中。在 对学生基本信息进行操作(包括查找、修改、删除、排序)时,首先打开students.txt文 1 56 件,对文件中的内容进行读取操作,由于在文件中保存的内容是以空格进行分隔的,并且每 个学生的信息占用一行,所以读出所有的内容,先通过换行进行分隔,得到每个学生的信息, 然后对每个学生的信息以空格进行分隔,得到每个学生的详细信息,包括学生的姓名、学号、 成绩,形成学生类对象并存入stulist列表中。对学生基本信息的所有操作都是针对stulist 列表进行的,如果是添加学生,则追加写入文件中;如果是删除和修改学生,则在操作完成后 将stulist列表覆盖写入文件中。 1.3 程序设计的步骤 1.设计Student类。将学生信息设计成一个Student类,存储学生的语文、数学和英语 成绩。在该类中定义计算总分的方法。 class Student: #定义一个学生类 def _ _init_ _(self): self.name =" self.ID =" self.score1 = 0 #语文成绩 self.score2 = 0 #数学成绩 self.score3 = 0 #英语成绩 self.sum = 0 #总分 def sumscore(self): #计算总分 self.sum=self.score1 + self.score2 + self.score3 def input(self): #输入学生的信息 self.name = input("请输入学生的姓名: ") self.ID = input("请输入学生的ID: ") self.score1 = int(input("请输入学生的语文成绩: ")) self.score2 = int(input("请输入学生的数学成绩: ")) self.score3 = int(input("请输入学生的英语成绩: ")) self.sumscore() def output(self,file_object): #输出到文件中 print(self.name,self.ID, self.score1, self.score2, self.score3, self.sum) file_object.write(self.ID) file_object.write(" ") file_object.write(self.name) file_object.write(" ") file_object.write(str(self.score1)) file_object.write(" ") file_object.write(str(self.score2)) file_object.write(" ") file_object.write(str(self.score3)) file_object.write(" ") file_object.write(str(self.sum)) file_object.write("\n") 2.设计功能函数。 (1)添加学生信息。在添加一个学生信息时,首先判断学号是否已经存在,如果已经存 在则取消添加操作;否则由用户选择是否保存,如果保存则以追加方式写入文件。 1 57 def Add(stulist,stu): #添加一个学生信息 if searchByID(stulist, stu.ID) == True: #判断学号是否存在 print("学号已经存在!") return False print("是否要保存学生信息?") nChoose = input("Choose Y/N") if nChoose == 'Y' or nChoose == 'y': stulist.append(stu) #加入列表 print(stu.name,stu.ID, stu.score1, stu.score2, stu.score3, stu.sum) file_object = open("students.txt", "a") #"a"为追加方式 stu.output(file_object) #输出到文件中保存 file_object.close() print("保存成功!") (2)删除学生信息。在删除一个学生信息时,首先遍历stulist列表中学生的ID是否为 要删除的学号,如果是则从stulist列表中删除,然后采用覆盖写入方式将stulist列表中的 剩余学生重新写入文件。 def Del(stulist, ID): #删除一个学生信息 count = 0 flag=False for item in stulist: if item.ID == ID: stulist.remove(item) #从列表中删除 flag=True #删除成功 break count +=1 if flag==False: #或者count == len(stulist) print("没有该学生学号!") return file_object = open("students.txt", "w") #覆盖写入 for stu in stulist: stu.output(file_object) print("删除保存成功!") file_object.close() (3)修改学生信息。在修改一个学生信息时,首先遍历stulist列表中学生的ID是否为 要修改的学号,如果是则输入这个被修改学生的新信息,添加此学生到文件中。 def Change(stulist, ID): #修改学生信息 count = 0 flag=False for item in stulist: if item.ID == ID: flag=True stulist.remove(item) file_object = open("students.txt", "w") for stu in stulist: 1 58 stu.output(file_object) file_object.close() if flag==False: print("没有该学生学号!") return #输入这个被修改学生的新信息 stu = Student() stu.input() Add(stulist,stu) #添加stu 学生信息到文件中 (4)显示所有学生信息。这里指将stulist列表中的学生信息打印到屏幕上。 def display(stulist): #显示所有学生信息 print("学号\t 姓名语文数学英语总分") for item in stulist: #print(item.ID, '\t' ,item.name,'\t', item.score1,'\t',item.score2, '\t', item.score3, '\t',item.sum) #格式化输出 print( "%5s%5s%3d %3d %3d %4d"%(item.ID, item.name, item.score1, item. score2, item.score3,item.sum)) (5)成绩排序。成绩排序指按学生成绩由高至低进行排序,在实现的时候使用比较排 序算法,按照总分对stulist中保存的学生信息进行排序。 def Sort(stulist): #按学生成绩排序 insertSort(stulist) #比较排序 display(stulist) def insertSort(stulist): #比较排序 for i in range(len(stulist)-1): for j in range(i+1,len(stulist)): if stulist[i].sum