Python学生成绩管理系统

菜鸟小欧
• 阅读 1520

#import matplotlib.pyplot as plt
import time
import os  # 导入文件 包
import re  # 正则表达式

filename = 's.txt'
filenamedl = 'sdl.txt'


def main():
    while True:  # 让菜单反复显示,相当于一个死循环
        menu()
        option = input("请选择:")
        if option == '1':
            insert()
        elif option == '2':
            search()
        elif option == '3':
            delete()
        elif option == '4':
            # modify_info()
            modify()
        elif option == '5':
            sort()
        elif option == '6':
            total()
        elif option == '7':
            show()

        else:
            print('你已经退出')
            exit(0)


def menu():
    print('''
               **********学生信息管理系统**********
                            功能菜单
                         1.录入学生信息
                         2.查找学生信息
                         3.删除学生信息
                         4.修改学生信息
                         5.学生成绩排序
                         6.统计学生人数
                         7.显示学生信息

                         0.退出系统
               *********************************
        ''')


def insert():  # 录入
    studentlist = []  # 用于保存多个学生信息
    flag = 1  # 定义一个标志性变量用来控制循环
    while flag:  # 相当于while flag!=0
        id = input("id:")
        if len(id) != 11:
            print("id格式错误,请重新输入")
            break
        name = input("名字:")
        if id.lstrip() == '' or name.lstrip() == '':  # 判断输入是否为空 用lstrip函数
            print("姓名不能为空,输入错误")
            break
        name_string = re.sub("\D", "", name)  # D:切割字符串,只保留数字  d相反
        if name_string in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
            print("姓名输入出错,请重新输入")
            continue
        else:
            try:  # try里面如果有异常,则执行except里面的
                yuwen = float(input("语文:"))
                if yuwen > 100 or yuwen < 0:
                    print("成绩输入不合法,请重新输入")
                    return
                shuxue = float(input("数学:"))
                if shuxue > 100 or shuxue < 0:
                    print("成绩输入不合法,请重新输入")
                    return
                yingyu = float(input("英语:"))
                if yingyu > 100 or yingyu < 0:
                    print("成绩输入不合法,请重新输入")
                    return
            except:
                print("输入无效,请重新输入")
                continue  # 若程序执行到此处,下面的内容不继续执行,程序会自动结束本次循环,然后继续输入
            student = {'id': id, 'name': name, 'yuwen': yuwen, 'shuxue': shuxue, 'yingyu': yingyu}  # 准备一个学生的格式
            studentlist.append(student)  # 录入一个学生信息就将该学生信息(字典)添加到列表中   将多个学生成绩放入列表
            flag = int(input("是否继续输入(1:是/0;否):\n"))
    # 保存文件
    student_txt = open(filename, 'a')  # "a"追加
    # 将本次添加的学生信息全部放入到文件中
    for s in studentlist:  # 遍历列表
        student_txt.write(str(s) + '\n')  # 写入一行数据    #str表示将列表转成字符串
    student_txt.close()  # 关闭文件对象


def search():
    student_new = []
    flag = 1
    while flag:
        id = ''
        name = ''
        # d = {}
        mode = input("按照id查询输入1/按照姓名查询输入2\n")
        if mode == "1":
            id = input("请输入学生id:")
        elif mode == "2":
            name = input("请输入姓名:")
        else:
            print("输入出错,请重新输入")
            continue  # 结束本次循环,继续输入
        # 读取文件
        if os.path.exists(filename):  # 判断文件是否存在
            with open(filename, 'r') as file:  # r表示读取文件filename将其放入file中,文件指针放在文件的开头
                studentlist = file.readlines()  # 将file中的数据一行一行地读到studentlist中
                for list in studentlist:  # 遍历列表:将studentlist中的数据添加到list中
                    d = dict(eval(list))  # eval:转成字符串,dict:转字典
                    if id != '':
                        if d['id'] == id:
                            student_new.append(d)  # 如果d里面有信息,将信息放入stdent_new中
                    if name != '':
                        if d['name'] == name:
                            student_new.append(d)
                # 打印搜索结果
                printData(student_new)  # 调用函数
                student_new.clear()  # 清除上一次的搜索记录
                flag = int(input("是否继续查询(1:是/0;否):\n"))
        else:
            print("无数据")


def delete():
    show()
    flag = 1
    while flag:
        id1 = input("请输入需要删除的学生的id:")
        if id1 != '':
            # 读取所有学生信息
            if os.path.exists(filename):  # 判断
                with open(filename, 'r') as file1:  # 以读的方式打开filename将其放入file1中
                    student2 = file1.readlines()  # 将file1中的数据一行一行地读到student2中
            else:
                student2 = []  # 定义一个空列表
            flag1 = False
            if student2:
                with open(filename, 'w') as file2:  #
                    d = {}  # 定义一个空字典
                    for s in student2:  # 遍历列表:将student2中的数据添加到s中
                        d = dict(eval(s))  # eval:转字符串 dict:转字典. 得到一个学生字典
                        if d['id'] != id1:  # id不相等的将其写入实现删除
                            file2.write(str(d) + '\n')
                        else:
                            flag1 = True
                    if flag1:
                        print("id为" + id1 + "的学生已经被删除")
                    else:
                        print("没有找到id为" + id1 + "的同学")
            else:
                print("无该学生信息")
                # continue
            flag = int(input("是否继续删除(1:是/0;否):"))


