学生成绩管理系统|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
来封装排序算法
定义构造函数,所接受参数为:
dict_list
要排序的字典序列sort_method
前面定义的字符序列sort_method_type
排序类型(整型)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)就是将已经有序的子序列合并,得到另一个有序的数列
归是归并的归,不是递归的归,归并排序就是合并排序
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并排序的实现方法由递归和循环两种方法
递归方法的源代码简单一些
循环方法的源代码复杂一些,但效率高
这里采用递归方法:
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()
学生成绩管理系统|Python小应用练习的更多相关文章
- 第一次写C语言小程序,可以初步理解学生成绩管理系统的概念
1 成绩管理系统概述 1.1 管理信息系统的概念 管理信息系统(Management Information Systems,简称MIS),是一个不断发展的新型学科,MIS的定义随着科技的进步也在 ...
- 使用C++名单在文档处理和学生成绩管理系统相结合
对于学生成绩管理系统,我并不陌生,几乎学习C人的语言.做项目会想到学生成绩管理系统,我也不例外.在研究中的一段时间C语言之后,还用C语言到学生管理系统,然后做几个链接.计数,这个系统是以前的系统上的改 ...
- [项目记录] 用c语言完成的一个学生成绩管理系统
一.要求: 学生成绩管理系统 某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入).使用链表编程实现如下菜单驱动的学生成绩管理系统. 从文件读入每个学生个人信 ...
- 使用Java模拟一个简单的Dos学生成绩管理系统:
使用Java模拟学生成绩管理系统... ------------------- 学生成绩管理系统:需要实现的功能:1.录入学生的姓名和成绩2.显示列表.列表中包括学生姓名与成绩3.显示最高分.最低分的 ...
- 学生成绩管理系统C++
今天晚上终于做完了学生成绩管理系统!激动!开心!!!哈哈哈~~~~ 总共298行代码,第一次写这么多. 其中遇到了好多困难,也烦恼了好久,不过最终都解决了! 做了之后果然,满满的成就感!抑制不住的兴奋 ...
- 学生成绩管理系统(C++指针、链表、文件及面向对象的运用)
学生成绩管理系统 功能页面显示: 实现源码: #include<iostream> #include<fstream> #include<cstring> # ...
- 简易的学生成绩管理系统(C++实现)
最近浅显的学习了C++的基础知识,想来练练手,于是就用单链表写了最经典的小项目,存粹学习,所以就在控制台下写了,写的有点简陋,码了大概400多行. 下面上代码: #include <cstdli ...
- 从零开始的C程序设计大作业——学生成绩管理系统
前言 学生成绩管理系统可以说是C语言程序设计的结课的必备大作业了.花了些时间,费了些头发肝了下,完成了两个系统,一个是控制台版本的,另一个用easyx图形库进行了优化. 先放出完成后的演示图片占个坑. ...
- Java项目:学生成绩管理系统(二)
学生成绩管理系统(二):项目介绍 一.设计要求: 1.1 简单的图形界面登录功能. 1.2 对数据库的的信息的查询功能. 1.3 对数据库的的信息的修改功能. 1.4 对数据库的的信息的删除功能. 1 ...
- Java项目:学生成绩管理系统(一)
学生成绩管理系统(一) 项目名称:学生成绩管理系统 项目需求分析(Need 需求): (1)该系统的用户分为教师和学生.教师的功能有:管理某一学生或课程的信息以及成绩,包括增.删.查.报表打印等:学生 ...
随机推荐
- OpenTSDB 数据存储详解
本文首发于 vivo互联网技术 微信公众号链接: https://mp.weixin.qq.com/s/qayKiwk5QAIWI7-nyD3FVA作者:DuZhimin 随着互联网.尤其是物联网的发 ...
- 活动回顾|阿里云 Serverless 技术实践营 Serverless +AI 专场
8月25日"阿里云Serverless技术实践营( Serverless + AI 专场)"北京站圆满落幕.活动受众以关注 Serverless +AI 技术的开发者.企业决策人. ...
- [Vue] Computed property "XXX" was assigned to but it has no setter.
阅读这篇文章:https://blog.csdn.net/weixin_34090562/article/details/91369638 全选,通过计算属性计算得来.结果报错Computed pro ...
- 机器学习-线性分类-softmax回归 做多分类-10
1. softmax回归 伯努利分布(0-1分布 二分类),我们采用Logistic回归(用sigmoid函数映射到 0-1之间 输出预测概率)建模. 那么我们应该如何处理多分类问题?(比如要进行邮件 ...
- 分享Go书籍-《Go Web编程》
大家好,我是沙漠尽头的狼. 最近几天在看一本Go的书籍,看了100来页,感觉不错,分享给大家. 书籍基本信息 书籍信息: 书名:Go Web编程 作 者:(新加坡)郑兆雄(Sau Sheong C ...
- chorm如何静音特定网页
如图所示,右键想要静音的网页标签,选择将这个网页静音即可
- 【STM32】如何将资源烧写至外部flash,如spi-flash
STM32将资源烧写至外部flash方式大致分为通过IDE与应用程序一起和通过CubeProgranmmer单独烧写两种: 方式一.使用IDE加载烧写算法,烧录应用程序时一并写入,具体就是修改分散加载 ...
- [转帖]Oracle 23c 才支持 TLS1.3
Transport Layer Security 1.3 Protocol Now Supported in Oracle Database Starting with Oracle Database ...
- [转帖]JVM参数配置及调优
https://cloud.tencent.com/developer/article/2235751 JVM参数分类 jvm 参数可分为三类: 标准参数:以 "-" 开头的参数 ...
- [转帖]INSERT IGNORE INTO 与 INSERT INTO
INSERT IGNORE INTO 会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过当前插入的这条数据.这样就可以保留数据库中已经存在数据,达到在间隙中插入数 ...