选课系统

该博客展示了用Python实现的学生选课系统代码。定义了Person、Student、Manager和Course类,分别实现不同功能。Person类包含选择课程等方法,Student类可选课、查看所选课程,Manager类能创建课程和学生账号等。还实现了登录函数和主程序,实现系统的基本功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
import pickle
import sys

#写一个学生和管理员共同的属性
class Person():
    # 创建选择课程方法,使其在后面可以进行保存直接调用
    def get_course(self):
        with open("course_info","rb") as f:
            while 1:
                try:
                    course_obj = pickle.load(f)
                    yield course_obj
                except:
                    break


    def show_course(self):
        print("可选课程:")
        courses = self.get_course()
        for num,course_obj in enumerate(courses,1):
            print(num,course_obj.name,course_obj.price,course_obj.teacher)
    # 退出方法,使用系统退出
    def exit(self):
        print("exit")
        sys.exit()


# 创建一个得到学生的函数,下面调用,减少重复
    def get_student(self):
        with open("student_info","rb") as f:
            while 1:
                try:
                    stu_obj = pickle.load(f)
                    return stu_obj
                except:
                    break



# 创建学生类,并设置相对应的属性
"""
        1、查看所有课程
        2、选择课程
        3、查看所选课程
        4、退出程序
"""
class Student(Person):

    operate_list = ["show_course","select_course","show_selected_course","exit"]
    def __init__(self,name):
        self.name = name
        self.courses = []


    def select_course(self):
        print("可选课程如下:")
        self.show_course()
        inp = int(input("请输入课程序号:"))
        course_itr = self.get_course()
        for i in range(inp):
            course_obj = next(course_itr)
        self.courses.append(course_obj)
        print("选课成功")


    def show_selected_course(self):
        print("已选课程如下:")
        for num,course_obj in enumerate(self.courses,1):
            print(num,course_obj.name,course_obj.price,course_obj.teacher)

    # 退出方法要实时更新,进来后先判断,如果已经操作过,进行信息更新
    def exit(self):
        with open("student_info_new","wb") as f2:
            while 1:
                try:
                    stu_obj = self.get_student()
                    if stu_obj.name == self.name:
                        pickle.dump(self,f2)
                    else:
                        pickle.dump(stu_obj)
                except:
                    break
        os.remove("student_info")
        os.rename("student_info_new","student_info")
        super().exit()



    @classmethod
    def get_obj(cls,name):
        cls.get_student()



# 创建管理员类,并设置相对应的属性
"""
        1、创建课程
        2、创建学生学生账号
        3、查看所有课程
        4、查看所有学生
        5、查看所有学生的选课情况
        6、退出程序
"""

class Manager(Person):

    operate_list = ["creat_course", "creat_student","show_course", "show_student", "show_student_course","exit"]

    def __init__(self,name):
        self.name = name

    def creat_course(self):
        course_name = input("课程名称:")
        course_price = int(input("课程价格:"))
        teacher = input("授课老师:")
        course_obj = Course(course_name,course_price,teacher)

        with open("course_info","ab") as f:    #将实例化的对象保存到文件,不能保存到内存,运行一次就没有了
            pickle.dump(course_obj,f)
        print("\33[0;35m课程创建成功\33[0m")

    def creat_student(self):
        student_name = input("学生账号:")
        student_pwd = input("学生密码:")
        with open("userinfo","a") as f:     #将创建的学生信息保存到文件中
            f.write(f"{student_name}|{student_pwd}|{'Student'}\n")

        stu_obj = Student(student_name)    #创建学生对象

        with open("student_info","ab") as f:    #将实例化的对象保存到文件,不能保存到内存,运行一次就没有了
            pickle.dump(stu_obj,f)
        print("\33[0;31m学生账号创建成功\33[0m")


    def show_student(self):
        print("学生如下:")
        self.get_student()
        num = 0
        while 1:
            try:
                num += 1
                print(num,self.get_student().name)
            except:
                break


    def show_student_course(self):
        print("学生选课情况如下:")
        with open("student_info","rb") as f:
            num = 0
            while 1:
                try:
                    num += 1
                    stu_obj = pickle.load(f)
                    print(num,stu_obj.name,stu_obj.courses)
                except:
                    break
    @classmethod
    def get_obj(cls,name):
        return Manager(name)

#创建课程类,并设置对应的属性
class Course():
    def __init__(self,name,price,teacher):
        self.name = name
        self.price = price
        self.teacher = teacher

    # 获得对象的显示状态,否则显示的是一个内存地址
    def __repr__(self):
        return self.name


# 登陆函数
def login():
    user = input("请输入用户名:").strip()
    pwd = input("请输入密码:").strip()
    with open("userinfo") as f:
        for line in f:
            username,password,ident = line.strip().split("|")
            if username == user and password == pwd:
                return {"name":username,"identify":ident,"auth":True}
        else:
            return {"name":user,"identify":None,"auth":False}


def main():
    print("\33[0;34m欢迎使用学生选课系统\033[0m")
    ret = login()
    if ret["auth"]:
        print("\33[0;34m登陆成功,欢迎%s:%s\033[0m"%(ret["identify"],ret["name"]))
        if hasattr(sys.modules[__name__],ret["identify"]):
            cls = getattr(sys.modules[__name__],ret["identify"])
        obj = cls.get_obj(ret["name"])

        while  True:
            for num,opt in enumerate(cls.operate_list,1):
                print(num,opt)

            inp = int(input("请选择要做的操作:"))
            if hasattr(obj,cls.operate_list[inp-1]):
                getattr(obj,cls.operate_list[inp-1])()
    else:
        print("\33[0;34m登录失败\033[0m")


main()






















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值