学生管理系统(列表嵌套字典)

"""
需求:
    1. 先打印提示界面(1-6的数字), 让用户选择他/她要进行的操作.
    2. 当用户选择1的时候, 实现操作: 添加学生(学生编号, 学生姓名, 手机号).
    3. 当用户选择2的时候, 实现操作: 删除学生(根据编号删除)
    4. 当用户选择3的时候, 实现操作: 修改学生信息(只能改姓名, 手机号)
    5. 当用户选择4的时候, 实现操作: 查询单个学生信息(根据姓名查)
    6. 当用户选择5的时候, 实现操作: 查询所有学生信息
    7. 当用户选择6的时候, 实现操作: 退出系统

思路:
    1. 定义函数 print_info(), 用来打印: 提示信息.
    2. 定义函数 student_cms(), 表示: 具体的业务逻辑.     Content Management System: 内容管理系统
    3. 定义函数 add_info(), 用来表示: 添加学生信息(编号, 姓名, 手机号)
        细节: 学号具有唯一性, 姓名可以重复.
    4. 定义函数 del_info(), 用来表示: 删除学生信息.
        思路1: 根据 学号 删除.  del_by_id()
        思路2: 根据 姓名 删除.  del_by_name()
    5. 定义函数 update_info(), 用来表示: 修改学生信息.
        细节: 根据学号来修改 姓名, 手机号.
    6. 定义函数 search_one(), 用来表示: 查询单个学生信息.
        思路1: 根据 学号 查询.  search_by_id()
        思路2: 根据 姓名 查询.  search_by_name()
    7. 定义函数 search_all(), 用来表示: 查询所有学生信息.
        细节: 有可能暂无学生信息, 查询时要进行对应的提示.

可以优化的地方:
    1. 对手机号做限定, 合法手机号, 且唯一.
    2. 根据姓名删除时, 有三种情况:
        场景1: 该姓名不存在, 直接提示即可.
        场景2: 该姓名只有1个, 直接删除并提示即可.
        场景3: 该姓名有多个, 就把该姓名所有的信息都打印出来, 提示给用户最选择, 例如: 1 => 删除所有,  2 => 录入某个id, 进行指定删除,  其他 => 非法信息, 重新操作!
    3. 修改的动作.
        场景1: 根据学号 修改 => 姓名, 手机号.
        场景2: 根据 姓名 修改, 找不到就提示, 找到了就打印所有该姓名的学生信息, 提示用户进行具体操作.
            例如: 1 => 录入某个id, 进行指定修改,  其他 => 非法信息, 重新操作!
"""


# 1. 定义函数 print_info(), 用来打印: 提示信息.
def print_info():
    """
    自定义的函数, 用于打印: 提示信息的.
    :return: 无
    """
    # print('-' * 30)
    # print('欢迎来到学生管理系统, 已研发功能如下:')
    print('1.添加学生')
    print('2.删除学生')
    print('3.修改学生信息')
    print('4.查询单个学生信息')
    print('5.查询所有学生信息')
    print('6.退出系统')
    # print('-' * 30)


# 2. 定义函数 student_cms(), 表示: 具体的业务逻辑.     Content Management System: 内容管理系统
def student_cms():
    # 2.1 因为要重复做, 所以加入: while True循环.
    while True:
        # 2.2 调用 print_info(), 打印提示信息.
        print_info()

        # 2.3 提示用户录入他/她要操作的编号, 并接收.
        input_num = input('请录入您要操作的编号: ')  # '1', '2'...

        # 2.4 根据用户录入的编号, 进行对应的操作.
        if input_num == '1':
            # print('添加学生信息\n')
            add_info()  # 调用函数, 完成添加学生信息的动作.
        elif input_num == '2':
            # print('删除学生\n')
            del_info()
        elif input_num == '3':
            # print('修改学生信息\n')
            update_info()
        elif input_num == '4':
            # print('查询单个学生信息\n')
            search_one()
        elif input_num == '5':
            # print('查询所有学生信息\n')
            search_all()  # 调用函数, 查看所有学生信息.
        elif input_num == '6':
            print('谢谢您的使用, 期待下次再会!')
            break  # 结束循环.
        else:
            print('录入有误, 请重新录入!\n')


# 3. 定义函数 add_info(), 用来表示: 添加学生信息(编号, 姓名, 手机号)
# 细节: 学号具有唯一性, 姓名可以重复.
# 3.1 定义 stu_info(列表嵌套字典), 用来存储学生信息.
stu_info = []       # 这个才是合法的基于业务定义的变量.
# 目前是测试节点, 为了防止每次都要大量的重复的添加数据, 我们可以手动先给一下测试数据, 项目正式上线的时候, 删除即可.
# stu_info = [
#     {'id': 'student01', 'name': '乔峰', 'phone': '111'},
#     {'id': 'student02', 'name': '虚竹', 'phone': '222'},
#     {'id': 'student03', 'name': '段誉', 'phone': '333'},
#     {'id': 'student04', 'name': '段誉', 'phone': '333'},
#     {'id': 'student05', 'name': '段誉', 'phone': '333'}
# ]


