python 实现学生管理系统

需要实现的几个基本功能

	# 1.菜单展示
	# 2.增删改查
	# 3.本地保存读取

上代码

# -*- coding: utf-8 -*-
# @Date    : 2019-12-21 12:41:25
# @Author  : Flying Hu (1152598046@qq.com)
# @Link    : http://www.flyinghu.cn
# @name    : 学生信息管理系统
# @Version : 0.1


import json
import os
import time
# 1.菜单展示
# 2.增删改查
# 3.本地保存读取


class Student(object):
    '''学生类'''

    def __init__(self, name: str, age: 'int > 0', sex: str):
        '''初始化学生
        Args:
            name    学生姓名
            age     学生年龄
            sex     学生性别
        '''
        self.name = name
        self.age = age
        self.sex = sex

    def to_dict(self):
        return {'name': self.name, 'age': self.age, 'sex': self.sex}

    def __str__(self) -> str:
        return '%-8s%-8d%-8s' % (self.name, self.age, self.sex)


class ManageStudent(object):
    '''学生管理类'''
    # 单例设计
    __instance = None

    def __new__(cls):
        '''判断是否已经实例化'''
        if cls.__instance is None:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, students: list = []):
        ''''''
        self.students = students

    def __str__(self) -> str:
        return '学生总数: %d' % len(self.students)

    def add(self, student: Student) -> None:
        '''添加学生'''
        self.students.append(student)

    def search(self, name: str) -> Student:
        '''根据姓名查询学生
        Args:
            name    查询学生的姓名
        Returns:
            student 查询到的学生对象
        '''
        for student in self.students:
            if student.name == name:
                return student
        else:
            return None

    def insert(self, index: 'int >= 0', student: Student) -> None:
        '''插入学生'''
        self.students.insert(index, student)

    def insert_by_name(self, name: str, in_student: Student) -> bool:
        '''根据姓名插入学生'''
        # 1.先查询学生
        for i, student in enumerate(self.students):
            if student.name == name:
                self.students.insert(i + 1, in_student)
                return True
        else:
            return False

    def delete(self, name: str) -> bool:
        '''根据姓名删除学生'''
        for student in self.students:
            if student.name == name:
                self.students.remove(student)
                return True
        else:
            return False

    def update(self, name: str, up_student: Student) -> bool:
        '''根据姓名更新信息'''
        for i, student in enumerate(self.students):
            if student.name == name:
                self.students[i] = up_student
                return True
        else:
            return False


