当前位置:首页 » 《随便一记》 » 正文

Python小项目——学生信息管理系统(详细讲解)

24 人参与  2022年11月09日 08:25  分类 : 《随便一记》  评论

点击全文阅读


目录

一、需求分析

        1、学生管理系统应具备的功能

二、系统设计

1、系统功能结构

2、系统业务流程

三、系统开发必备工具 

        1、系统开发环境

        2、项目目录结构

 四、主函数设计

         1、系统主界面运行效果图

        2、主函数的业务流程

         3、实现主函数

        4、代码与结果演示及讲解

  五、学生信息维护模式设计

        1、录入学生信息功能

                1、1实现录入学生信息功能

                1、2业务流程

                1、3具体实现 

                1、4代码与结果演示及讲解

        2、删除学生信息功能

                2、1实现删除学生信息功能

                2、2业务流程

                2、3具体实现 

                2、4代码与结果演示及讲解

        3、修改学生信息功能

                3、1实现学生信息修改功能

                3、2业务流程

                3、3具体实现

                 3、4代码与结果演示及讲解

六、查询/统计模块设计

        1、查找学生信息功能

                1、1实现查询学生信息功能

                1、2业务流程

​                        1、3具体实现 

                         1、4代码与结果演示及讲解

        2、统计学生总人数

                2、1实现统计学生总人数功能

                2、2业务流程

                2、3具体实现

                2、4 代码与结果演示及讲解

        3、显示所有学生信息功能

                3、1实现显示所有学生信息功能

                3、2业务流程

                3、3具体实现

                3、4代码与结果演示及讲解

七、排序模块设计

        1、排序模块的设计

                1、1实现按学生成绩排序功能

                1、2业务流程

                1、3具体实现

                   1、4代码与结果演示及讲解

 八、总结


一、需求分析

        1、学生管理系统应具备的功能

                ①添加学生及成绩信息

                ②将学生信息保存到文件中

                ③修改和删除学生信息

                ④查询学生信息

                ⑤根据学生成绩进行排序

                ⑥统计学生的总分

二、系统设计

1、系统功能结构

        1.1学生信息管理系统的7大模块

                ①录入学生信息模块(insert())

                ②查找学生信息模块(search())

                ③删除学生信息模块(delete())

                ④修改学生信息模块(modify())

                ⑤学生成绩排名模块(sort())

                ⑥统计学生总人数模块(total())

                ⑦显示全部学生信息模块

2、系统业务流程

三、系统开发必备工具 

        1、系统开发环境

                操作系统:win7

                Python解释器版本:Python3.8

                开发工具:PyCharm

                Python内置模块:os,re

        2、项目目录结构

                

 四、主函数设计

         1、系统主界面运行效果图

        2、主函数的业务流程

         3、实现主函数

        4、代码与结果演示及讲解

                ①实现主函数之前要先把主菜单函数设计好,及我们的menum();菜单设计相对简单,只需要根据我们的设计,照样输出即可。

def menum():#菜单    print("===========================学生信息管理系统==========================")    print('-------------------------------功能菜单----------------------------')    print('\t\t\t\t\t\t1.录入学生信息')    print('\t\t\t\t\t\t2.查找学生信息')    print('\t\t\t\t\t\t3.删除学生信息')    print('\t\t\t\t\t\t4.修改学生信息')    print('\t\t\t\t\t\t5.对学生成绩排序')    print('\t\t\t\t\t\t6.统计学生总人数')    print('\t\t\t\t\t\t7.显示所有学生总数')    print('\t\t\t\t\t\t0.退出系统')    print('-----------------------------------------------------------------------')

                 ②在主函数中显示主菜单,然后进行循环,因为信息可以一直加,所以循环采用的是while True:,然后再根据所输入的数字,进入对应的函数实现相应的功能。具体的函数功能可以慢慢的实现,先把框架搭建起来。

