结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py

目录

  • 一、系列文章链接
  • 二、实现效果
    • (1)添加学生信息
    • (2)删除学生信息
      • ①删除一个学生
      • ②删除一个班级
    • (3)修改学生信息
      • ①学号
      • ②成绩
  • 三、manage.py的函数简介
    • (1)增加和修改可共用的
    • (2)添加学生
    • (3)删除学生
    • (3)修改学生信息
  • 四、代码

一、系列文章链接

(一):程序介绍和流程图
(二):主要文件main.py
(三):基础文件basics.py
(四):管理学生信息manage.py
(五):查询学生信息query.py
(六):导入数据文件import_data.py
(七):导出数据文件export_data.py

二、实现效果

结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第1张图片
(发现这个菜单之前没有截图,补上)结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第2张图片

(1)添加学生信息

结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第3张图片
结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第4张图片

(2)删除学生信息

①删除一个学生

结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第5张图片

②删除一个班级

出错提示
结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第6张图片
将会删除Sclass是20181121的学生
结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第7张图片

(3)修改学生信息

结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第8张图片
在这里插入图片描述

①学号

结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第9张图片

②成绩

结合sqlite3的学生信息成绩管理系统(四):管理学生信息manage.py_第10张图片


三、manage.py的函数简介

  1. def main( cn):
    “”“调用add_stu,del_stu,modify_stu函数”""

  2. def is_valid_date(str_date):
    ‘’‘判断是否是一个有效的日期字符串’’’

  3. class Display():
    “”“多个显示函数的集合”""

(1)增加和修改可共用的

  1. def add_modify_sno( cn):
    ‘’‘确保新的学号不存在’’’

  2. def add_modify_grade( cn, sno):
    ‘’‘增加或修改成绩’’’

(2)添加学生

  • def add_stu( cn):
    “”“添加一个学生”""

(3)删除学生

  1. def del_stu( cn):
    “”“删除学生,调用del_one_stu 和del_one_sclass “””

  2. def del_one_stu( cn):
    “”“删除一个学生”""

  3. def del_one_sclass( cn):
    “”“删除一个班级的学生”""

(3)修改学生信息

  1. def modify_stu( cn):
    “”“修改学生信息,调用modify_one_stu”""

  2. def modify_one_stu( cn):
    “”“选择需要修改的信息,并调用相应函数”""

  3. def old_to_new( cn, sno, china, english):
    “”“显示旧的信息,调用修改函数”""

  4. def where_sno_find( cn, sel, sno):
    “”“按学号进行查找返回信息”""

  5. def where_sno_update( cn, upda, upda_infor, sno):
    “”“按学号进行修改信息”""

四、代码

# 管理学生信息

import os
import time
import basics as ba

def is_valid_date(str_date):
    '''判断是否是一个有效的日期字符串'''
    try:
        time.strptime(str_date, "%Y-%m-%d")
    except Exception:
        return 0

class Display():
    """多个显示函数的集合"""
    def __init__(self):
        pass

    def prefix( self, name):
        print("****************************")
        print("  %s菜单" % name)
        print("****************************")

    def main_show(self):
        self.prefix("管理学生信息")
        print("\t 1:添加学生信息")
        print("\t 2:删除学生信息")
        print("\t 3:修改学生信息")
        print("\t 0:返回主菜单")
        print("****************************\n")

    def del_show(self):
        self.prefix("\t删除")
        print("\t 1:删除一个学生")
        print("\t 2:删除一个班级")
        print("\t 0:返回管理菜单")
        print("****************************\n")

    def modify_show(self):
        self.prefix("\t修改")
        print("\t 1:修改一个学生")
        print("\t 0:返回管理菜单")
        print("****************************\n")

    def modify_one_show(self):
        self.prefix("修改这个学生的")
        print("\t 1:学号")
        print("\t 2:姓名")
        print("\t 3:性别")
        print("\t 4:出生日期")
        print("\t 5:班级")
        print("\t 6:居住地")
        print("\t 7:成绩")
        print("\t 0:返回修改菜单")
        print("****************************\n")

#增加和修改可共用的
def add_modify_sno( cn):
    '''确保新的学号不存在'''
    newsno = input("\n请输入新的学号(10位数字):")
    if len( newsno) != 10:
        print("输入的数字太长或太短,"
              "请重新输入")
        return 0

    #判断是否存在,不存在 等于0
    count = ba.judge_comment\
        ( cn, 'Students', 'Sname', 'Sno', newsno)

    #存在的话,覆盖前需要删除操作
    if count != 0:
        confirm = input("学号'%s'已存在,"
                        "是否覆盖?(Y/N)" % newsno)
        if confirm == 'n' or confirm == 'N':
            return 0
        else:
            ba.del_students( cn, newsno)
    return newsno

