【Python基础编程253 ● 项目 ● 学生管理系统SMS】


 ---------Python基础编程---------

Author : AI菌


 

【一、项目开发步骤】

1.学生管理系统-项目演示
2.学生管理系统-项目分析
3.学生管理系统-搭建主体框架
4.学生管理系统-添加学生
5.学生管理系统-显示全部
6.学生管理系统-查询一个学生
7.学生管理系统-修改一个学生
8.学生管理系统-删除一个学生
9.学生管理系统-把字典数据写到文件中
10.学生管理系统-从文件中读取数据存储到字典中

 

【1、项目演示】

输入对应数字,调用系统对应功能

 

 

 

 

 

 

 

【2、项目分析】

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

【3、搭建主体框架】

主要函数:

1、main.py      #编写启动学生管理系统的代码
2、student.py  # 定义学生类
3、student_manager.py  # 实现学生管理系统的主要功能
4、student.txt # 存储内存中学生信息到txt文件,防止断电后信息丢失

student_manager.py框架:

# 1.显示菜单
       # print("调用 显示菜单 的功能")
# 2.提示录入菜单编号
# 3.判断菜单编号
         # 4.根据判断的结果调用对应的功能
                # print("调用 1.添加的学生 的功能")
         # 4.根据判断的结果调用对应的功能
               # print("调用 2.显示全部 的功能")
         # 4.根据判断的结果调用对应的功能
                # print("调用 3.查询学生 的功能")
         # 4.根据判断的结果调用对应的功能
                # print("调用 4.修改学生 的功能")
          # 4.根据判断的结果调用对应的功能
                # print("调用 5.删除学生 的功能")
          # 4.根据判断的结果调用对应的功能
                # print("调用 0.退出系统 的功能")
          # 4.根据判断的结果调用对应的功能
                # print("录入的菜单编号有误,请重新录入!!!")     

# 显示菜单 show_menu 函数     
# 添加学生 add_student 函数   
# 显示全部学生信息 show_all 函数   
# 查询学生信息 find_student 函数   
#修改学生信息 update_student 函数
# 删除学生信息 delete_student 函数   
# 把字典中的学生的数据覆盖写到文件中 dict_to_file  函数
# 把文件中的学生的数据覆盖写到字典中 file_to_dict  函数
  

 

【4、添加学生】

    def add_student(self):
        """
        添加学生
        """
        # 这段代码 控制不能录入重复的学号的
        while True:
            # 1.提示录入一个学号
            id = input("请输入学号:")
            # 2.判断学号是否重复,如果重复,需要重新录入
            if id in self.student_dict:
                print("学号已经被占用,请使用一个不同的学号!!!")
                continue
            else:
                break

        # 3.提示录入姓名和分数
        name = input("请输入姓名:")
        score = input("请输入分数:")
        # 4.使用录入的学号,姓名,分数创建一个学生对象
        s = Student(id, name, score)
        # 5.把学号作为key,对象作为value,添加到字典
        self.student_dict[id] = s
        # 6.提示添加成功
        print(f"添加{id}成功!!!")
View Code

 

【5、显示全部学生信息】

    def show_all(self):
        """
         #显示全部学生信息
        """
        # 先判断系统中是否有学生信息,如果有:
        if len(self.student_dict) > 0:
            # 1.打印表头,和上面的那条线
            print("学号".ljust(15) + "姓名".ljust(15) + "分数".ljust(15))
            print("-" * 45)
            # 2.得到字典中所有的value组成的列表
            student_list = self.student_dict.values()
            # 3.遍历列表,每个元素都是一个学生对象
            for student in student_list:
                id = student.id
                name = student.name
                score = student.score
                # 4.在循环里面,得到学号,姓名,分数,打印成一行
                print(id.ljust(15) + name.ljust(15) + score.ljust(15))
            # 5.在循环结束后,打印下面那条线
            print("-" * 45)
        else:
            # 如果系统中没有学生信息,就提示"系统中还没有学生信息!!!"
            print("系统中还没有学生信息!!!")
View Code

 