# 3.2 定义函数, 完成具体的 添加学生信息的动作.
def add_info():
    # 3.3 提示用户录入学生的学号, 并接收.
    new_id = input('请录入要添加的学生编号:')
    # 3.4 遍历学生列表, 看该学号是否存在, 如果存在, 则提示用户学号已存在, 程序结束.
    for stu in stu_info:
        # stu就是每个学生的信息, 格式为: {'id': 'student01', 'name': '乔峰', 'phone': '111'}
        # 判断学号是否存在.
        if stu['id'] == new_id:
            print(f'学号 {new_id}已存在, 请重新操作!\n')
            break  # 记得break, 表示: 添加动作结束.
    else:
        # 3.5 走到这里, 说明学号不存在, 可以添加. 即: 提示用户录入他/她的 姓名和手机号.
        new_name = input('请录入要添加的学生姓名:')
        new_phone = input('请录入要添加的学生手机号:')
        # 3.6 把上述的学生信息, 封装成 字典.
        new_stu = {'id': new_id, 'name': new_name, 'phone': new_phone}
        # 3.7 把封装好的学生信息(字典形式), 添加到学生列表中.
        stu_info.append(new_stu)
        # 3.8 提示用户添加成功.
        print('添加学生信息成功!\n')


# 4. 定义函数 del_info(), 用来表示: 删除学生信息.
# 思路1: 根据 学号(唯一) 删除.  del_by_id()
def del_by_id():
    # 4.1 提示用户录入要删除的学号, 并接收.
    del_id = input('请录入要删除的学生编号: ')
    # 4.2 遍历学生列表 stu_info, 看有无该学生信息.
    for stu in stu_info:
        # stu就是每个学生的信息, 格式为: {'id': 'heima01', 'name': '乔峰', 'phone': '111'}
        # 4.3 判断学号是否存在.
        if stu['id'] == del_id:
            # 4.4 走这里, 说明学号存在, 删除, 并提示即可.
            stu_info.remove(stu)
            print(f'删除学号为 {del_id} 的学生信息成功!\n')
            # 记得 break
            break
    else:
        # 4.5 走到这里, 说明学号不存在.
        print(f'该学号 {del_id} 不存在, 请重新操作!\n')

# 思路2: 根据 姓名(可重复) 删除.  del_by_name()
def del_by_name():
    # 4.0 采用 标记变量 思维, 判断 是否有删除学生信息.
    flag = False        # True: 删除学生信息了, False: 没有删除学生信息.
    # 4.1 提示用户录入要删除的学生姓名, 并接收.
    del_name = input('请录入要删除的学生姓名: ')
    # 4.2 遍历学生列表 stu_info, 看有无该学生信息.
    i = 0
    while i < len(stu_info):    # i 就是每个学生的 索引信息.
        # stu_info[i] 每个学生的信息, 格式为: {'id': 'student01', 'name': '乔峰', 'phone': '111'}
        # 4.3 判断 姓名 是否存在.
        if stu_info[i]['name'] == del_name:
            # 4.4 走这里, 说明姓名存在, 删除, 并提示即可.
            # stu_info.remove(stu_info[i])
            stu_info.pop(i)
            # 索引要 - 1
            i -= 1
            # 删除学生信息了, 记得修改标记变量的状态.
            flag = True
        # 4.5 走到这里, 说明当前学生信息校验完毕, 校验下个学生信息即可.
        i += 1
    # 4.6 根据flag变量的值, 进行对应的提示即可.
    # if flag:
    #     print(f'该姓名 {del_name} 删除成功!\n')
    # else:
    #     print(f'该姓名 {del_name} 不存在, 请重新操作!\n')
    print(f'该姓名 {del_name} 删除成功!\n' if flag else f'该姓名 {del_name} 不存在, 请重新操作!\n')

# 优化: 把上述的两个函数, 封装成1个函数即可, 具体如下
def del_info():
    # (再次)询问用户, 根据id删, 还是根据姓名删.
    input_n = input('请选择删除方式, 1:根据id删, 2:根据姓名删, 输入其它键则返回主界面: ')
    if input_n == '1':
        del_by_id()  # 调用函数, 完成删除学生信息的动作. 根据id删
    elif input_n == '2':
        del_by_name()  # 调用函数, 完成删除学生信息的动作. 根据姓名删.
    else:
        print('录入有误, 请重新操作!\n')


