面向对象和模块的作业题

'''
从“学生选课系统” 这几个字就可以看出来,我们最核心的功能其实只有 选课。
角色:
    学生、管理员
功能:
    登陆 : 管理员和学生都可以登陆,且登陆之后可以自动区分身份
    选课 : 学生可以自由的为自己选择课程
    创建用户 : 选课系统是面向本校学生的,因此所有的用户都应该由管理员完成
    查看选课情况 :每个学生可以查看自己的选课情况,而管理员应该可以查看所有学生的信息
工作流程:
    登陆 :用户输入用户名和密码
    判断身份 :在登陆成果的时候应该可以直接判断出用户的身份 是学生、讲师还是管理员
    学生用户 :对于学生用户来说,登陆的工作几乎不变
        1、查看所有课程
        2、选择课程
        3、查看所选课程
        4、退出程序
    管理员用户:管理员用户也可以做更多的事情

        1、创建课程
        2、创建学生学生账号
        3、查看所有课程
        4、查看所有学生
        5、查看所有学生的选课情况
        6、创建讲师
        7、为讲师指定班级
        8、创建班级
        9、为学生指定班级
        10、退出程序

    讲师用户 :对于讲师用户来说,可以完成的功能如下
        1、查看所有课程
        2、查看所教班级
        3、查看班级中的学生
        4、退出程序
'''
import json


class Student:  # 定义学生类
    
    
    def __init__(self, name):
        self.name = name
    
    def check_course(self):  # 查看所有课程
        with open("course", 'r', encoding="utf-8") as f:  # course是课程文件
            tmp = {}
            for index, i in enumerate(f.read().split("|"), 1):
                print(index, i)
                tmp[str(index)] = i
            return tmp
    
    def select_course(self):  # 选择课程
        tmp = self.check_course()
        n = input("请选择你要选的课程的序号")
        if n in tmp:  # 判断选的课在不在课程列表里
            with open("user_course", 'r', encoding="utf8") as f:  # user_course是用户和所选课程的文件,
                user_course = json.load(f)  # 是一个字典, 键是用户名, 值是所选课的列表
                if user_course.get(self.name):  # 用户和课程里有没有那个用户
                    user_course.get(self.name).append(tmp[n])
                else:
                    user_course.setdefault(self.name, [tmp[n]])
            
            with open("user_course", 'w', encoding="utf-8") as f:
                json.dump(user_course, f, ensure_ascii=False)
    
    def check_select_course(self):  # 查看所选课程
        with open("user_course", 'r', encoding="utf8") as f:
            user_course = json.load(f)
            print(user_course.get(self.name))
    
    def exit(self):  # 退出程序
        exit()
    
    def show(self):
        # student_func 这个字典是功能名和要执行的函数
        student_func = {"查看课程": self.check_course, '选择课程': self.select_course, "查看所选课程": self.check_select_course,
                        "退出": self.exit}
        while 1:
            tmp = {}  # 修改gongneng这个字典, 保留索引和函数
            for index, i in enumerate(student_func, 1):
                print(index, i)
                tmp[str(index)] = student_func[i]
            C = input("请输入你的选择")  # 根据不同的选择, 执行不同的函数
            if C in tmp:
                tmp[C]()