【6、查询一个学生】

    def find_student(self):
        """
        根据学号查询一个学生
        """
        # 1.提示录入学号
        id = input("请输入学号:")
        # 2.查找学号在系统是否存在
        if id not in self.student_dict:
            # 3.如果不存在,就提示系统中没有此学生
            print(f"系统中没有学号为{id}的学生!!!")
        else:
            # 4.如果存在:
            # 4.1 打印表头和那条线
            print("学号".ljust(15) + "姓名".ljust(15) + "分数".ljust(15))
            print("-" * 45)
            # 4.2 得到这个学号对应的学生对象
            s = self.student_dict.get(id)
            id = s.id
            name = s.name
            score = s.score
            # 4.3 得到学号,姓名,分数,打印成一行
            print(id.ljust(15) + name.ljust(15) + score.ljust(15))
            # 4.4 打印出下面那条线
            print("-" * 45)
View Code

 

【7、修改一个学生】

    def update_student(self):
        """
        根据学号修改一个学生信息
        """
        # 1.提示录入学号
        id = input("请录入要修改学生的学号:")
        # 2.查找学号在系统是否存在
        if id not in self.student_dict:
            # 3.如果不存在,就提示系统中没有此学生
            print(f"系统中没有学号为{id}的学生")
        else:
            # 4.如果有,提示录入新的姓名和分数
            name = input("请录入新的姓名:")
            score = input("请录入新的分数:")
            # 5.根据学号从字典中得到学生对象
            s = self.student_dict[id]
            # 6.使用新录入的姓名和分数,修改学生对象中的姓名和分数
            s.name = name
            s.score = score
            # 7.提示修改成功
            print("修改学生信息成功!!!")
View Code

 

【8、删除一个学生】

    def delete_student(self):
        """
        根据学号删除一个学生信息
        """
        # 1.提示录入学号
        id = input("请录入要修改学生的学号:")
        # 2.查找学号在系统是否存在
        if id not in self.student_dict:
            # 3.如果不存在,就提示系统中没有此学生
            print(f"系统中没有学号为{id}的学生")
        else:
            # 4.如果有,从字典中把该学号对应的键值对删除
            self.student_dict.pop(id)
            # 5.提示删除成功
            print(f"删除学生{id}成功!!!")
View Code

 

【9、把字典数据写到文件中】

    def dict_to_file(self):
        """
        把字典中的学生的数据覆盖写到文件中
        """
        # 1.得到所有value对应的列表
        student_list = self.student_dict.values()
        # 2.打开文件,以只写的方法打开文件,编码设置为UTF-8
        f = open("student.txt", "w", encoding="UTF-8")
        # 3.遍历列表,每个元素都是一个对象
        for student in student_list:
            # 4.在循环中,得到学生对象的学号,姓名,分数,组成一个字符串
            id = student.id
            name = student.name
            score = student.score
            line = id + "," + name + "," + score
            # 5.把这个字符串写入到文件中
            f.write(line + "\n")
        # 6.循环结束后,关闭文件
        f.close()
View Code

 

【10、从文件中读取数据存储到字典中】

    def file_to_dict(self):
        """
        读取文件中的数据,一行一行的读取.
        从读到的一行数据中解析出学号,姓名,分数, 创建一个学生对象.
        把对象作为value,把学号作为key,添加到字典中
        """
        # 1.以只读的方式打开文件
        f = open("student.txt", "r", encoding="UTF-8")
        while True:
            # 2.循环着读取文件,一次读一行
            line = f.readline()
            if line != "":
                # 如果数据不为空,去掉最后的换行符
                line = line[0:len(line) - 1]
                # 3.在循环里面,从读到的一行数据中解析出学号,姓名,分数
                infos = line.split(",")
                id = infos[0]
                name = infos[1]
                score = infos[2]
                # 4.使用学号,姓名,分数创建一个学生对象
                s = Student(id, name, score)
                # 5.把对象作为value,把学号作为key,添加到字典中
                self.student_dict[id] = s
            else:
                # 如果本次没有读到数据,表示数据已经读完了,应该终止循环
                break
View Code

 

【二、完整代码】

main.py

from student_manager import *

# 编写启动学生管理系统的代码
sm = StudentManager()
sm.start()
View Code

student.py

# 定义学生类
class Student:
    def __init__(self, id, name, score):
        self.id = id
        self.name = name
        self.score = score

    def __str__(self):
        return f"{self.id}, {self.name}, {self.score}"