def modify():
    show()
    flag = 1
    while flag:
        id1 = input("请输入要修改学生的id")
        if os.path.exists(filename):
            with open(filename, 'r') as file1:
                student2 = file1.readlines()
        else:
            return
        with open(filename, 'w') as file2:
            d = {}
            for s in student2:
                d = dict(eval(s))  # 得到一个学生字典
                if d["id"] == id1:  # 符合条件
                    while 1:
                        try:  # 若输入为空
                            d["name"] = input("请输入修改后的姓名")
                            d["yuwen"] = float(input("请输入修改后的语文成绩"))
                            d["shuxue"] = float(input("请输入修改后数学成绩"))
                            d["yingyu"] = float(input("请输入修改后的英语成绩"))
                        except:
                            print("输入无效,请重新输入")
                        else:
                            break
                    file2.write(str(d) + "\n")
                    print("修改成功")
                else:
                    file2.write(str(d) + "\n")
        flag = int(input("是否继续修改(1:是/0;否):"))

def sort():
    student_new = []
    if os.path.exists(filename):
        # 打开文件,读取数据
        with open(filename, 'r') as file:
            studentlist = file.readlines()  # 字符串
        # 将字符串转成dict存到列表中
        for list in studentlist:
            student_new.append(eval(list))
        # 排序
        a = input("1:升序,2:降序")
        if a == '1':
            a = False
        else:
            a = True
        b = input("请选择排列方式(1语文,2数学,3英语,4总成绩)")
        if b == "1":
            student_new.sort(key=lambda x: float(x['yuwen']), reverse=a)
        elif b == "2":
            student_new.sort(key=lambda x: float(x['shuxue']), reverse=a)
        elif b == "3":
            student_new.sort(key=lambda x: float(x['yingyu']), reverse=a)
        else:
            student_new.sort(key=lambda x: float(x['yuwen']) + float(x['shuxue']) + float(x['yingyu']), reverse=a)
        if student_new:
            printData(student_new)


def total():
    student_new = []
    if os.path.exists(filename):
        # 打开文件,读取数据
        with open(filename, 'r') as file:
            studentlist = file.readlines()  # 字符串
            if studentlist:
                print("一共有%d名学生" % len(studentlist))
            else:
                print("没有录入学生")
    else:
        print("未找到文件")


def show():  # 打开文件读取数据
    student_new = []
    if os.path.exists(filename):  # 判断出文件是否存在
        # 打开文件,读取数据
        with open(filename, 'r') as file:  # 将filename中的东西读到file中
            studentlist = file.readlines()  # 将file中的数据一行一行地读到sdentlist中字符串
        # 将字符串转成dict存到列表中
        for list in studentlist:
            student_new.append(eval(list))  #
        if student_new:  #
            printData(student_new)


# 注意这个函数可以用来计算语数外的总分,还可绘图,绘图我已经注释掉了
def tongji():
    sum_chinese = 0
    sum_math = 0
    sum_english = 0
    if os.path.exists(filename):  # 判断出文件是否存在
        # 打开文件,读取数据
        with open(filename, 'r') as file:  # 将filename中的东西读到file中
            studentlist = file.readlines()  # 将file中的数据一行一行地读到sdentlist中字符串
        # 将字符串转成dict存到列表中
        for list in studentlist:
            d = {}
            d = dict(eval(list))
            sum_chinese += d['yuwen']
            sum_math += d['shuxue']
            sum_english += d['yingyu']
    print("语文总分为:", sum_chinese, "数学总分为:", sum_math, "英语总分为:", sum_english)
    sum = sum_chinese + sum_math + sum_english

    labels = 'Chinese', 'math', 'English'  # 自定义标签
    sizes = [sum_chinese / sum, sum_math / sum, sum_english / sum]  # 每个标签占多大
    explode = (0.05, 0.05, 0.05)  # 将某部分爆炸出来
    #plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
    # autopct,圆里面的文本格式,%1.1f%%表示小数有1位,整数有一位的浮点数
    # shadow,饼是否有阴影
    # startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
    #plt.axis('equal')  # 设置x,y轴刻度一致,这样饼图才能是圆的
    #plt.show()


def printData(student_new):  #
    s = "{:^12}{:^13}\t{:^7}{:^7}\t{:^7}\t{:^7}"
    print(s.format("ID", "名字", "语文", "数学", "英语", "总成绩"))
    for info in student_new:
        y = "{:^6}{:^13}\t{:^8}{:^8}\t{:^8}\t{:^10}"
        print(y.format(info.get('id'),
                       str(info.get('name')),
                       str(info.get('yuwen')),
                       str(info.get('shuxue')),
                       str(info.get('yingyu')),
                       str(float(info.get('yuwen')) + float(info.get('shuxue')) + float(info.get('yingyu')))))


