10分钟教你用Python打造学生成绩管理系统

本文介绍了使用Python构建的学生成绩管理系统,涵盖了添加、修改、删除、查询学生信息,以及成绩统计和文件读写功能。系统采用列表作为数据库,保持成绩排序,利用CSV文件存储数据。文章还分享了部分关键代码实现。
摘要由CSDN通过智能技术生成

前言

大家好,这学期上了Python这门课,然后结课的时候老师要求做一个这样的学生管理系统。自己按照老师的要求写了一下,今天就把这个小程序分享出来吧供Python新手小朋友学习

欲下载本文相关的完整代码及算例,请关注公众号【程序猿声】,后台回复【Python成绩管理】不包括【】即可

1 总体构思

其实类似这类信息管理系统之类的程序,核心还是和数据打交道吧,包括增删查改,读取、展示、保存等。

在数据结构上,我依然用了老师给定的数据结构,即:

score1 = {
    "姓名":"张三丰", 
         "学号":"U19990001", 
         "作业" : [80, 64, 67, 20], 
         "测验" : [75, 75], 
         "实验" : [78, 57] ,
         "分数" : 0
       } 

没有增加新的字段比如排名之类的。这样做的主要是考虑到排名、平均成绩等均可以由上述结构中的信息计算出来,而且也可以避免因为一个某个成绩变动,导致一系列的数据需要重新计算。毕竟,数据存储得越多,维护起来的难度就越大,特别是一些关联密切的数据更是如此。

在存储在结构上,我采用了Python中常用的列表作为此程序的“数据库”,因为列表操作起来还是非常方便的。此外,因为这里涉及到一个排名的问题,所以我制定了一个原则:**在列表中的所有数据实体都是按照成绩高低进行排序的,即整个存储信息的列表由始至终都是有序的。**这样就解决了排名的问题,至于如何实现的,后续我会进行阐述。

运行环境:采用的是Windows 10 x64位操作系统+anaconda(Python3.7)+Spyder,默认情况下即可运行,不需要安装其他库。

2 程序说明

这一节我将介绍一下该程序相应的功能以及相应的代码实现。在此之前先介绍我自己设定的一些规则:

  • 计算成绩时取小数点后三位。
  • 排名根据[分数、作业平均、测验平均、实验平均]的优先级比较。不存在排名相同的情况。如果这4项指标都相同,emmm应该不会有这么巧的事情。
  • 文件保存和读取时,采取CSV格式的数据文件。文件头遵循:['序号','姓名','学号','分数','排名','作业1','作业2','作业3','作业4', '测验1', '测验2', '实验1', '实验2']这种格式。

2.0 主界面

整个程序的主界面如下,哈哈,拥有直男审美的我实在是没有办法进一步美化了。

在整个程序的交互中,为了更好提高提示信息的辨识度,我规定了几种颜色:

  • 蓝色提示内容表示需要用户输入相关信息。
  • 红色表示系统执行指令的结果,比如成功,失败等等。
  • 正常的黑色表示系统菜单显示啊,查询结果的输出等。

2.1 添加学生信息

在添加学生信息中,在实现了手动添加信息的基础上,我又增加了从文件中导入信息的功能。不过在添加信息这块,我做了一个约束:**添加学生信息时,如果系统中已经存在该学生的学号,则不能重复添加。**两种方式都遵循该原则,以保证学号的唯一性。

手动添加学生信息
从文件中添加学生信息

在添加学生信息时,因为前面说了列表里面的数据需要保持有序性,所以我采取了插入排序的方式进行添加,核心的代码如下:

# 根据优先级[分数、作业平均、测验平均、实验平均]比较s1是否优于s2
def cmp_student(s1, s2):
    if s1["分数"] != s2["分数"]:
        return s1["分数"] > s2["分数"]
    else:
        if np.mean(s1["作业"]) != np.mean(s2["作业"]):
            return np.mean(s1["作业"]) > np.mean(s2["作业"])
        else:
            if np.mean(s1["测验"]) != np.mean(s2["测验"]):
                return np.mean(s1["测验"]) > np.mean(s2["测验"])
            else:
                return np.mean(s1["实验"]) > np.mean(s2["实验"])

# 根据分数大小,将学生信息插入到列表中,插入排序
def add_to_list(stu, stu_list):
    if len(stu_list):
        if cmp_student(stu, stu_list[0]): # 比第一名还优秀
            stu_list.insert(0,stu)
        elif not cmp_student(stu, stu_list[-1]): # 比最后一名还差
            stu_list.append(stu)
        else:
            for i in range(len(stu_list)-1):
                if (not cmp_student(stu, stu_list[i])) and (cmp_student(stu, stu_list[i+1])):
                    stu_list.insert(i+1, stu)
                    return
    
  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值