Python学习基础笔记五十一——学校管理系统

news2024/11/23 8:13:51

完成一个作业:

1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格
4. 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校
6. 提供三个角色视图
  6.1 学员视图, 登陆, 查看课程、查看班级
  6.2 讲师视图, 讲师可查看自己教学的班级、课程。
          进阶需求:可管理自己的班级, 查看班级学员列表 , 修改所管理的学员的成绩
  6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里

先上传一个版本,其中讲师部分的功能还未完成。

import pickle
import sys


# 学校类
class School:
    def __init__(self, school_name, school_address):
        self.school_name = school_name
        self.school_address = school_address
        self.class_list = []  # 学校类中应该有一个班级列表


# 课程类
class Course:
    def __init__(self, name, period, price):
        self.name = name
        self.period = period
        self.price = price

    def course_info(self):
        print('''
        ---------------课程信息--------------
        Name: %s
        period:  %s
        price: %s
        ------------------------------------
        ''' % (self.name, self.period, self.price))


# 讲师类
class Lecturer:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def lecturer_info(self):
        print('''
        ---------------讲师信息--------------
        Name: %s
        Age:  %s
        ------------------------------------
        ''' % (self.name, self.age))


# 班级类
# 预先要创建课程和讲师, 然后再做关联
class Class:
    def __init__(self, class_id, course_name, lecturer_name):
        self.class_id = class_id
        self.course_name = course_name
        self.lecturer_name = lecturer_name

    def class_info(self):
        print('''
        ---------------班级信息--------------
        ClassID: %s
        CourseName:  %s
        LecturerName: %s
        ------------------------------------
        ''' % (self.class_id, self.course_name, self.lecturer_name))


# 学员类
class Student:
    def __init__(self, name, school_name, class_name):
        self.name = name
        self.school_name = school_name
        self.class_name = class_name

    def student_info(self):
        print('''
        ---------------学生信息--------------
        Name: %s
        School:  %s
        Class: %s
        ------------------------------------
        ''' % (self.name, self.age, self.class_name))


# 查看讲师
def view_lecturers():
    with open('lecturers_db', 'rb') as f:
        res = pickle.load(f)
        print('----------讲师列表-----------')
        if res:
            count = 1
            for k in res:
                print('''
                -------------------------
                No: %d
                LecturerName: %s
                LecturerAge: %s
                -------------------------
                ''' % (count, res[k]['LecturerName'], res[k]['LecturerAge']))
                count += 1
        else:
            print('讲师还未创建')


# 查看课程
def view_courses():
    with open('courses_db', 'rb') as f:
        res = pickle.load(f)
        print('----------课程列表------------')
        if res:
            count = 1
            for k in res:
                print('''
                --------- ---------------
                No: %d
                Name: %s
                Period: %s
                Price: %s
                -------------------------
                ''' % (count, res[k]['CourseName'], res[k]['CoursePeriod'], res[k]['CoursePrice']))
                count += 1
        else:
            print('课程还未创建')


# 查看班级
def view_classes():
    print("查看班级")
    with open('classes_db', 'rb') as f:
        res = pickle.load(f)
        print('----------班级列表------------')
        if res:
            count = 1
            for k in res:
                print('''
                --------- ---------------
                No: %d
                ClassID: %s
                ClassCourse: %s
                ClassLecturer: %s
                -------------------------
                ''' % (count, res[k]['ClassID'], res[k]['ClassCourse'], res[k]['ClassLecturer']))
                count += 1
        else:
            print('班级还未创建')


# 创建学生视图:
def student_view():
    while True:
        prompt = '''
        1. 查看讲师
        2. 查看课程
        3. 查看班级
        4. 返回
        5. 退出
        '''
        num = input(prompt)
        if num == '1':
            view_lecturers()
        elif num == '2':
            view_courses()
        elif num == '3':
            view_classes()
        elif num == '4':
            break
        elif num == '5':
            sys.exit()
        else:
            print('你输出错误,请重新输入!')
            continue


# 讲师查看自己教学的班级
def view_self_classes():
    pass


# 讲师查看自己教学的课程
def view_self_courses():
    pass


# 讲师查看班级学员列表
def view_class_student_list():
    pass


# 讲师修改学生成绩
def modify_student_score():
    pass