View Code

student_manager.py

from student import *


# 学生管理系统的主要功能
class StudentManager:
    def __init__(self):
        #  添加一个字典,用来存储所有的学生
        #  学号作为key, 学生对象作为value
        self.student_dict = {}

    def start(self):
        """
        启动学生管理系统
        """
        # 在系统一启动的时候 ,就应该从文件中读取数据,存到字典中
        self.file_to_dict()

        # 5.把以上4个步骤循环起来
        while True:
            # 1.显示菜单
            # print("调用 显示菜单 的功能")
            self.show_menu()
            # 2.提示录入菜单编号
            menu_code = input("请录入菜单编号:")
            # 3.判断菜单编号
            if menu_code == "1":
                # 4.根据判断的结果调用对应的功能
                # print("调用 1.添加的学生 的功能")
                self.add_student()
            elif menu_code == "2":
                # 4.根据判断的结果调用对应的功能
                # print("调用 2.显示全部 的功能")
                self.show_all()
            elif menu_code == "3":
                # 4.根据判断的结果调用对应的功能
                # print("调用 3.查询学生 的功能")
                self.find_student()
            elif menu_code == "4":
                # 4.根据判断的结果调用对应的功能
                # print("调用 4.修改学生 的功能")
                self.update_student()
            elif menu_code == "5":
                # 4.根据判断的结果调用对应的功能
                # print("调用 5.删除学生 的功能")
                self.delete_student()
            elif menu_code == "0":
                # 4.根据判断的结果调用对应的功能
                # print("调用 0.退出系统 的功能")
                # 退出系统之前把内存中的数据存入文件中
                self.dict_to_file()
                break
            else:
                # 4.根据判断的结果调用对应的功能
                print("录入的菜单编号有误,请重新录入!!!")

    def show_menu(self):
        """
        显示菜单
        """
        print("*" * 40)
        print("欢迎使用【学生管理系统】 V1.0")
        print("1.添加学生")
        print("2.显示全部")
        print("3.查询学生")
        print("4.修改学生")
        print("5.删除学生")
        print()
        print("0.退出系统")
        print("*" * 40)

    def add_student(self):
        """
        添加学生
        """
        # 这段代码 控制不能录入重复的学号的
        while True:
            # 1.提示录入一个学号
            id = input("请输入学号:")
            # 2.判断学号是否重复,如果重复,需要重新录入
            if id in self.student_dict:
                print("学号已经被占用,请使用一个不同的学号!!!")
                continue
            else:
                break

        # 3.提示录入姓名和分数
        name = input("请输入姓名:")
        score = input("请输入分数:")
        # 4.使用录入的学号,姓名,分数创建一个学生对象
        s = Student(id, name, score)
        # 5.把学号作为key,对象作为value,添加到字典
        self.student_dict[id] = s
        # 6.提示添加成功
        print(f"添加{id}成功!!!")

    def show_all(self):
        """
         #显示全部学生信息
        """
        # 先判断系统中是否有学生信息,如果有:
        if len(self.student_dict) > 0:
            # 1.打印表头,和上面的那条线
            print("学号".ljust(15) + "姓名".ljust(15) + "分数".ljust(15))
            print("-" * 45)
            # 2.得到字典中所有的value组成的列表
            student_list = self.student_dict.values()
            # 3.遍历列表,每个元素都是一个学生对象
            for student in student_list:
                id = student.id
                name = student.name
                score = student.score
                # 4.在循环里面,得到学号,姓名,分数,打印成一行
                print(id.ljust(15) + name.ljust(15) + score.ljust(15))
            # 5.在循环结束后,打印下面那条线
            print("-" * 45)
        else:
            # 如果系统中没有学生信息,就提示"系统中还没有学生信息!!!"
            print("系统中还没有学生信息!!!")

    def find_student(self):
        """
        根据学号查询一个学生
        """
        # 1.提示录入学号
        id = input("请输入学号:")
        # 2.查找学号在系统是否存在
        if id not in self.student_dict:
            # 3.如果不存在,就提示系统中没有此学生
            print(f"系统中没有学号为{id}的学生!!!")
        else:
            # 4.如果存在:
            # 4.1 打印表头和那条线
            print("学号".ljust(15) + "姓名".ljust(15) + "分数".ljust(15))
            print("-" * 45)
            # 4.2 得到这个学号对应的学生对象
            s = self.student_dict.get(id)
            id = s.id
            name = s.name
            score = s.score
            # 4.3 得到学号,姓名,分数,打印成一行
            print(id.ljust(15) + name.ljust(15) + score.ljust(15))
            # 4.4 打印出下面那条线
            print("-" * 45)

    def update_student(self):
        """
        根据学号修改一个学生信息
        """
        # 1.提示录入学号
        id = input("请录入要修改学生的学号:")
        # 2.查找学号在系统是否存在
        if id not in self.student_dict:
            # 3.如果不存在,就提示系统中没有此学生
            print(f"系统中没有学号为{id}的学生")
        else:
            # 4.如果有,提示录入新的姓名和分数
            name = input("请录入新的姓名:")
            score = input("请录入新的分数:")
            # 5.根据学号从字典中得到学生对象
            s = self.student_dict[id]
            # 6.使用新录入的姓名和分数,修改学生对象中的姓名和分数
            s.name = name
            s.score = score
            # 7.提示修改成功
            print("修改学生信息成功!!!")

    def delete_student(self):
        """
        根据学号删除一个学生信息
        """
        # 1.提示录入学号
        id = input("请录入要修改学生的学号:")
        # 2.查找学号在系统是否存在
        if id not in self.student_dict:
            # 3.如果不存在,就提示系统中没有此学生
            print(f"系统中没有学号为{id}的学生")
        else:
            # 4.如果有,从字典中把该学号对应的键值对删除
            self.student_dict.pop(id)
            # 5.提示删除成功
            print(f"删除学生{id}成功!!!")

    def dict_to_file(self):
        """
        把字典中的学生的数据覆盖写到文件中
        """
        # 1.得到所有value对应的列表
        student_list = self.student_dict.values()
        # 2.打开文件,以只写的方法打开文件,编码设置为UTF-8
        f = open("student.txt", "w", encoding="UTF-8")
        # 3.遍历列表,每个元素都是一个对象
        for student in student_list:
            # 4.在循环中,得到学生对象的学号,姓名,分数,组成一个字符串
            id = student.id
            name = student.name
            score = student.score
            line = id + "," + name + "," + score
            # 5.把这个字符串写入到文件中
            f.write(line + "\n")
        # 6.循环结束后,关闭文件
        f.close()

    def file_to_dict(self):
        """
        读取文件中的数据,一行一行的读取.
        从读到的一行数据中解析出学号,姓名,分数, 创建一个学生对象.
        把对象作为value,把学号作为key,添加到字典中
        """
        # 1.以只读的方式打开文件
        f = open("student.txt", "r", encoding="UTF-8")
        while True:
            # 2.循环着读取文件,一次读一行
            line = f.readline()
            if line != "":
                # 如果数据不为空,去掉最后的换行符
                line = line[0:len(line) - 1]
                # 3.在循环里面,从读到的一行数据中解析出学号,姓名,分数
                infos = line.split(",")
                id = infos[0]
                name = infos[1]
                score = infos[2]
                # 4.使用学号,姓名,分数创建一个学生对象
                s = Student(id, name, score)
                # 5.把对象作为value,把学号作为key,添加到字典中
                self.student_dict[id] = s
            else:
                # 如果本次没有读到数据,表示数据已经读完了,应该终止循环
                break
View Code

student.txt

1,小樱,100
2,千寻,100
3,小野,100
View Code

 

【往期精彩】

▷【Python基础编程196 ● 读取文件的4种方式】
▷【Python基础编程197 ● 读取文件的4种方式】
▷【Python基础编程198 ● 读取文件的4种方式】
▷【Python基础编程199 ● Python怎么读/写很大的文件】
▷【Python基础编程200 ● 读取文件的4种方式】
▷【Python基础编程201 ● 读取文件的4种方式】
▷【Python基础编程202 ● 读取文件的4种方式】
▷【Python基础编程203 ● 读取文件的4种方式】

 

【加群交流】



posted @ 2020-08-14 17:38  AI菌  阅读(438)  评论(0编辑  收藏  举报