if __name__ == '__main__':  # 程序入口

    def showMessage():
        print(" ********************************")
        print("*     欢迎使用学生成绩管理系统      *")
        print('*      ---新建用户请按1---        *')
        print('*      ---登录帐号请按2---        *')
        print('*      ---退出程序请按0---        *')
        print("********************************")


    def newuser():
        studentlist = []
        while True:
            myname = input("请输入新建用户名:")
            user[myname] = input('请输入新建密码:')
            student = {'myname': myname, 'user[myname]': user[myname]}  # 准备账户密码的格式
            studentlist.append(student)  # 录入一个账户密码信息(字典)添加到列表中

            # 保存文件
            student_txt = open(filenamedl, 'a', encoding='utf-8')  # "a"追加
            # 将本次添加的账户信息全部放入到文件中
            for s in studentlist:  # 遍历列表
                student_txt.write(str(s) + "\n")  # 写入一行数据    #str表示将列表转成字符串
            student_txt.close()  # 关闭文件对象
            print("注册成功,赶紧登录试试吧")
            break


    def olderuser():
        studentlist = []
        list = []
        while True:
            inname = input('请输入登录用户名:')
            inpassword = input('请输入登录密码:')
            if os.path.exists(filenamedl):  # 判断文件是否存在
                with open(filenamedl, 'r', encoding='utf-8') as file3:
                    studentlist = file3.readlines()
                for i in studentlist:
                    d = dict(eval(i))
                    list.append(d)
                for j in list:
                    if j['myname'] == inname and j['user[myname]'] == inpassword:
                        print("登陆中......")
                        time.sleep(2)
                        main()
                print("账户或密码错误")
            else:
                print("未创建账户")
                break


    user = {}
    studentlist = []
    while True:
        showMessage()
        myIn = input('---请输入指令代码:')
        if myIn in '1':
            newuser()

        elif myIn in '2':
            olderuser()

        elif myIn in '0':
            print('程序已退出')
            break
        else:
            print('你输入的指令有误,重新输入。')
            continue

#
# # 1.拥有"安保系统":密码登录
# # 2:一·id限制输入11位(id重复?)  二·姓名不能为空且里面没有数字   三·语文数学英语成绩不能小于0,不能大于100
# # 3.提高代码利用率:因为这段代码需要反复出现,所以如果我们要提高代码利用率,我们将提取相同代码,放入新方法,因为printData随着student_new改变而改变,故而把student_new当作参数
# # 4:统计图:利用Anaconda绘制统计图使数据更直观
#
# # id重复
# from tkinter import *
# import random
# #定义函数,功能为生成有大写字母、小写字母、数字组成的6位随机验证码
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
2年前
Python3正则表达式
在Python中使用正则表达式Python语言通过标准库中的re模块(importre)支持正则表达式。使用match方法匹配字符串匹配字符串也就是设定一个文本模式,然后判断另外一个字符串是否符合这个文本模式。importre
Stella981 Stella981
2年前
Anaconda3详细安装使用教程及问题总结
注:本面文章来源于网络,转载请注明来自https://www.jianshu.com/p/026a2c43b081。1.Anaconda是什么?简单来说,Anaconda是Python的包管理器和环境管理器。_先来解决一个初学者都会问的问题:我已经安装了Python,那么为什么还需要Anaconda呢?原因有以下几点:_1.Ana
Stella981 Stella981
2年前
Python 学生管理
原文链接: Python学生管理(https://my.oschina.net/ahaoboy/blog/1526102)python3练手 codingutf8学生类classStu:三个字段id字符串,name字符串,score小数def__init__(sel
Wesley13 Wesley13
2年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Wesley13 Wesley13
2年前
Mysql 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩1\.查询课程ID为‘01’的课程的成绩第2名到第3名的学生信息及该课程成绩SELECT  d.,c.排名,c.s_score,c.c_idFROM  (SELECTa.s_id,a.s_score,a.c_id,@i:@i1AS排名FROMs
Stella981 Stella981
2年前
Android studio中创建一个Menu方法
1.先在res目录下新建一个menu文件夹(右键res目录NewDirectory)输入文件夹名为menu,点击OK2.在新建的menu目录下创建一个名为main的菜单文件(右键menu文件夹NewMenuresourcefile)输入文件名为main点击OK里面内容为:<itemandroid:
小万哥 小万哥
5个月前
Python 正则表达式(RegEx)指南
正则表达式(RegEx)是一系列字符,形成了一个搜索模式。RegEx可用于检查字符串是否包含指定的搜索模式。RegEx模块Python中有一个内置的包叫做re,它可以用于处理正则表达式。导入re模块:pythonimportrePython中的RegEx,
菜鸟小欧
菜鸟小欧
Lv1
夜闻归雁生乡思,病入新年感物华。
文章
5
粉丝
1
获赞
0