def main():#主函数    while True:        menum()        choice=int(input('请选择:'))        if choice in [0,1,2,3,4,5,6,7]:            if choice==0:                answer=input('您确定要退出系统吗?y/n')                if answer=='y':                    #print('谢谢您的使用')                    break                else :                    continue            elif choice==1:                insert()            elif choice==2:                search()            elif choice==3:                delete()            elif choice==4:                modify()            elif choice==5:                sort()            elif choice==6:                total()            elif choice==7:                show()        else:            print('您输入的有误,请重新输入')            main()

 

  五、学生信息维护模式设计

        1、录入学生信息功能

                1、1实现录入学生信息功能

                        从控制台录入学生信息,并且把它们保存到磁盘中

                1、2业务流程

                1、3具体实现 

 

                1、4代码与结果演示及讲解

def insert():#插入    student_lst=[]#声明一个列表,用于存储学生信息    while True:        id=input('请输入id(如1001):')        if not id:#如果输入为空,那么id的值为False,就进入不了循环,所以加一个not即可判断是否为空            break        name=input('请输入名字(如张三):')        if not name:            break        try:            english=int(input('请输入英语成绩:'))            python = int(input('请输入python成绩:'))            java = int(input('请输入java成绩:'))        except:            print('您输入的有误,请重新输入')            continue        #将录入的学生信息保存到字典中        student={'id':id,'name':name,'english':english,'python':python,'java':java}        student_lst.append(student)        answer=input('是否继续添加?y/n')        if answer=='y':            continue        else:            break    #调用save()函数    save(student_lst)    print('学生信息完毕!!!')
def save(lst):    try:        stu_text=open(filename,'a',encoding='utf-8')#打开文件,以追加的形式    except:        stu_text=open(filename,'w',encoding='utf-8')#以只写的形式打开文件    for item in lst:        stu_text.write(str(item)+'\n')    stu_text.close()

 

                        ① 先声明一个列表,用来存储学生信息

                        ②根据流程,在一个while:True的循环中输入学生id,为了防止输入为空,要进行一个判断是否为空,如果为空,则其bool值为False,所以进行的是not id 判断;对姓名同样如此,但是对成绩则不一样,因为成绩只能为整数,为了防止用户输入错误,这里采用异常处理,提示用户输入错误;然后再将学生的信息保存到字典当中(因为字典是以键值对的形式存储的),然后再将字典中的值添加到最初声明的列表中;添加之后要保存到磁盘中,这时候就要调用save函数了;

                        ③save进行将数据存入磁盘中,当文件存在时,以追加的形式打开,如果文件不存在则以写的形式打开存储到一个变量当中,然后遍历列表,将数据存入磁盘之中;因为成绩是int 型,所以需要进行数据类型转换

        2、删除学生信息功能

                2、1实现删除学生信息功能

                                从控制台录入学生id到磁盘文件中找到对应的学生信息,并将其删除

                2、2业务流程

                2、3具体实现 

                2、4代码与结果演示及讲解

def delete():    while True:        student_id=input('请输入要删除的学生的ID:')        if student_id!='':#输入的id不为空            if os.path.exists(filename):#判断文件是否存在                with open(filename,'r',encoding='utf-8') as file:#打开文件                    student_old=file.readlines()#读取所有数据,放到列表当中            else:                student_old=[]            flag=False   #标记是否删除            if student_old:#如果列表不空,用只写的方式打开,将原有类容进行覆盖                with open(filename,'w',encoding='utf-8') as wfile:                    d={}                    for item in student_old:#遍历列表,读出的是一个字符串                        d=dict(eval(item))#将字符串转成字典                        if d['id']!=student_id:#如果不相等就把其写入                            wfile.write(str(d)+'\n')                        else:#相等就删除                            flag=True                    if flag:                        print(f'id为{student_id}的学生信息以被删除')                    else:                        print(f'没有找到ID为{student_id}的学生信息')            else:                print('无学生信息')                break            show() #删除之后要重新显示所有学生信息            answer=input('是否继续删除?y/n')            if answer=='y':                continue            else:                break

                                ①先输入学生id,然后判断其是否为空(因为循环是while:True是一直循环的,当其输入为空时,无法进入下一步,就会显示请输入ID),若不为空,然后再判断其文件是否存在,如果存在则以只读的方式打开,放入列表中,若为空,则说明文件中无信息,将列表赋值为空值

                     ②设一个标识符(判断是否成功删除),若列表不为空,以只写的方式打开文件,然后遍历列表,将列表中的内容存储到字典当中,如果字典中的id和要删除的id不相等则写入文件,否则不写入。

