学生成绩管理系统|Python小应用练习

题目要求

实现学生成绩管理系统
输入学生成绩信息序列,获得成绩从高到低、从低到高、按某一门成绩的排列,相同成绩都按先录入排列在前的规则处理
数据如下:(数据规则:学生姓名 高数成绩 英语成绩 大物成绩)
SanZhang 70 80 61
SiLi 86 77 81
WuWang 88 90 77
MingLi 60 77 81
MiWang 71 70 60
HaiLi 88 78 89
HeWang 70 90 80
LiWang 67 71 70
输出:利用字典容器,完成对于每个学生成绩数据的储存,并将所有学生储存于列表中;在此基础上,
按照总分从高到低的学生名单,总分从低到高的学生名单,三门课成绩从高到低的学生名单。
给出具体的排序结果、涉及的代码,以及简要介绍自己设计的排序算法原理

摘要

通过实现Student_score_info_list类,完成本次大作业要求的所有方法。

该成绩管理系统介绍:

题目要求的功能:

  • 通过实现Student_score_info_list类,对每个学生的成绩数据进行存储(使用列表这个数据结构)每个列表里面的元素类型为字典类型(哈希表),字典存储了学生姓名,以及三个科目的成绩。

  • 另外通过print_info_list_by_method方法,按照题目不同排序要求进行数据的打印。

额外实现的功能:

  • 可以对学生成绩的进行增、删、查、改的操作
  • 提供学生成绩管理系统的菜单界面 – 可以根据用户选择进行相对应的操作
  • 可以动态管理学生成绩 – 不局限于固定好的输入

关于排序算法:

  • 提供了一种高效的排序方式,归并排序(为什么选择归并排序的原因将在后续解释)

输入学生信息

提供start_working()类方法,调用menu()方法,根据用户输入进行相对应操作。

用户选择1表示增加学生成绩信息,此时利用进入条件语句后输入相对应名字,成绩等信息后,调用add_student_info方法,传入Person(type:dict)即可以完成学生成绩的添加。

代码如下:

def menu(self): # 菜单
        print("*********************")
        print("------- 目录 --------")
        print("------ 1.add --------")
        print("------ 2.del --------")
        print("------ 3.search -----")
        print("------ 4.modify -----")
        print("------ 5.print ------")
        print("*********************")
        print("现在已经有",len(self.stu_info_list),"位学生的成绩")
def start_working(self):  # 学生成绩管理系统开始运行
        while True:
            self.menu()
            sec=int(input("请输入:>"))
            if sec==1:
                # 添加学生信息
                person={}
                name=input("请输入名字:>")
                person['name']=name
                Advanced_Mathematics=int(input("请输入高数成绩:>"))
                person['Advanced_Mathematics']=Advanced_Mathematics
                English=int(input("请输入英语成绩:>"))
                person['English']=English 
                College_Physics=int(input("请输入大学物理成绩:>"))
                person['College_Physics']=College_Physics 
                person['total_score']=Advanced_Mathematics+English+College_Physics
                print("添加成功!")
                print()
                self.add_student_info(person)
            elif sec==2:
                # 删除学生成绩
                name=input("请输入要删除学生的名字:>")
                self.del_student_info(name)
                print()
            elif sec==3:
                name=input("请输入要查找学生的名字:>")
                self.search_student_info(name)
                print()
            elif sec==4:
                name=input("请输入要修改学生的名字:>")
                self.modify_student_info(name)
                print()
            elif sec==5:
                print("------- 打印方式 --------")
                print("---- 0.按照高数成绩降序 ----")
                print("---- 1.按照英语成绩降序 ----")
                print("---- 2.按照大物成绩降序 ----")
                print("---- 3.按照总分成绩降序 ----")
                print("---- 4.按照总分成绩升序 ----")
                sec=int(input("请选择:>"))
                self.print_info_list_by_method(sec)
                print()
            else:
                print("选择错误 -- 程序退出!")
                sys.exit()

以此类推看可以添加题目所要求的所有学生的成绩。

学生成绩的打印

通过调用print_info_list_by_method()方法,打印学生的成绩,可以根据用户的选择来调用相应的排序方式和打印方式。

首先先在Student_score_info_list中定义类属性

self.sort_method = ['Advanced_Mathematics', 'English', 'College_Physics',
                            'total_score']

这样处理可以使得我们调用相对应的排序方法时更加方便,直接处理该sort_method列表的下标即可。