def lecturers_view():
    while True:
        prompt = '''
        1. 查看自己教学的班级
        2. 查看自己教学的课程
        3. 查看班级学员列表
        4. 修改管理员的成绩
        '''
        num = input(prompt)
        if num == '1':
            view_self_classes()
        elif num == '2':
            view_self_courses()
        elif num == '3':
            view_class_student_list()
        elif num == '4':
            modify_student_score()
        else:
            print('你输出错误,请重新输入!')
            continue


# 定义管理员视图
def admin_view():
    while True:
        prompt = '''
        1. 创建讲师
        2. 创建课程
        3. 创建班级
        4. 返回
        5. 退出
        '''
        num = input(prompt)
        if num == '1':
            add_lecturer()
        elif num == '2':
            add_course()
        elif num == '3':
            add_class()
        elif num == '4':
            break
        elif num == '5':
            sys.exit()
        else:
            print('你输出错误,请重新输入!')
            continue


# 添加讲师函数
# 讲师是关联学校
def add_lecturer():
    print("添加讲师函数")

    # 输入讲师的相关信息
    new_lecturer_name = input("请输入姓名: ")
    new_lecturer_age = input("请输入年龄: ")

    # 创建了Lecturer对象
    new_lecturer = Lecturer(new_lecturer_name, new_lecturer_age)
    # print("new_lecturer的信息:", new_lecturer.name, new_lecturer.age)

    new_lecturer_dict = {'LecturerName': new_lecturer_name, 'LecturerAge': new_lecturer_age}

    if not dic:
        # 将这个用户字典添加到全局字典中,由用户名:用户字典组成
        lecturers_dict[new_lecturer_name] = new_lecturer_dict
        with open('lecturers_db', 'wb') as f:
            pickle.dump(lecturers_dict, f)
    else:
        if dic.get(new_lecturer_name):
            print('%s 讲师已存在,不能重名' % new_lecturer_name)
        else:
            lecturers_dict[new_lecturer_name] = new_lecturer_dict
            with open('lecturers_db', 'wb') as f:
                pickle.dump(lecturers_dict, f)
    new_lecturer.lecturer_info()


# 创建课程
#
def add_course():
    print("创建课程函数")

    # 输入课程的相关信息
    new_course_name = input("请输入课程名称: ")
    new_course_period = input("请输入课程周期: ")
    new_course_price = input("请输入课程价格: ")

    # 创建这个新课程的对象
    new_course = Course(new_course_name, new_course_period, new_course_price)

    # 生成一个字典
    new_course_dict = {'CourseName': new_course_name, 'CoursePeriod': new_course_period,
                       'CoursePrice': new_course_price}

    if not dic:
        courses_dict[new_course_name] = new_course_dict
        with open('courses_db', 'wb') as f:
            pickle.dump(courses_dict, f)
    else:
        if dic.get(new_course_name):
            print("%s 课程名字已存在,不能重名" % new_course_name)
        else:
            courses_dict[new_course_name] = new_course_dict
            with open('courses_db', 'wb') as f:
                pickle.dump(courses_dict, f)
    new_course.course_info()


# 创建班级函数
# 班级要关联课程和讲师
def add_class():
    print("添加班级函数")

    new_class_id = input("请输入班级编号: ")
    associate_class_course = input("请输入班级课程: ")  # 输入关联班级课程

    # 课程要course_db的课程进行关联
    # course_db无此课程,则报错,提示无此课程
    # course_db有这个课程,才能关联
    with open('courses_db', 'rb') as f:
        res = pickle.load(f)
        if res:
            if res.get(associate_class_course):
                print('有此课程,关联成功')
            else:
                print('无此课程,请先创建此课程')
                sys.exit()

    associate_class_lecture = input("请输入班级讲师: ")  # 输入关联班级讲师

    # 讲师要与lecturer_db中的讲师进行关联
    # lecture_db无此讲师, 则报错,提示无此讲师
    # lecture_db有次讲师,才能关联
    with open('lecturers_db', 'rb') as f:
        res = pickle.load(f)
        if res:
            if res.get(associate_class_lecture):
                print('有此讲师,关联成功1')
            else:
                print('无此讲师,请先创建此讲师')
                sys.exit

    new_class = Class(new_class_id, associate_class_course, associate_class_lecture)

    # 生成一个字典
    new_class_dict = {'ClassID': new_class_id, 'ClassCourse': associate_class_course,
                      'ClassLecturer': associate_class_lecture}

    if not dic:  # 如果字典为空
        classes_dict[new_class_id] = new_class_dict  # 将班级编号和班级对象映射
        with open('classes_db', 'wb') as f:
            pickle.dump(classes_dict, f)  # 将班级的字典序列化到class_db中
    else:
        if dic.get(new_class_id):  # else字典不为空,且获得班级号,说明班级号已存在
            print("%s 班级号已存在,不能重号" % new_class_id)
        else:  # else字典不为空,没有班级号
            classes_dict[new_class_id] = new_class_dict
            with open('classes_db', 'wb') as f:
                pickle.dump(classes_dict, f)
    new_class.class_info()