注意:此处的删除不是把文件中的内容删除,而是通过重新写入的方式将以前的内容覆盖掉,如果id相等了就不写入。

        3、修改学生信息功能

                3、1实现学生信息修改功能

                        从控制台录入学生id到磁盘文件中找到对应的学生信息,将其进行修改 

                3、2业务流程

                3、3具体实现

                 3、4代码与结果演示及讲解

def modify():    show()    if os.path.exists(filename):#判断这个文件是否存在        with open(filename,'r',encoding='utf-8') as rfile:            student_old=rfile.readlines()#以只读的形式赋给列表    else :        return    student_id=input('请输入要修改的学生id:')    with open(filename,'w',encoding='utf_8') as wfile:        for item in student_old:            d=dict(eval(item))            if d['id']==student_id:                print('找到学生信息,可以修改他的相关信息了!')                while True:                    try:                        d['name']=input('请输入姓名:')                        d['englist']=input('请输入英语成绩:')                        d['python']=input('请输入python成绩:')                        d['java']=input('请输入java成绩:')                    except:                        print('您的输入有误,请重新输入!!!')                    else :                        break                wfile.write(str(d)+'\n')                print('修改成功')            else:                wfile.write(str(d)+'\n')        answer=input('是否修改其他学生信息?y/n\n')        if answer=='y':            modify()

 

                        ①修改学生信息之前先把所有的信息展现出来,以防止不知道有哪些信息能更改,show()就是展示函数,但是目前还没写。

                        ②输入学生id以只读的方式打开文件,然后存到列表中,再遍历列表判断是否有id相等的,如果相等则修改(也就是覆盖操作),如果没有则正常写入文件中。

 

六、查询/统计模块设计

        1、查找学生信息功能

                1、1实现查询学生信息功能

                        从控制台录入学生信息到磁盘文件中查找对应的学生信息

                1、2业务流程

                        1、3具体实现 

                         1、4代码与结果演示及讲解

                                

def search():    student_query=[]#声明一个列表    while True:        id=''        name=''        if os.path.exists(filename):#判断文件是否存在            mode=input('按id查找请输入1,按姓名查找请输入2')            if mode=='1':                id=input('请输入学生ID:')            elif mode=='2':                name=input('请输入学生姓名:')            else:                print('您的输入有误,请重新输入')                search()            with open(filename,'r',encoding='utf-8') as rfile:#以只读的方式打开                student=rfile.readlines()#获取全部的内容存入列表中                for item in student:#遍历列表存入字典中                    d=dict(eval(item))                    if id!='':#因为有两种查询方式,再加上最开始默认值为0,所以进行判断用哪种方式                        if d['id']==id:                            student_query.append(d)#如果查询的id在字典中,则将内容添加到新的列表中                    elif name!='':                        if d['name']==name:                            student_query.append(d)#如果查询到name在字典中,则将内容添加到新的列表中            #显示查询结果            show_student(student_query)#展现新的列表,需要格式化输出            #清空列表            student_query.clear()            answer=input('是否要继续查询?y/n\n')            if answer=='y':                continue            else:                break        else:            print('暂未保存学生信息')            return
def show_student(lst):    if len(lst)==0:        print('没有查询到学生信息,无数据显示!!!')        return    #定义标题的显示格式    format_title='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'    print(format_title.format('ID','姓名','英语成绩','python成绩','java成绩','总成绩'))    #定义内容的显示格式    format_data='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'    for item in lst:        print(format_data.format(item.get('id'),                                 item.get('name'),                                 item.get('englist'),                                 item.get('python'),                                 item.get('java'),                                 int(item.get('englist'))+int(item.get('python'))+int(item.get('java'))                                 ))

 

                             ①首先要声明一个列表,用来存储找到的信息

                             ②判断文件是否存在,然后选择按ID还是名字查询

                              ③ 将文件以只读的模式打开,然后判断ID或名字是否存在,若存在则存入新的列表中,即最开始声明的列表中,然后以一个格式化的样式输出。

                                ④格式化输出   

        2、统计学生总人数

                2、1实现统计学生总人数功能

                        统计学生信息文件中保存的学生信息个数 

                2、2业务流程

                2、3具体实现

                2、4 代码与结果演示及讲解