class Administrator:  # 定义管理员类
    def __init__(self, name):
        self.name = name
    
    def create_course(self):  # 创建课程
        with open("course", 'r+', encoding="utf-8") as f:
            flag = 0
            name = input('请输入需创建课程的名称:').strip()
            tmp = f.read().split("|")
            for i in range(len(tmp)):
                if tmp[i] == name:
                    print('您创建的课程已经存在')
                    flag = 1
                    break
                else:
                    continue
            if flag == 0:
                f.write('|' + name)
                print('恭喜你课程创建成功')
    
    def create_student_account(self):  # 创建学生账号
        with open('user', encoding="utf-8", mode='r+') as f:
            name = input("请输入学生的姓名:").strip()
            password = input("请输入学生的密码:").strip()
            tmp = f.readlines()
            while 1:
                flag = 0
                for i in range(len(tmp)):
                    tmp[i] = tmp[i].split("|")
                    if tmp[i][0] == name:
                        print('您创建的用户名已存在,请重新输入')
                        flag = 1
                        break
                    else:
                        continue
                if flag == 0:
                    f.write(name + '|' + password + '|' + 'S' + '\n')
                    print("恭喜你,学生用户创建成功")
                    break
                else:
                    break
    
    def check_all_course(self):  # 查看所有课程
        with open("course", 'r', encoding="utf-8") as f:  # course是课程文件
            for index, i in enumerate(f.read().split("|"), 1):
                print(index, i)
    
    def check_all_student(self):  # 查看所有学生
        with open('user', encoding="utf-8", mode='r+') as f:
            l1 = []
            tmp = f.readlines()
            for i in range(len(tmp)):
                tmp[i] = tmp[i].split("|")
                l1.append(tmp[i][0])
            for i in range(len(l1)):
                print(l1[i])
    
    def check_all_select_course(self):  # 查看所有学生的选课情况(每个学生的选课情况)
        with open("user_course", 'r', encoding="utf8") as f:
            user_course = json.load(f)
            print(user_course)
    
    def create_teacheer(self):  # 创建讲师
        with open('user', encoding="utf-8", mode='r+') as f:
            name = input("请输入讲师的姓名:").strip()
            password = input("请输入讲师的密码:").strip()
            tmp = f.readlines()
            while 1:
                flag = 0
                for i in range(len(tmp)):
                    tmp[i] = tmp[i].split("|")
                    if tmp[i][0] == name:
                        print('您创建的用户名已存在,请重新输入')
                        flag = 1
                        break
                    else:
                        continue
                if flag == 0:
                    f.write(name + '|' + password + '|' + 'T' + '\n')
                    print("恭喜你,讲师用户创建成功")
                    break
                else:
                    break
    
    def create_class(self):  # 创建班级
        with open("class", 'r+', encoding="utf-8") as f:
            flag = 0
            name = input('请输入需创建班级的名称:').strip()
            tmp = f.read().split("|")
            for i in range(len(tmp)):
                if tmp[i] == name:
                    print('您创建的班级已经存在')
                    flag = 1
                    break
                else:
                    continue
            if flag == 0:
                f.write('|' + name)
                print('恭喜你班级创建成功')
    
    def assign_class_teachaer(self):  # 为讲师指定班级
        with open('user', encoding="utf-8", mode='r+') as f:
            l1 = []
            tmp = f.readlines()
            for i in range(len(tmp)):
                tmp[i] = tmp[i].strip().split("|")
                if tmp[i][2] == 'T':
                    l1.append(tmp[i][0])
            print(l1)
        
        name = input("请选择需要分配的讲师:").strip()
        if name in l1:
            class_name = input("请输入分配的班级:").strip()
            with open("teacher_class", 'r', encoding="utf8") as f:  # teacher_class是保存教师和课程的关系表。
                teacher_class = json.load(f)
                if teacher_class.get(name):  # 用户和课程里有没有那个用户
                    if teacher_class.get(class_name):
                        print('教师%s已经分配了%s' % (name, class_name))
                    else:
                        teacher_class.get(name).append(class_name)
                else:
                    teacher_class.setdefault(name, [class_name])
            with open("teacher_class", 'w', encoding="utf-8") as f:
                json.dump(teacher_class, f, ensure_ascii=False)
                print('恭喜您,讲师分配课程成功')
        else:
            print('您输入的讲师姓名错误,请重新输入。')
    
    def assign_class_student(self):  # 为学生指定班级
        with open('user', encoding="utf-8", mode='r+') as f:
            l1 = []
            tmp = f.readlines()
            for i in range(len(tmp)):
                tmp[i] = tmp[i].strip().split("|")
                if tmp[i][2] == 'S':
                    l1.append(tmp[i][0])
            print(l1)
        
        name = input("请选择需要分配的学生:").strip()
        if name in l1:
            class_name = input("请输入分配的班级:").strip()
            with open("student_class", 'r', encoding="utf8") as f:  # teacher_class是保存教师和课程的关系表。
                student_class = json.load(f)
                if student_class.get(name):  # 用户和课程里有没有那个用户
                    if student_class.get(class_name):
                        print('学生%s已经分配了%s' % (name, class_name))
                    else:
                        student_class.get(name).append(class_name)
                else:
                    student_class.setdefault(name, [class_name])
            with open("student_class", 'w', encoding="utf-8") as f:
                json.dump(student_class, f, ensure_ascii=False)
                print('恭喜您,学生分配课程成功')
        else:
            print('您输入的学生姓名错误,请重新输入。')
    
    def exit(self):  # 退出程序
        exit()
    
    def show(self):
        # administrator_func 这个字典是功能名和要执行的函数
        administrator_func = {"创建课程": self.create_course, '创建学生账号': self.create_student_account,
                              "查看所有课程": self.check_all_course, '查看所有学生': self.check_all_student,
                              '查看所有学生的选课情况': self.check_all_select_course, '创建讲师': self.create_teacheer,
                              '为讲师指定班级': self.assign_class_teachaer, '创建班级': self.create_class,
                              '为学生指定班级': self.assign_class_student, "退出": self.exit
                              }
        while 1:
            tmp = {}  # 修改gongneng这个字典, 保留索引和函数
            for index, i in enumerate(administrator_func, 1):
                print(index, i)
                tmp[str(index)] = administrator_func[i]
            C = input("请输入你的选择")  # 根据不同的选择, 执行不同的函数
            if C in tmp:
                tmp[C]()


