Sistema de gestión del rendimiento de los estudiantes|Ejercicios de aplicación pequeña de Python

Requisitos del tema

Realice el sistema de gestión de calificaciones de los estudiantes
Ingrese la secuencia de información de calificaciones de los estudiantes, obtenga las calificaciones de mayor a menor, de menor a mayor, de acuerdo con la disposición de una determinada calificación, las mismas calificaciones se procesan de acuerdo con la regla de ingresar primero .
Los datos son los siguientes: (regla de datos: nombre del estudiante, puntaje alto en matemáticas, puntaje en inglés, puntaje de objeto grande)
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
salida: use el contenedor del diccionario para completar el almacenamiento de los datos de puntaje de cada estudiante y almacene a todos los estudiantes en la lista; en este base,
de acuerdo con el puntaje total Una lista de estudiantes de mayor a menor, una lista de estudiantes con puntajes totales de menor a mayor, una lista de estudiantes con tres materias de mayor a menor.
Proporcione los resultados de clasificación específicos, el código involucrado y presente brevemente el principio del algoritmo de clasificación que diseñó

Resumen

Al implementar Student_score_info_listla clase, complete todos los métodos requeridos por esta gran tarea.

El sistema de gestión del rendimiento introduce:

Funciones requeridas por el tema:

  • Al implementar Student_score_info_listla clase, se almacenan los datos de calificación de cada estudiante (usando la estructura de datos de la lista).El tipo de elemento en cada lista es un tipo de diccionario (tabla hash), y el diccionario almacena el nombre del estudiante y las calificaciones de tres materias. .

  • Además, a través print_info_list_by_methoddel método, los datos se imprimen de acuerdo con los diferentes requisitos de clasificación del tema.

Funciones adicionales implementadas:

  • Puede agregar, eliminar, verificar y modificar las calificaciones del estudiante
  • Proporcionar la interfaz de menú del sistema de gestión del rendimiento de los estudiantes: las operaciones correspondientes se pueden realizar de acuerdo con las selecciones del usuario
  • Puede administrar dinámicamente las calificaciones de los estudiantes, sin limitarse a entradas fijas

Sobre el algoritmo de clasificación:

  • Proporciona un método de clasificación eficiente, clasificación por fusión (la razón para elegir la clasificación por fusión se explicará más adelante)

Ingrese la información del estudiante

Proporcione start_working()métodos de clase, menu()métodos de llamada y realice las operaciones correspondientes de acuerdo con la entrada del usuario.

El usuario selecciona 1 para agregar la información de las calificaciones de los estudiantes. En este momento, use la declaración condicional de entrada para ingresar el nombre, la calificación y otra información correspondiente, llame al método add_student_infoy pase Person(type:dict)para completar la adición de las calificaciones de los estudiantes.

el código se muestra a continuación:

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

Por analogía, puede agregar las calificaciones de todos los estudiantes requeridos por el tema.

Impresión de calificaciones de los estudiantes

Al llamar print_info_list_by_method()al método, se imprimen las calificaciones del estudiante y se pueden llamar los métodos de clasificación e impresión correspondientes según la elección del usuario.

Primero Student_score_info_listdefina el atributo de clase en

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

Este procesamiento puede hacer que sea más conveniente para nosotros llamar al método de clasificación correspondiente, sort_methodsimplemente procesar directamente el subíndice de la lista.

Defina el menú en start_workingel método para permitir que el usuario elija el método de clasificación:

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

definir print_info_list_by_method()método

Use la declaración condicional para determinar el tipo de entero ingresado por el usuario y llame a la función de clasificación (la implementación específica de la función de clasificación se explicará más adelante)

Para hacer que la impresión de las calificaciones de los estudiantes sea más hermosa, use los tipos de datos pandasen la biblioteca DataFramepara imprimir

    # 为了使得打印学生成绩更加美观 -- 采用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

Implementación concreta de la clasificación.

Definir la clase de clasificación: My_MergeSort_By_Student_scorepara encapsular el algoritmo de clasificación

Defina el constructor, los parámetros aceptados son:

  1. dict_listsecuencia de diccionarios para ordenar
  2. sort_methodla secuencia de caracteres previamente definida
  3. sort_method_typeTipo de clasificación (entero)
  4. SeqEntero, 1 para orden descendente, 0 para orden ascendente
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  # 待排序的字典序列

ordenar por fusión

Las clasificaciones comúnmente utilizadas que pueden lograr la eficiencia de O(nlogn) son: clasificación rápida, clasificación en montón y clasificación por fusión. La clasificación con eficiencia O(n 1.3 ) es clasificación Hill.

De acuerdo con los requisitos del tema: las mismas calificaciones se procesarán de acuerdo con la regla de ingresar primero. Por lo tanto, durante el proceso de clasificación, las posiciones relativas de las variables con valores iguales no se pueden cambiar, por lo que se debe utilizar un algoritmo de clasificación estable.
Usando la ordenación por fusión, puede lograr tanto eficiencia como estabilidad.

La idea básica de la clasificación por fusión:

Ordenación por fusión: ¡
La idea central utilizada en la ordenación por fusión es divide y vencerás! Merge sort (mergeSort) consiste en fusionar las subsecuencias ordenadas
para obtener otra secuencia ordenada, es decir, primero hacer cada subsecuencia en orden y luego hacer los segmentos de subsecuencia en orden. La combinación de dos listas ordenadas en una lista ordenada se denomina combinación bidireccional.

imagen

Hay dos formas de implementar la ordenación por combinación: recursividad y bucle.
El código fuente del método recursivo es más simple.
El código fuente del método de bucle es más complicado, pero eficiente.

Aquí está el enfoque recursivo:

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

Funciones distintas a las requeridas por el tema

eliminar información del estudiante

 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!")

Modificar la información del estudiante

Nombre de búsqueda de fuerza bruta: ingrese la nueva información de grado después de encontrar

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

Encuentre información del estudiante

El algoritmo de búsqueda es en realidad el mismo que el de modificación y borrado, la búsqueda transversal violenta es suficiente, después de encontrarla, imprime la información, y si no la encuentra, imprimirá un mensaje de error.

    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!")

El código general del sistema de gestión del rendimiento de los estudiantes.

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

Supongo que te gusta

Origin blog.csdn.net/Yu_Cblog/article/details/131777593
Recomendado
Clasificación