def total():    if os.path.exists(filename):#判断文件是否存在        with open(filename,'r',encoding='utf-8') as rfile:#只读的模式打开文件            students=rfile.readlines()#获取文件中全部内容,存入列表中            if students:                print(f'一共有{len(students)}名学生')            else:                print('还没有录入学生信息')    else:        print('暂未保存数据.....')

 

    这个思路就相对简单了,看代码就可以理解了,就不过多介绍了

        3、显示所有学生信息功能

                3、1实现显示所有学生信息功能

                        将学生信息文件中保存的全部学生信息获取并显示

                3、2业务流程

                3、3具体实现

 

                3、4代码与结果演示及讲解

def show():    studetn_lst=[]    if os.path.exists(filename):        with open(filename,'r',encoding='utf-8') as rfile:            students=rfile.readlines()            for item in students:                studetn_lst.append(eval(item))            if studetn_lst:                show_student(studetn_lst)
def show_student(lst):    if len(lst)==0:        print('没有查询到学生信息,无数据显示!!!')        return    #定义标题的显示格式    format_title='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'    print(format_title.format('ID','姓名','英语成绩','python成绩','java成绩','总成绩'))    #定义内容的显示格式    format_data='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'    for item in lst:        print(format_data.format(item.get('id'),                                 item.get('name'),                                 item.get('englist'),                                 item.get('python'),                                 item.get('java'),                                 int(item.get('englist'))+int(item.get('python'))+int(item.get('java'))                                 ))

 

 这个与查询学生信息类似,只是少了个判断的环节,把所有的信息都展现出来

七、排序模块设计

        1、排序模块的设计

                1、1实现按学生成绩排序功能

                1、2业务流程

 

                1、3具体实现

                   1、4代码与结果演示及讲解

def sort():    show()#显示所有学生信息    if os.path.exists(filename):#判断文件是否存在        with open(filename,'r',encoding='utf-8') as rfile:            student_list=rfile.readlines()#读取所有信息        student_new = []        for item in student_list:#编列列表,存入新的列表中            d=dict(eval(item))            student_new.append(d)    else:        return    asc_or_desc=input('请选择(0,升序  1,降序)')    if asc_or_desc=='0':#之所以升序是False是因为python内置函数的原因        asc_or_desc_bool=False    elif asc_or_desc=='1':        asc_or_desc_bool=True    else:        print('您的输入有误,请重新输入')        sort()    mode=input('请选择排序方式(1.按英语成绩排序 2.按Python成绩排序 3.按java成绩排序 0.按总成绩排序:')    if mode=='1':        student_new.sort(key=lambda x:int(x['englist']),reverse=asc_or_desc_bool)    elif mode=='2':        student_new.sort(key=lambda x: int(x['python']), reverse=asc_or_desc_bool)    elif mode=='3':        student_new.sort(key=lambda x: int(x['java']), reverse=asc_or_desc_bool)    elif mode=='0':        student_new.sort(key=lambda x: int(x['englist'])+int(x['python'])+int(x['java']), reverse=asc_or_desc_bool)    else:        print('您输入有误,请重新 输入!!!')        sort()    show_student(student_new)

 八、总结

        这是用python做的第一个项目,学起来还是有那么点吃力的,主要是对磁盘文件的读取以及整个的逻辑思维这一块的问题。把整个项目复盘了一遍后发现其实没那么难,只是最开始做起来逻辑思维跟知识的运用没有那么熟练,总结下来之后整体的大致思路以及操作大致掌握清楚,接下来要做的就是巩固以及熟练掌握。


点击全文阅读


本文链接:http://zhangshiyu.com/post/47572.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1