start_working方法中定义菜单,让用户选择排序方式:

            elif sec==5:
                print("------- 打印方式 --------")
                print("---- 0.按照高数成绩降序 ----")
                print("---- 1.按照英语成绩降序 ----")
                print("---- 2.按照大物成绩降序 ----")
                print("---- 3.按照总分成绩降序 ----")
                print("---- 4.按照总分成绩升序 ----")
                sec=int(input("请选择:>"))
                self.print_info_list_by_method(sec)
                print()

定义print_info_list_by_method()方法

利用条件语句判断用户输入的整型,并调用排序函数(排序函数的具体实现将在后面解释)

为了使得打印学生成绩更加美观 – 采用pandas库中的DataFrame数据类型进行打印

    # 为了使得打印学生成绩更加美观 -- 采用pandas库中的DataFrame数据类型进行打印
    import pandas as pd
    def print_list(self):
        print("------------- 学生成绩 -------------")
        # 利用DataFrame打印会更好看一些
        df=pd.DataFrame(self.stu_info_list,index=None)
        print(df)
        print("------------- 学生成绩 -------------")    
    def print_info_list_by_method(self, sort_method_type):
        if sort_method_type == 0:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 0, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照高数排序
            pass
        elif sort_method_type == 1:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 1, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照英语排序
            pass
        elif sort_method_type == 2:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 2, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照大学物理排序
            pass
        elif sort_method_type == 3:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 3, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照总分排序 -- 降序
            pass
        elif sort_method_type == 4:
            class_sort = My_HeapSort_By_Student_score(
                self.stu_info_list, self.sort_method, 3, 1)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照总分排序 -- 升序
            pass

排序的具体实现

定义排序类:My_MergeSort_By_Student_score来封装排序算法

定义构造函数,所接受参数为:

  1. dict_list要排序的字典序列
  2. sort_method前面定义的字符序列
  3. sort_method_type排序类型(整型)
  4. Seq整型,1代表降序,0代表升序
class My_MergeSort_By_Student_score:
    def __init__(self, dict_list, sort_method, sort_method_type, Seq):
        self.key = sort_method[sort_method_type]  # key是str类型,决定按照什么排序
        self.Seq = Seq  # 决定升序还是降序
        self.dict_list = dict_list  # 待排序的字典序列
归并排序

效率可以达到O(nlogn)的常用排序有:快速排序,堆排序,归并排序。效率为O(n1.3)的排序为希尔排序。

按照题目要求:相同成绩都按先录入排列在前的规则处理。因此排序过程中,数值相等的变量的相对位置不能发生改变,因此一定要采用稳定的排序算法。
采用归并排序,它可以做到效率和稳定性兼顾。

归并排序的基本思想:

归并排序:
归并排序所用的核心思想就是分治!
归并排序(mergeSort)就是将已经有序的子序列合并,得到另一个有序的数列
归是归并的归,不是递归的归,归并排序就是合并排序
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

img

归并排序的实现方法由递归和循环两种方法
递归方法的源代码简单一些
循环方法的源代码复杂一些,但效率高

这里采用递归方法:

class My_MergeSort_By_Student_score:
    def __init__(self, dict_list, sort_method, sort_method_type, Seq):
        self.key = sort_method[sort_method_type]  # key是str类型,决定按照什么排序
        self.Seq = Seq  # 决定升序还是降序
        self.dict_list = dict_list  # 待排序的字典序列
    def mergeSort(self,arr,arrtmp,start,end):
        if start>=end: return
        mid=start+int((end-start)/2)
        istart1=start
        iend1=mid

        istart2=mid+1
        iend2=end
        self.mergeSort(arr,arrtmp,istart1,iend1)
        self.mergeSort(arr,arrtmp,istart2,iend2)
        # 开始归并
        i = start
        while istart1 <= iend1 and istart2 <= iend2:
            if arr[istart1][self.key]<arr[istart2][self.key]:
                arrtmp[i]=arr[istart1]
                istart1+=1
            else:
                arrtmp[i]=arr[istart2]
                istart2+=1
            i+=1
        while istart1<=iend1:
            arrtmp[i]=arr[istart1]
            i+=1
            istart1+=1
        while istart2<=iend2:
            arrtmp[i]=arr[istart2]
            i+=1
            istart2+=1
        # 把原来的数据拷贝回去
        for i in range(start,end+1):
            arr[i]=arrtmp[i]
    def sortArray(self):
        nums=self.dict_list
        if len(nums)<2:return nums
        arrtmp=[]
        for i in range(0,len(nums)):
            arrtmp.append(0)
        self.mergeSort(nums,arrtmp,0,len(nums)-1)
        if self.Seq==1:
            nums=nums.reverse()
        return nums

