Pycharm小试牛刀(一)——学生管理系统

目录

  1. 需求分析
  2. 系统设计
  3. 功能模块设计
    3.1 录入学生信息功能
    3.2删除学生信息功能
    3.3修改学生信息功能
    3.4查询学生信息功能
    3.5统计学生总人数功能
    3.6显示所有学生信息的功能
    3.7显示所有学生信息的功能
  4. 项目打包

1. 需求分析
首先我们得明确学生管理系统应该具备的功能:

  1. 添加学生及其成绩的信息 insert()
  2. 将学生信息保存到文件中
  3. 修改modify()和删除信息delete()
  4. 查询学生信息search()
  5. 根据学生成绩进行排序sort()
  6. 统计学生的总分数
  7. 统计学生总人数total()
  8. 显示所有学生信息show()

2. 系统设计

流程图:

Created with Raphaël 2.2.0 开始 while true 显示主菜单 选择菜单项 判断是否存在该功能? 调用相应函数 yes no

代码演示:

def main():#创建主函数
    while True:
        menu()
        choice=int(input('请选择'))
        if choice in [0,1,2,3,4,5,6,7]:
            if choice==0:
                answer=input('您要退出学生管理系统?Y|F')
                if answer=='y'or'Y':
                   print('谢谢使用!')
                   break #退出系统
                else:
                    continue
            if choice==1:
                insert()
            if choice==2:
                search()
            if choice==3:
                modify()
            if choice==4:
                delete()
            if choice==5:
                show()
            if choice==6:
                total()
            if choice==7:
                sort()


def menu(): #创建菜单
    print('=======================学生管理系统======================')
    print('--------------------------主菜单------------------------')
    print('1.录入学生信息')
    print('2.查询学生信息')
    print('3.修改学生信息')
    print('4.删除学生信息')
    print('5.显示所有学生信息')
    print('6.统计学生总人数')
    print('7.排序')
    print('0.退出学生系统')
    print('-------------------------------------------------------')
#创建功能函数
def insert():
    pass
def search():
    pass
def modify():
    pass
def delete():
    pass
def show():
    pass
def total():
    pass
def sort():
    pass

#调用主函数
if __name__ == '__main__':
    main()

结果展示:
在这里插入图片描述
3. 功能模块设计

3.1录入学生信息功能

从控制台录入学生信息,并把它保存到磁盘文件中。
流程图:
在这里插入图片描述
所用到的函数:insert() save()
代码演示:

#创建功能函数
filname='stu_inf.txt'#写到代码最前面
def insert():#录入学生信息
    st_list=[]
    while True:
      st_num=int(input('请输入学生学号(如:21001):'))
      if not st_num:
           break
      st_name=input('请输入学生姓名:')
      if not st_name:
          break
      try: #防止出现异常
          english_score=int(input('请输入英语成绩:'))
          algeb_score=int(input('请输入线代成绩:'))
          paintting_score = int(input('请输入绘画成绩:'))
          socar_score = int(input('请输入足球成绩:'))
      except:
          print('输入无效,请重新输入!')
          continue
      #将输入的学生信息保存到字典
      st_inf={'学号':st_num,'姓名':st_name,'英语成绩':english_score,'线代成绩':algeb_score,'绘画成绩':paintting_score,'足球成绩':socar_score}
      st_list.append(st_inf)
      answer=input('是否继续添加?y/n\n')
      if answer=='y':
            continue
      else:
             break
    save(st_list) #用于存储信息到文件中
    print('学生信息录入完毕!')
def save(lst):
    try:
        st_txt=open(filname,'a',encoding='Utf-8')
    except:
        st_txt=open(filname,'w',encoding='Utf-8')
    for item in lst:
        st_txt.write(str(item)+'\n')
    st_txt.close()

结果:
在这里插入图片描述
而且我们会发现,系统帮我们建立了一个stu_inf.txt文件:
在这里插入图片描述
3.2删除学生信息功能
从控制台录入学生学号,到磁盘中找到对应的学生信息,并将其删除。
流程图:
在这里插入图片描述
代码:

def delete():
    while True:
     st_num=int(input('请输入要删除的学生的学号:'))
     if st_num!=' ':
        if os.path.exists(filname):
           with open(filname,'r',encoding='utf-8') as file:
               st_lin=file.readlines()
        else:
            st_lin=[]
        flag=False #判断是否被删除,默认为F,没有删除
        if st_lin: #不为空的话,布尔值为T,然后就把列表的内容写入空字典
           with open(filname,'w',encoding='utf-8') as file1:
                s={}
                for item in st_lin:
                    s=dict(eval(item))#将字符串类型转化为字典类型
                    if s['学号']!=st_num:
                        file1.write(str(s)+'\n')
                    else:
                        flag=True #表示已删除
                if flag:
                    print('学号为%d的学生信息已删除',st_num)
                else:
                    print('没有找到学号为%d的学生的信息',st_num)
        else:
         print('无学生信息!')
         break
        show() #重新显示学生信息
        answer=input('请问是否继续删除?y/n')
        if answer=='y':
         continue
        else:
         print('谢谢使用!')
         break

结果展示:
在这里插入图片描述
在这里插入图片描述
3.3修改学生信息功能
从控制台录入学生学号,到磁盘中找到对应的学生信息,将其进行修改。
在这里插入图片描述
代码:

def modify():
    if os.path.exists(filname):
        with open(filname,'r',encoding='utf-8') as mfile:
            st_orignal=mfile.readlines()
    else:
        print('学生文件为空!')
    st_num=int(input('请输入要修改的学生的学号:'))
    with open(filname, 'w', encoding='utf-8') as ofile:
        for item in st_orignal:
            s=dict(eval(item))
            if s['学号']==st_num:
                print('找到该学生的信息,请修改。')
                while True:
                    try:
                     s['姓名']=input('请输入学生姓名')
                     s['英语成绩'] = input('请输入英语成绩')
                     s['线代成绩'] = input('请输入线代成绩')
                     s['绘画成绩'] = input('请输入绘画成绩')
                     s['足球成绩'] = input('请输入足球成绩')
                    except:
                        print('输入有误,请重新输入!')
                    else:  #修改成功则退出,如果不加,会一直运行
                        break
                ofile.write(str(s)+'\n')
                print('修改成功!')
            else:
                 ofile.write(str(s)+'\n')
        if st_num not in s.values():
            print('没有找到该学生信息。')
        answer=input('是否继续修改学生信息?y/n')
        if answer=='y':
            modify()

结果:
在这里插入图片描述
3.4查询学生信息功能
从控制台录入学生学号或姓名,到磁盘文件中,找到对应的学生信息。
假如按学号查询是1,按姓名查是2。
流程图:
在这里插入图片描述
代码:

def search():
    st_querry=[]
    while True:
        st_num=''
        st_name=''
        if os.path.exists(filname):
            with open(filname, 'r', encoding='utf-8') as sfile:
                st_orignal = sfile.readlines()
        else:
            print('学生文件为空!')
            break
        mode=int(input('按学号查请输1,按姓名查请按2。'))
        if mode==1:
            st_num=int(input('请输入学生学号:'))
            if not st_num:
                break
        elif mode==2:
            st_name=int(input('请输入学生姓名:'))
            if not st_name:
                break
        else:
            search()
            return
        with open(filname,'w',encoding='utf-8') as sefile:
            for item in st_orignal:
                s=dict(eval(item))
                if s['学号']==st_num:
                    st_querry.append(s)
                elif s['姓名']==st_name:
                    st_querry.append(s)
        #显示查询结果
        show_st(st_querry)
        #清空列表,以防下次查找,列表中有数据
        st_querry.clear()
        answer=input('请问还继续查找吗?y/n')
        if answer=='y':
            continue
        else:
            break
def show_st(lst):
    if len(lst)==0:
        print('没有查到学生信息。')
        return
    #定义标题显示格式
    format_title='{:^6}\t{:^10}\t{:^10}\t{:^12}\t{:^12}\t{:^12}\t{:^12}\t'
    print(format_title.format('学号','姓名','英语成绩','线代成绩','绘画成绩','足球成绩','总成绩'))
    # 定义内容显示格式
    format_content ='{:^6}\t{:^10}\t{:^10}\t{:^12}\t{:^12}\t{:^12}\t{:^12}\t'
    for item in lst:
        print(format_title.format(item.get('学号'),
                                  item.get('姓名'),
                                  item.get('英语成绩'),
                                  item.get('线代成绩'),
                                  item.get('绘画成绩'),
                                  item.get('足球成绩'),
                                  int(item.get('英语成绩'))+int(item.get('线代成绩'))+int(item.get('绘画成绩'))+int(item.get('足球成绩'))))
