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_list
la 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_list
la 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_method
del 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_info
y 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_list
defina 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_method
simplemente procesar directamente el subíndice de la lista.
Defina el menú en start_working
el 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 pandas
en la biblioteca DataFrame
para 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_score
para encapsular el algoritmo de clasificación
Defina el constructor, los parámetros aceptados son:
dict_list
secuencia de diccionarios para ordenarsort_method
la secuencia de caracteres previamente definidasort_method_type
Tipo de clasificación (entero)Seq
Entero, 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.
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()