除题目要求额外实现的功能

删除学生信息
 elif sec==2:
                # 删除学生成绩
                name=input("请输入要删除学生的名字:>")
                self.del_student_info(name)
                print()
    # 查找算法还可以优化 -- 如果使用哈希表存储可以大大提高查找效率(在学生信息多的情况下)
    def del_student_info(self, name):  # 删除名为name的学生成绩
        # 暴力查找名字
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                self.stu_info_list.remove(self.stu_info_list[i])
                print("successfully removed!")
                if_removed = True
                return
        print("err,No information about the student!")
修改学生信息

暴力查找名字 – 找到之后输入新的成绩信息

def modify_student_info(self, name):  # 修改名为name的学生成绩
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                print("please modify the score info:")
                # 只允许修改分数,不允许修改名字
                new_total_score = 0
                new_score = int(input("Advanced_Mathematics:"))
                new_total_score += new_score
                self.stu_info_list[i]['Advanced_Mathematics'] = new_score
                new_score = int(input("English:"))
                new_total_score += new_score
                self.stu_info_list[i]['English'] = new_score
                new_score = int(input("College_Physics:"))
                new_total_score += new_score
                self.stu_info_list[i]['College_Physics'] = new_score
                # 更新总成绩
                self.stu_info_list[i]['total_score'] = new_total_score
                break
查找学生信息

查找算法和修改、删除其实一样,暴力遍历查找即可,找到之后打印信息,找不到则打印错误提示

    def search_student_info(self, name):  # 查找名为name的学生成绩
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                print("name:", self.stu_info_list[i]['name'])
                print("Advanced_Mathematics",
                      self.stu_info_list[i]['Advanced_Mathematics'])
                print("English", self.stu_info_list[i]['English'])
                print("College_Physics",
                      self.stu_info_list[i]['College_Physics'])
                print("total_score", self.stu_info_list[i]['total_score'])
                break
        print("err,No information about the student!")

学生成绩管理系统整体代码

class My_MergeSort_By_Student_score:
    def __init__(self, dict_list, sort_method, sort_method_type, Seq):
        self.key = sort_method[sort_method_type]  # key是str类型,决定按照什么排序
        self.Seq = Seq  # 决定升序还是降序
        self.dict_list = dict_list  # 待排序的字典序列
    def mergeSort(self,arr,arrtmp,start,end):
        if start>=end: return
        mid=start+int((end-start)/2)
        istart1=start
        iend1=mid

        istart2=mid+1
        iend2=end
        self.mergeSort(arr,arrtmp,istart1,iend1)
        self.mergeSort(arr,arrtmp,istart2,iend2)
        # 开始归并
        i = start
        while istart1 <= iend1 and istart2 <= iend2:
            if arr[istart1][self.key]<arr[istart2][self.key]:
                arrtmp[i]=arr[istart1]
                istart1+=1
            else:
                arrtmp[i]=arr[istart2]
                istart2+=1
            i+=1
        while istart1<=iend1:
            arrtmp[i]=arr[istart1]
            i+=1
            istart1+=1
        while istart2<=iend2:
            arrtmp[i]=arr[istart2]
            i+=1
            istart2+=1
        # 把原来的数据拷贝回去
        for i in range(start,end+1):
            arr[i]=arrtmp[i]
    def sortArray(self):
        nums=self.dict_list
        if len(nums)<2:return nums
        arrtmp=[]
        for i in range(0,len(nums)):
            arrtmp.append(0)
        self.mergeSort(nums,arrtmp,0,len(nums)-1)
        print(nums)
        if self.Seq==0:
            nums=nums[-1::-1]
        return nums