# 5.定义函数 update_info(), 用来表示: 修改学生信息.
# 细节: 根据学号来修改 姓名, 手机号.
def update_info():
    # 5.1 提示用户录入要修改的学号, 并接收.
    update_id = input('请录入要修改信息的学号: ')
    # 5.2 判断该学号是否存在.
    for stu in stu_info:
        # stu就是每个学生的信息, 格式为: {'id': 'student01', 'name': '乔峰', 'phone': '111'}
        # 5.3 走这里, 说明 id存在.
        if stu['id'] == update_id:
            # 5.4 提示用户录入修改后的学生信息(姓名, 手机号)
            new_name = input('请录入修改后的学生姓名: ')
            new_phone = input('请录入修改后的手机号: ')
            # 5.5 用新的信息 => 替换(覆盖)之前旧的信息.
            stu['name'] = new_name      # 因为字典属于可变类型, 所以直接改值即可.
            stu['phone'] = new_phone
            # 5.6 提示
            print(f'学号为 {update_id} 的学生信息, 修改成功!\n')
            # 5.7 细节
            break   # 学号具有唯一性.
    else:
        # 5.8 走这里, 说明 没找到这个学号, 提示即可.
        print(f'学号为 {update_id} 的学生信息不存在, 请重新操作!\n')

# 6. 定义函数 search_one(), 用来表示: 查询单个学生信息.
# 思路1: 根据 学号(唯一) 查询.  search_by_id()
def search_by_id():
    # 6.1 提示用户录入要查询的学号, 并接收.
    search_id = input('请录入要查询的学生编号: ')
    # 6.2 遍历学生列表 stu_info, 看有无该学生信息.
    for stu in stu_info:
        # 6.3 走这里, 说明学号存在, 打印学生信息即可.
        if stu['id'] == search_id:
            print(f"学号: {stu['id']}, 姓名: {stu['name']}, 手机号: {stu['phone']}\n")
            # 细节: 学号具有唯一性, 找到了就break
            break
    else:
        # 6.4 走这里, 说明没找到, 提示即可.
        print(f'该学号 {search_id} 不存在, 请重新操作!\n')

# 思路2: 根据 姓名(可重复) 查询.  search_by_name()
def search_by_name():
    # 6.0 标记变量思想.
    flag = False        # True: 查询到了, False: 没查询到.
    # 6.1 提示用户录入要查询的学生姓名, 并接收.
    search_name = input('请录入要查询的学生姓名: ')
    # 6.2 遍历学生列表 stu_info, 看有无该学生信息.
    for stu in stu_info:
        # 6.3 走这里, 说明 姓名 存在, 打印学生信息即可.
        if stu['name'] == search_name:
            print(f"学号: {stu['id']}, 姓名: {stu['name']}, 手机号: {stu['phone']}")
            # 细节: 修改标记变量的状态.
            flag = True
    # # 6.4 根据标记变量的结果, 进行提示即可.
    # if not flag:
    #     # 走这里, 说明没找到.
    #     print(f'姓名为 {search_name} 的学生信息不存在, 请重新操作!\n')
    # else:
    #     # 6.5 走到这里, 说明找到了, 加个换行即可, 效果更好看.
    #     print()

    # 优化版, 上述的if.else 可以用 三元表达式 来替换.
    print(f'姓名为 {search_name} 的学生信息不存在, 请重新操作!\n' if not flag else '')

# 优化: 把上述的两个函数, 封装成1个函数即可, 具体如下
def search_one():
    # (再次)询问用户, 根据id查, 还是根据姓名查.
    input_n = input('请选择查询方式, 1:根据id查, 2:根据姓名查, 输入其它键则返回主界面: ')
    if input_n == '1':
        search_by_id()  # 调用函数, 完成查询学生信息的动作. 根据id查
    elif input_n == '2':
        search_by_name()  # 调用函数, 完成查询学生信息的动作. 根据姓名查.
    else:
        print('录入有误, 请重新操作!\n')

# 7. 定义函数 search_all(), 用来表示: 查询所有学生信息.
# 细节: 有可能暂无学生信息, 查询时要进行对应的提示.
def search_all():
    # 7.1 判断是否有学生信息.
    if len(stu_info) > 0:
    # if stu_info:
        # 7.2 走这里, 说明有学生信息, 打印即可.
        for stu in stu_info:
            print(f"学号: {stu['id']}, 姓名: {stu['name']}, 手机号: {stu['phone']}")
        print() # 打印完所有学生信息后, 加个换行, 更好看.
    else:
        # 7.3 走这里, 说明暂无学生信息, 提示即可.
        print('暂无学生信息, 请添加后再查询!\n')


# 在main方法中测试.
if __name__ == '__main__':
    # 启动学生管理系统.
    student_cms()
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值