class SMS(object):
    '''学生管理系统'''

    def __init__(self, file: str = './students.json'):
        self.file = file
        self.manage = ManageStudent()
        self.load()

    def load(self):
        '''加载本地文件'''
        try:
            with open(self.file, 'r', encoding='utf-8') as f:
                students = json.load(f)['students']
                self.manage.students = [Student(student['name'], student['age'], student['sex']) for student in students]
        except Exception:
            self.manage.students = []

    def save(self):
        '''保存学生信息到本地文件中'''
        with open(self.file, 'w', encoding='utf-8') as f:
            json.dump({'students': [student.to_dict() for student in self.manage.students], 'save_time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}, f, ensure_ascii=False)

    def print_main_menu(self):
        self.menu_info = '''+-----------------------+
∣ 1)添加学生信息                                ∣
∣ 2)显示所有学生                                ∣
∣ 3)删除学生信息                                ∣
∣ 4)修改学生信息                                ∣
∣ 5)重置信息修改                                ∣
∣ 6)保存学生信息                                ∣
∣ 退出: 其他任意按键<回车>                    ∣
+-----------------------+'''
        print(self.menu_info)

    def get_option(self, option_str: str) -> int:
        try:
            option = int(option_str)
        except Exception:
            option = 0
        return option

    def run(self):
        # 定义flag, 用来跳出多层循环
        flag = True
        while flag:
            self.cls()
            self.print_main_menu()
            option_str = input()
            option = self.get_option(option_str)
            if option == 1:
                # 添加学生信息
                while flag:
                    self.cls()
                    print('*' * 20)
                    print('1) 在最后添加')
                    print('2) 在指定索引添加')
                    print('3) 在指定学生后添加')
                    print('4) 回到主菜单')
                    print('退出: 其他任意按键<回车>')
                    print('*' * 20)
                    option_str = input()
                    option = self.get_option(option_str)
                    if option == 4:
                        # 回到主菜单
                        break
                    elif option not in [1, 2, 3]:
                        # 退出
                        flag = False
                        continue
                    # 三种添加方式都要先创建学生对象
                    while True:
                        self.cls()
                        input_str = input(
                            '请输入学生的姓名 年龄 性别(使用","号隔开) <0:返回上一级>:')
                        if input_str == '0':
                            break
                        try:
                            name, age, sex = input_str.split(',', 2)
                        except Exception:
                            input_str = input(
                                '输入信息有误, 请重新输入, 按回车键继续 <0:返回上一级>')
                            if input_str == '0':
                                break
                            continue
                        # 判断输入
                        if len(name) > 10:
                            # 判断姓名长度是否小于10
                            input('输入学生姓名过长, 请重新输入, 按回车键继续')
                            continue
                        if not (age.isdigit() and 0 < int(age) < 50):
                            # 判断输入年龄是否为整数并且小于50大于0
                            input('输入学生年龄有误, 请重新输入, 按回车键继续')
                            continue
                        if sex not in ['男', '女']:
                            # 判断性别输入是否正确
                            input('输入学生年龄有误, 请重新输入, 按回车键继续')
                            continue
                        # 输入都合理, 创建学生对象
                        student = Student(name, int(age), sex)
                        break
                    # 判断选择的添加方式
                    self.cls()
                    if option == 1:
                        # 直接添加
                        self.manage.add(student)
                        print('添加成功')
                    elif option == 2:
                        # 在指定索引添加
                        while True:
                            input_str = input('输入添加位置索引: ')
                            if input_str.isdigit():
                                self.manage.insert(int(input_str), student)
                                print('添加成功')
                                break
                            else:
                                input_str = input(
                                    '输入有误, 请重新输入, 按回车键继续: <0:返回上一级>')
                                if input_str == '0':
                                    print('添加失败')
                                    break
                                continue
                    elif option == 3:
                        # 在指定姓名后添加
                        while True:
                            self.cls()
                            name = input('输入插入位置学生姓名: ')
                            if len(name) > 10:
                                # 判断姓名长度是否小于10
                                input_str = input(
                                    '输入学生姓名过长, 请重新输入, 按回车键继续: <0:返回上一级>')
                                if input_str == '0':
                                    print('添加失败')
                                    break
                                continue
                            if self.manage.insert_by_name(name, student):
                                print('添加成功')
                                break
                            else:
                                print('添加失败, 按回车键重新输入插入位置: <0:返回上一级>')
                                if input_str == '0':
                                    print('添加失败')
                                    break
                                continue
                    print('*' * 20)
                    print('1) 继续添加')
                    print('2) 回到主菜单')
                    print('退出: 其他任意按键<回车>')
                    print('*' * 20)
                    option_str = input()
                    option = self.get_option(option_str)
                    if option == 1:
                        continue
                    elif option == 2:
                        break
                    else:
                        flag = False
                        continue
            elif option == 2:
                self.cls()
                # 显示所有学生
                print('*' * 50)
                print('序号    姓名    年龄    性别')
                for i, student in enumerate(self.manage.students):
                    print('%-4d\t%-4s\t%-4d\t%-4s' % (i+1, student.name, student.age, student.sex))
                print('*' * 50)
                input('按回车键回到主菜单')
            elif option == 3:
                # 删除学生信息
                self.cls()
                while flag:
                    name = input('请输入需要删除学生的姓名:')
                    if self.manage.delete(name):
                        print(f'删除[{name}] 的信息成功')
                    else:
                        print(f'删除失败, 未找到[name] 的信息')
                    print('*' * 20)
                    print('1) 继续删除')
                    print('2) 回到主菜单')
                    print('退出: 其他任意按键<回车>')
                    print('*' * 20)
                    option_str = input()
                    option = self.get_option(option_str)
                    self.cls()
                    if option == 1:
                        continue
                    elif option == 2:
                        break
                    else:
                        flag = False
                        continue
            elif option == 4:
                while flag:
                    self.cls()
                    # 修改学生信息
                    input_str = input('请输入学生的姓名 年龄 性别(使用","号隔开) <0:返回上一级>:')
                    if input_str == '0':
                        break
                    try:
                        name, age, sex = input_str.split(',', 2)
                    except Exception:
                        input_str = input('输入信息有误, 请重新输入, 按回车键继续 <0:返回上一级>')
                        if input_str == '0':
                            break
                        continue
                    # 判断输入
                    if len(name) > 10:
                        # 判断姓名长度是否小于10
                        input('输入学生姓名过长, 请重新输入, 按回车键继续')
                        continue
                    if not (age.isdigit() and 0 < int(age) < 50):
                        # 判断输入年龄是否为整数并且小于50大于0
                        input('输入学生年龄有误, 请重新输入, 按回车键继续')
                        continue
                    if sex not in ['男', '女']:
                        # 判断性别输入是否正确
                        input('输入学生年龄有误, 请重新输入, 按回车键继续')
                        continue
                    # 输入都合理, 创建学生对象
                    student = Student(name, int(age), sex)
                    self.cls()
                    if self.manage.update(name, student):
                        print('修改成功')
                    else:
                        print('修改失败')
                    print('*' * 20)
                    print('1) 继续修改')
                    print('2) 回到主菜单')
                    print('退出: 其他任意按键<回车>')
                    print('*' * 20)
                    option_str = input()
                    option = self.get_option(option_str)
                    if option == 1:
                        continue
                    elif option == 2:
                        break
                    else:
                        flag = False
                        continue

            elif option == 5:
                # 重置信息修改
                self.cls()
                self.load()
                input('重置成功, 输入任意键重启应用')
                continue
            elif option == 6:
                # 保存学生信息
                self.cls()
                self.save()
                input('保存成功, 输入任意键回到主菜单')
                continue
            else:
                # 退出
                flag = False
                continue
        print('退出程序')
        self.quit()

    def cls(self):
        '''清空控制台输出'''
        os.system('cls')

    def quit(self):
        '''退出程序'''
        # 退出程序自动保存
        self.save()


if __name__ == "__main__":
    s = SMS()
    s.run()

代码下载地址

StuInfoMS.py–>https://download.csdn.net/download/flyinghu123/12045535

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值