def main():
    while True:
        prompt = '''
        1. 学员视图
        2. 讲师视图
        3. 管理视图
        '''
        num = input(prompt)
        if num == '1':
            student_view()
        elif num == '2':
            lecturers_view()
        elif num == '3':
            admin_view()
        else:
            print('你输出错误,请重新输入!')
            continue


if __name__ == '__main__':
    # 声明为全局变量
    global dic

    # 定义一个空的讲师字典
    lecturers_dict = {}

    # 定义一个空的课程字典
    courses_dict = {}

    # 定义一个空的班级字典
    classes_dict = {}

    # 全局字典dic
    dic = {}

    # 直接实例化两个学校
    beijing_school = School('北京校区', '北京王府井')
    shanghai_school = School('上海校区', '上海徐家汇')

    # 打印下两个学校的名称
    print(beijing_school.school_name, shanghai_school.school_name)

    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始搭建CentOS7虚拟机系统、MySQL5.7和Redis3服务

CentOS7搭建MySQL和Redis服务 为什么不直接搭建高版本的呢? 因为有些公司的环境就是低版本的,这些低版本的环境也需要学会如何搭建。 准备工作 搭建一个CentOS7系统 第一步:先下载一个CentOS7的iso文件 点击直接下载:https:…

Odoo丨如何改造Odoo原生form表单使其更好看

文章目录前言一、原生表单实现方式二、问题发现与分析1.项目中遇到问题2.问题具体分析三、具体解决方法第一步:把Span变成输入框第二步:改写_renderFieldWidget前言 Odoo作为快速搭建系统的框架,我们在利用它便捷高效功能的同时,…

踩坑记录:C++调用matlab生成的动态链接库

任务类别: 通常出现在项目中,使用 Matlab 设计算法,最后应用于 Qt 的应用程序中。 配置Vs2008环境:(PS:这里应该也同样能应用于其它版本) 一. 设置matlab库目录 选择“可执行文件”下拉框,添加:" ##…

【Redis】Docker 安装 Redis

Docker 安装 Redis 1、安装镜像 docker pull redis docker images docker run -d -p 6379:6379 redis docker ps docker exec -it 容器ID bash 2、验证Redis容器安装结果 redis- clipingset k1 v1 get k1 3、使用Redis需修改配置文件redis.conf。可通过:方法一&…

【Redis】Redis 内存淘汰策略

文章目录概述数据淘汰策略不进行数据淘汰策略进行数据淘汰策略在设置了过期时间的数据中进行淘汰在所有数据范围内进行淘汰查看与配置数据淘汰机制查看 Redis 的数据淘汰机制修改 Redis 的数据淘汰机制方法一方法二浅谈 LRU 算法和 LFU 算法LRU 算法LFU 算法概述 当我们往 Red…

勒索病毒防御 运维安全管控 | 某烟草公司数据安全建设实践

对于烟草行业而言,加快数字化转型是建设现代化烟草经济体系、实现高质量发展的重要支撑。但新技术的普及与应用,在给烟草行业带来便利、创造价值的同时,也使行业面临的数据安全威胁与日俱增。 在数据安全监管合规持续升级的大背景下&#xff…

《自己动手写CPU》学习记录(9)——第7章/Part 2

目录 引言 致谢 流水线暂停 指令说明 madd、maddu、msub、msubu 设计 宏定义文件 程序计数器模块 译码模块 执行模块 访存模块 HI LO 寄存器模块 通用寄存器模块 流水线控制模块 程序ROM MIPS32顶层 MIPS32 SOPC 仿真 仿真程序 TESTBENCH 仿真结果 引言 …