def add_modify_grade( cn, sno):
    '''增加或修改成绩'''
    while 1:
        cno = 0
        while cno == 0:
            cname = input("\n请输入课程名")
            cno = ba.judge_creat_cname( cn, cname)

        sql = '''SELECT DISTINCT Racademicyear, 
                        Rterm, Grade
                FROM Reports
                WHERE Sno = '%s' and Cno = '%s'
                ''' % ( sno, cno)
        sstu = ba.common( cn, sql)
        count = 0
        for stu in sstu:
            print("选课学年:%s\t选课学期:%s\t成绩:%s"
                  % (stu[0], stu[1], stu[2]))
            count = count + 1
        if count != 0:
            confirm = input("请问是否覆盖?(Y/N)")
            if confirm == 'n' or confirm == 'N':
                judge = input("\n是否继续添加/修改成绩?(Y/N)")
                if judge == 'n' or judge == 'N':
                    return
                else:
                    continue
            else:
                ba.del_reports( cn, sno, cno)

        year = int(input( "\n输入你想增加或修改的学年:"))
        term = int(input( "输入你想增加或修改的学期:"))
        grade = input("请输入%s学年第%s学期的%s的成绩:"%
                      (year, term, cname))

        sql = '''insert into Reports 
                ( Sno, Cno, Racademicyear, Rterm, Grade)
                values( '%s', '%s','%s', '%s', '%s')
             ''' % ( sno, cno, year, term, grade)
        cn.execute( sql)
        cn.commit()
        print("\n增加或修改成功!")

        judge = input("\n是否继续添加/修改成绩?(Y/N)")
        if judge == 'n' or judge == 'N':
            return

#添加学生
def add_stu( cn):
    while 1:
        i = input("\n按下回车键后,将清空屏幕")
        i = os.system("cls")

        sno = add_modify_sno( cn)
        if sno == 0:
            continue

        sname = input("请输入姓名:")
        ba.insert_students( cn, sno, sname)

        while 1:
            sgender = input("请输入性别(男/女):")
            if sgender != '男' and sgender != '女':
                print("请输入'男'或'女'")
                continue
            else:
                where_sno_update( cn, 'Sgender', sgender, sno)
                break

        confirm = input("\n是否输入出生日期?(Y/N)")
        if confirm == 'y' or confirm == 'Y':
            while 1:
                sbirth = input("请输入出生日期:"
                              "(eg:2000-01-01)")
                count = 0
                try:
                    time.strptime(sbirth, "%Y-%m-%d")
                except Exception:
                    print("请输入正确的日期格式"
                          "(eg:2000-01-01)")
                    continue
                break

            where_sno_update( cn, 'Sbirth', sbirth, sno)

        confirm = input("\n是否输入居住地?(Y/N)")
        if confirm == 'y' or confirm == 'Y':
            snative = input("请输入居住地:")
            where_sno_update( cn, 'Snative', snative, sno)

        confirm = input("\n是否输入成绩?(Y/N)")
        if confirm == 'y' or confirm == 'Y':
           add_modify_grade( cn, sno)

        confirm = input("\n是否继续添加学生?(Y/N)")
        if confirm == 'n' or confirm == 'N':
            break

#删除学生
def del_one_stu( cn):
    """删除一个学生"""
    sno = input("请输入需要删除的学生的学号:")
    count = ba.judge_comment\
        ( cn, 'Students', 'Sname', 'Sno', sno)
    if count == 0:
        print("学号不存在,请重新输入")
        return

    confirm = input("请问确认删除这个学生"
                    "在数据库中的全部信息吗?(Y/N)")
    if confirm == 'y' or confirm == 'Y':
        ba.del_students( cn, sno)

def del_one_sclass( cn):
    """删除一个班级的学生"""
    sclass = input("请输入需要删除的班级(8位数字):")
    if len( sclass) != 8:
        print("输入的数字太长或太短,"
              "请重新输入")
        return

    sql = "SELECT DISTINCT Sno FROM Students " \
          "WHERE Sclass = '%s'" % sclass
    cursor = cn.execute( sql)  #这个corsor要用到
    count = 0
    for row in cursor:
        count = count + 1
    if count == 0:
        print("班级不存在学生,请重新输入")
        return

    confirm = input("请问确认删除这个班级"
                    "在数据库中的全部信息吗?(Y/N)")
    if confirm == 'y' or confirm == 'Y':
        sql = "SELECT DISTINCT Sno FROM Students " \
              "WHERE Sclass = '%s'" % sclass
        cursor = cn.execute( sql) #这个corsor要用到
        for row in cursor:
            ba.del_students( cn, row[0])