class Teacher:  # 定义讲师类
    def __init__(self, name):
        self.name = name
    
    def check_all_course(self):  # 定义查看所有课程
        with open("course", 'r', encoding="utf-8") as f:  # course是课程文件
            for index, i in enumerate(f.read().split("|"), 1):
                print(index, i)
    
    def check_assign_class(self):  # 定义查看讲师所教班级
        with open("teacher_class", 'r', encoding="utf-8") as f:
            b = json.load(f)
            if b.get(self.name):
                print(b[self.name])
            else:
                print('您好,您未分配班级。')
    
    def check_class_studet(self):  # 定义查看班级中的学生
        with open("teacher_class", 'r', encoding="utf-8") as f:
            a = json.load(f)
            if a.get(self.name):
                b = a[self.name]
                with open("student_class", 'r', encoding="utf-8") as f1:
                    c = json.load(f1)
                    if c.get(self.name):
                        l2 = []
                        for k in a:
                            if c[k] == b:
                                l2.append(k)
                        print(l2)
                    else:
                        print('该班级中还未分配学生')
            else:
                print('您好,您还未分配班级')
    
    def exit(self):  # 退出程序
        exit()
    
    def show(self):
        # student_func 这个字典是功能名和要执行的函数
        student_func = {"查看所有课程": self.check_all_course, '查看讲师所教班级': self.check_assign_class,
                        "查看班级中的学生": self.check_class_studet, "退出": self.exit}
        while 1:
            tmp = {}  # 修改gongneng这个字典, 保留索引和函数
            for index, i in enumerate(student_func, 1):
                print(index, i)
                tmp[str(index)] = student_func[i]
            C = input("请输入你的选择")  # 根据不同的选择, 执行不同的函数
            if C in tmp:
                tmp[C]()


with open('user', encoding='utf-8', mode='r') as f:
    tmp = f.readlines()
    while 1:
        name = input("请输入姓名:").strip()
        password = input("请输入密码:").strip()
        for i in range(len(tmp)):
            l2 = tmp[i].strip().split("|")
            # print(l2)
            if l2[0] == name and l2[1] == password and l2[2] == 'S':
                print('%s恭喜你登录成功' % (name))
                s = Student(name)
                s.show()
            elif l2[0] == name and l2[1] == password and l2[2] == 'A':
                print('%s恭喜你登录成功' % (name))
                a = Administrator(name)
                a.show()
            elif l2[0] == name and l2[1] == password and l2[2] == 'T':
                print('%s恭喜你登录成功' % (name))
                t = Teacher(name)
                t.show()
        else:
            print('账号或者密码输入错误,请重新输入')

 

posted @ 2018-11-25 20:26  马玉刚  阅读(128)  评论(0)    收藏  举报