def modify():
    if os.path.exists(filname):
        with open(filname,'r',encoding='utf-8') as mfile:
            st_orignal=mfile.readlines()
    else:
        print('学生文件为空!')
    st_num=int(input('请输入要修改的学生的学号:'))
    with open(filname, 'w', encoding='utf-8') as ofile:
        for item in st_orignal:
            s=dict(eval(item))
            if s['学号']==st_num:
                print('找到该学生的信息,请修改。')
                while True:
                    try:
                     s['姓名']=input('请输入学生姓名')
                     s['英语成绩'] = input('请输入英语成绩')
                     s['线代成绩'] = input('请输入线代成绩')
                     s['绘画成绩'] = input('请输入绘画成绩')
                     s['足球成绩'] = input('请输入足球成绩')
                    except:
                        print('输入有误,请重新输入!')
                    else:  #修改成功则退出,如果不加,会一直运行
                        break
                ofile.write(str(s)+'\n')
                print('修改成功!')
            else:
                 ofile.write(str(s)+'\n')
        if st_num not in s.values():
            print('没有找到该学生信息。')
            return
        answer=input('是否继续修改学生信息?y/n')
        if answer=='y':
            modify()

结果:
在这里插入图片描述
3.5统计学生总人数功能
流程图:
在这里插入图片描述
代码:

def total():
    if os.path.exists(filname):
        with open(filname,'r',encoding='utf-8') as tfile:
            st_lis=tfile.readlines()
            if st_lis:
                print(f'一共有{len(st_lis)}个学生。')
            else:
                print('没有学生信息!')
    else:
        print('没有数据信息!')

结果:
在这里插入图片描述
3.6显示所有学生信息的功能
将学生的信息文件中保存的全部学生信息获取并显示。
在这里插入图片描述
代码:

def show():
    st_lis=[]
    if os.path.exists(filname):
        with open(filname,'r',encoding='utf-8') as sfile:
            st_orignal=sfile.readlines()
            for item in st_orignal:
                st_lis.append(eval(item))
            if st_orignal:
                    show_st(st_lis)
            else:
                       print('没有学生信息!')
    else:
        print('没有数据信息!')

结果:
在这里插入图片描述
3.7显示所有学生信息的功能
根据学生的成绩进行升序或降序排列。
假设选择0表示升序排序,选择1表示降序排序。
流程图:
在这里插入图片描述
代码:

def sort():
    if os.path.exists(filname):
        st_quer=[]
        st_new = []
        with open(filname,'r',encoding='utf-8') as sfile:
            st_quer=sfile.readlines()
            if st_quer:
             for item in st_quer:
                s=dict(eval(item))
                st_new.append(s)
            else:
                return
            mode1=input('请选择(0.升序 1.降序):')
            if mode1=='0':
                mode1_bool=False
            elif mode1=='1':
                mode1_bool=True
            else:
                print('您的输入有误,请重新输入!')
                sort()
            mode2=int(input('请选择按照(1.英语成绩 2.线代成绩 3.绘画成绩 4.足球成绩 )排序:'))
            if mode2==1:
                st_new.sort(key=lambda x:int(x['英语成绩']),reverse=mode1_bool)#匿名函数 lambda x
            elif mode2==2:
                st_new.sort(key=lambda x:int(x['线代成绩']),reverse=mode1_bool)
            elif mode2==3:
                st_new.sort(key=lambda x:int(x['绘画成绩']),reverse=mode1_bool)
            elif mode2==4:
                st_new.sort(key=lambda x:int(x['足球成绩']),reverse=mode1_bool)

            else:
                print('您的输入有误,请重新输入!')
                sort()
        show_st(st_new)

    else:
        return

结果:在这里插入图片描述
4. 项目打包

打开终端
写入pip install PyInstaller
安装完成后
在终端输入:
在这里插入图片描述
生成后,终端显示的倒数第几行会有.exe文件的位置。我忘了截图了。
在这里插入图片描述
在这里插入图片描述
我图有点小,有点没对齐。

完整代码,我已经上传了,但是我记得之前资源分项有一个粉丝免费下载,上传时没看到,有知道怎么搞的小伙伴请留言。
完整代码链接:
链接: link.
另外,我趁热打铁做了一个简单的记账系统链接: link.

Logo

快速构建 Web 应用程序

更多推荐