def del_stu( cn):
    """删除学生,调用del_one_stu 和del_one_sclass """
    while 1:
        i = input("\n按下回车键后,将清空屏幕")
        i = os.system("cls")
        display = Display()
        display.del_show()
        try:
            m22 = int( input("请输入选项:"))
        except ValueError:
            print("请重新输入正确的数字选项")
            continue

        if m22 == 1:
            del_one_stu( cn)
        elif m22 == 2:
            del_one_sclass( cn)
        elif m22 == 0:
            return
        else:
            print("无效的命令,请重新输入")

#修改学生信息
def where_sno_find( cn, sel, sno):
    """按学号进行查找返回信息"""
    sql = '''SELECT DISTINCT %s
            FROM Students       
            WHERE Sno = '%s'
         ''' % ( sel, sno)
    cursor = cn.execute(sql)
    information = []
    count = 0
    for row in cursor:
        information.append( row[0])
        count = count + 1
    if count == 1:
        return information[0]
    else:
        return 0

def where_sno_update( cn, upda, upda_infor, sno):
    """按学号进行修改信息"""
    sql = "UPDATE Students SET %s = '%s'" \
          "WHERE Sno = '%s'"\
          % ( upda, upda_infor, sno)
    cn.execute(sql)
    cn.commit()

def old_to_new( cn, sno, china, english):
    """显示旧的信息,调用修改函数"""
    old = where_sno_find( cn, english, sno)
    print("\n原来的%s为:%s" % (china, old))

    new = input("请输入新的%s:" % china)
    where_sno_update( cn, english, new, sno)

def modify_one_stu( cn):
    """选择需要修改的信息,并调用相应函数"""
    display = Display()
    i = input("\n按下回车键后,将清空屏幕")
    i = os.system("cls")
    while 1:
        sno = input("请输入需要修改信息的学生学号:")
        count = ba.judge_comment\
            ( cn, 'Students', 'Sname', 'Sno', sno)
        if count == 0:
            print("学号不存在,请重新输入")
            continue
        else:
            break

    while 1:
        i = input("\n按下回车键后,将清空屏幕")
        i = os.system("cls")
        display.modify_one_show()
        try:
            m231 = int( input("请输入选项:"))
        except ValueError:
            print("请重新输入正确的数字选项")
            continue

        if m231 == 1: #修改学生的学号
            print("\n原来的学号为:",sno)
            change_sno = add_modify_sno( cn)
            if change_sno != 0:
                sql = "UPDATE Reports SET Sno = '%s'" \
                      "WHERE Sno = '%s'" \
                      % ( change_sno, sno)
                cn.execute(sql)
                cn.commit()

                where_sno_update( cn, 'Sno', change_sno, sno)
                sno = change_sno

        elif m231 == 2: #修改学生的姓名
            old_to_new( cn, sno, '姓名', 'Sname')
        elif m231 == 3: #修改学生的性别
            old_to_new( cn, sno, '性别', 'Sgender')
        elif m231 == 4: #修改学生的出生日期
            old_to_new( cn, sno, '出生日期', 'Sbirth')
        elif m231 == 5: #修改学生的班级
            old_to_new( cn, sno, '班级', 'Sclass')
        elif m231 == 6: #修改学生的居住地
            old_to_new( cn, sno, '居住地', 'Snative')
        elif m231 == 7: #修改成绩
            add_modify_grade( cn, sno)
        elif m231 == 0: #返回修改菜单
            return
        else:
            print("无效的命令,请重新输入")

def modify_stu( cn):
    """修改学生信息,调用modify_one_stu"""
    display = Display()
    while 1:
        i = input("\n按下回车键后,将清空屏幕")
        i = os.system("cls")
        display.modify_show()
        m23 = input("请输入选项:")

        if m23 == '1':
            modify_one_stu( cn)
        elif m23 == '0':
            return
        else:
            print("无效的命令,请重新输入")

#主函数
def main( cn):
    """调用add_stu,del_stu,modify_stu函数"""
    while 1:
        i = input("\n按下回车键后,将清空屏幕")
        i = os.system("cls")
        display = Display()
        display.main_show()
        try:
            m2 = int( input("请输入选项:"))
        except ValueError:
            print("请重新输入正确的数字选项")
            continue

        if m2 == 1: #添加学生 √
            add_stu( cn)
        elif m2 == 2: #删除学生 √
            del_stu( cn)
        elif m2 == 3: #修改学生信息 √
            modify_stu( cn)
        elif m2 == 0:
            i = input("\n按下回车键后,将清空屏幕,"
                      "返回主菜单")
            i = os.system("cls")
            return
        else:
            print("无效的命令,请重新输入")


如果文章对你有帮助,点赞是对我最好的鼓励了!

你可能感兴趣的:(python)