从 0 到 1 搞一个 Compose Desktop 版本的玩天气之绘制

从 0 到 1 搞一个 Compose Desktop 版本的玩天气之绘制 上一篇文章 “从 0 到 1 搞一个 Compose Desktop 版本的玩天气之踩坑” 中大概说了下刚开始使用 Compose Desktop 会遇到的一些问题,帮大家踩了踩坑,那么这一篇则会带大家一起来看下项目中绘制的一…

网易开发三年,现跳槽蚂蚁花呗,4面顺利通过,拿下Java岗offer

面试准备 不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: 1. 自我介绍。(介…

ubuntu22.04LTS 内核源码编译,安装,卸载

下载内核源码 到网站 https://www.kernel.org/ 下载你自己版本的内核源码。 使用如下命令查看自己的内核版本 uname -r编译前准备 安装工具 sudo apt-get install libncurses5-dev libssl-dev build-essential openssl zlibc minizip libidn11-dev libidn11 libelf-dev bc…

困扰程序员50年的问题终于解决了,但好像又没完全解决......

闰秒,这个唯一能够让Meta、谷歌、微软等巨头同暴躁的Linux之父Linus Torvalds达成一致的存在,这个让无数程序员为之头疼的存在,终于要取消了! 今年第27届国际计量大会上,与会代表通过了一项决议——从2035年起暂停在官…

【车辆计数】光流法行驶车辆检测计数【含Matlab源码 627期】

⛄一、光流场简介 1 案例背景 运动视觉研究的内容是如何从变化场景中的一系列不同时刻的图像中提取有关场景中物体的形状、位置和运动的信息。根据研究的方法,它可以分为两类:基于特征的方法和基于光流场的方法。基于特征的方法抽取特征点,是…

动态磨砂玻璃渐变背景

网页特效代码合集 动态磨砂玻璃渐变背景 妙用滤镜构建高级感拉满的磨砂玻璃渐变背景 一个磨砂(毛玻璃)质感效果的渐变背景图,看上去是比较高级的。 这个效果使用 CSS 其实也可以非常轻松制作出来。本文就讨论讨论: 使用 CSS …

WIN10环境下 MYSQL免安装版配置

之前用的旧版本Mysql,还安装Workbench,感觉很冗余,卸了重装一个免安装版, 1、 MYSQL下载解压 MySQL官网下载地址:https://downloads.mysql.com/archives/community/ 点击Download下载免安装版,并进行解压 2、配置环…

02.Ioc容器加载过程-Bean的生命周期源码深度剖析

Spring源码编译教程 Spring IoC容器的加载过程 1.实例化化容器:AnnotationConfigApplicationContext : // 加载spring上下文 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(MainConfig.class);AnnotationConfi…

24岁程序媛实现了人生第一个小目标 | 2022年终总结

前言 大家好,我是伊人a。2022这一年我实现了人生中的第一个小目标-25岁前能够全款拿下宝马3系。耶比耶比🎉🎉🎉 2022年我是一个满眼星辰的的攀登者。 满眼星辰指的是我对未来充满希望且笃定不移, 攀登者指的是我在…

策略模式(State)

参考: 策略设计模式 (refactoringguru.cn) [5. 策略模式 — Graphic Design Patterns (design-patterns.readthedocs.io)](https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/state.html) [design-patterns-cpp/Strategy.cpp at master …

[附源码]Node.js计算机毕业设计高校教务管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

从零开始搭建Vue3.0项目

从零开始搭建Vue3.0项目所使用的软件及工具,环境1.确保本机已安装nodejs和npm2.Vue-cli项目搭建所使用的软件及工具,环境 软件vscode: vscode地址下载, svn集中式管理: 是一个开源的代码版本控制系统,用于…

谷歌PR权重是什么意思?如何查询网站的谷歌PR权重

谷歌PR权重是什么意思? Google权重是SEO中的一个常见名词,谷歌权重最早的概念指的是GooglePageRank,简称谷歌的PR值,由网站的外链数据计算得出。 PR值的出现,导致很多人只注重做外链,忽略了网站自身…