class Student_score_info_list():
    def __init__(self, stu_info_list=[]):  # 提供缺省的参数,如果已有学生成绩 -- 可导入此类
        self.stu_info_list = stu_info_list  # 学生的列表
        self.sort_method = ['Advanced_Mathematics', 'English', 'College_Physics',
                            'total_score']
    def menu(self):
        print("*********************")
        print("------- 目录 --------")
        print("------ 1.add --------")
        print("------ 2.del --------")
        print("------ 3.search -----")
        print("------ 4.modify -----")
        print("------ 5.print ------")
        print("*********************")
        # print(self.stu_info_list)
        print("现在已经有",len(self.stu_info_list),"位学生的成绩")
    def start_working(self):  # 学生成绩管理系统开始运行
        while True:
            self.menu()
            sec=int(input("请输入:>"))
            if sec==1:
                # 添加学生信息
                person={}
                name=input("请输入名字:>")
                person['name']=name
                Advanced_Mathematics=int(input("请输入高数成绩:>"))
                person['Advanced_Mathematics']=Advanced_Mathematics
                English=int(input("请输入英语成绩:>"))
                person['English']=English 
                College_Physics=int(input("请输入大学物理成绩:>"))
                person['College_Physics']=College_Physics 
                person['total_score']=Advanced_Mathematics+English+College_Physics
                print("添加成功!")
                print()
                self.add_student_info(person)
            elif sec==2:
                # 删除学生成绩
                name=input("请输入要删除学生的名字:>")
                self.del_student_info(name)
                print()
            elif sec==3:
                name=input("请输入要查找学生的名字:>")
                self.search_student_info(name)
                print()
            elif sec==4:
                name=input("请输入要修改学生的名字:>")
                self.modify_student_info(name)
                print()
            elif sec==5:
                print("------- 打印方式 --------")
                print("---- 0.按照高数成绩降序 ----")
                print("---- 1.按照英语成绩降序 ----")
                print("---- 2.按照大物成绩降序 ----")
                print("---- 3.按照总分成绩降序 ----")
                print("---- 4.按照总分成绩升序 ----")
                sec=int(input("请选择:>"))
                self.print_info_list_by_method(sec)
                print()
            else:
                print("选择错误 -- 程序退出!")
                sys.exit()
    def print_list(self):
        print("------------- 学生成绩 -------------")
        # 利用DataFrame打印会更好看一些
        df=pd.DataFrame(self.stu_info_list)
        print(df)
        print("------------- 学生成绩 -------------")
    def print_info_list_by_method(self, sort_method_type):
        if sort_method_type == 0:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 0, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照高数排序
            pass
        elif sort_method_type == 1:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 1, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照英语排序
            pass
        elif sort_method_type == 2:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 2, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照大学物理排序
            pass
        elif sort_method_type == 3:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 3, 0)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照总分排序 -- 降序
            pass
        elif sort_method_type == 4:
            class_sort = My_MergeSort_By_Student_score(
                self.stu_info_list, self.sort_method, 3, 1)
            self.stu_info_list = class_sort.sortArray()
            self.print_list()
            # 按照总分排序 -- 升序
            pass

    def add_student_info(self, person):  # 按照题目要求,此时的person应该是dict对象
        self.stu_info_list.append(person)

    def del_student_info(self, name):  # 删除名为name的学生成绩
        # 暴力查找名字
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                self.stu_info_list.remove(self.stu_info_list[i])
                print("successfully removed!")
                if_removed = True
                return
        print("err,No information about the student!")

    def search_student_info(self, name):  # 查找名为name的学生成绩
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                print("name:", self.stu_info_list[i]['name'])
                print("Advanced_Mathematics",
                      self.stu_info_list[i]['Advanced_Mathematics'])
                print("English", self.stu_info_list[i]['English'])
                print("College_Physics",
                      self.stu_info_list[i]['College_Physics'])
                print("total_score", self.stu_info_list[i]['total_score'])
                break
        print("err,No information about the student!")

    def modify_student_info(self, name):  # 修改名为name的学生成绩
        for i in range(0, len(self.stu_info_list)):
            if self.stu_info_list[i]['name'] == name:
                print("please modify the score info:")
                # 只允许修改分数,不允许修改名字
                new_total_score = 0
                new_score = int(input("Advanced_Mathematics:"))
                new_total_score += new_score
                self.stu_info_list[i]['Advanced_Mathematics'] = new_score
                new_score = int(input("English:"))
                new_total_score += new_score
                self.stu_info_list[i]['English'] = new_score
                new_score = int(input("College_Physics:"))
                new_total_score += new_score
                self.stu_info_list[i]['College_Physics'] = new_score
                # 更新总成绩
                self.stu_info_list[i]['total_score'] = new_total_score
                break


# ============================================ main ============================================== #
# 本成绩管理系统所有方法由 <Student_score_info_list> 类提供

# main函数
def main():
    s=Student_score_info_list()
    s.start_working()


if __name__ == '__main__':
    main()
posted @ 2023-07-17 23:58  背包Yu  阅读(44)  评论(0编辑  收藏  举报  来源