面向对象练习题

校园管理系统

设计一个培训机构管理系统,有总部、分校,有学员、老师、员工,实现具体功能如下:
1.有多个课程,课程要有定价
2.有多个班级,班级跟课程关联
3.有多个学生,学生可以报名班级,交这个班级对应的课程的费用
4.有多个老师,可以分布在不同的校区,上不同的班级的课
5.有多个员工,可以分布在不同的校区,在总部可以统计各个校区的账户余额、员工人数和 学员人数
6.学生可以转学、退学

操作步骤:
1.定模型,需要多少个类
找出关键字
总部、分校、学员、老师、员工、课程、班级

2.定属性
总部
名称,地址,电话,网址,财务账户,员工列表,学员列表,发工资,开分校,招人

分校
继承总部的所有属性

学员
姓名、年龄、班级、余额、上学打卡、交学费

老师
继承员工的所有属性,教学

员工
姓名、职务、部门、工资、上班打卡

课程
名称,价格,大纲

班级
校区、课程、学期、学员列表、换班级(转学)、退学、上课记录、考核成绩

3.定关系
分校—>总部
学员—> 班级
班级—> 课程
班级—> 分校
老师—> 班级
老师—> 员工
学员—> 老师
员工—> 分校

4.画UML模型图
使用processon画图,这边就不过多讲解了,直接上图了!!!
大概画了一下,真正公司里的类可能有上百个,比这个难多了,如果你这个最基本的都画不下去,就没必要再看下去了亲!!!
在这里插入图片描述5.写代码(这边实现一下大概的流程,重复的操作就省略了)

class Headquarters(object):
    """总部类"""

    def __init__(self, name, addr, tel, website):
        self.name = name
        self.addr = addr
        self.tel = tel
        self.website = website
        self.finance = 0
        self.branches = []  # 存所有的分校的对象
        self.class_list = []  # 存班级对象
        self.staff_list = []  # 存员工对象

    # 统计学生人数
    def count_stu_num(self):
        total_stu_num = 0
        # 总部的
        for i in self.class_list:
            total_stu_num += len(i.stu_list)
            print("总部%s人" % total_stu_num)
        # 分校的
        for i in self.branches:
            for a in i.class_list:
                total_stu_num += len(a.stu_list)
        print("现如今总部+分校一共是%s人" % total_stu_num)

    # 发工资
    def pay_money(self):
        print("大家好啊,我们要准备开始发工资了!!!")
        for i in self.staff_list:
            i.finance += i.salary  # 发工资
            self.finance -= i.salary  # 扣除已发的工资
            print("%s账户上打了工资%s,账户余额为%s" % (i.name, i.salary, i.finance))
        print("总公司账户剩余存款为", self.finance)

    # 统计员工人数
    def count_staff_num(self):
        pass

    # 员工入职登记
    def staff_enrollment(self, staff_obj):
        self.staff_list.append(staff_obj)
        print("%s入职了新员工%s,职位%s,部门%s" % (self.name, staff_obj.name, staff_obj.position, staff_obj.dept))

    # 统计总收入
    def count_total_revenue(self):
        total_revenue = self.finance  # 先加上总部自己的收入
        print(self.name, self.finance)
        # 遍历分公司的列表,获取各个分校的数据
        for i in self.branches:
            print(i.name, i.finance)
            total_revenue += i.finance
        print("总收入为%s" % total_revenue)

    # 统计班级
    def count_class_list(self):
        print(self.name, self.class_list)
        for i in self.branches:
            print(i.name, i.class_list)


class Branch(Headquarters):
    """分校区"""

    def __init__(self, name, addr, tel, website, headquarter_obj):
        super().__init__(name, addr, tel, website)
        self.headquarter_obj = headquarter_obj
        self.headquarter_obj.branches.append(self)  # 每次初始化将自身加入到总校的列表当中,让总校与其进行双向的关联


class Course(object):
    """课程"""

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


class Class(object):
    """班级"""

    def __init__(self, course_obj, semester, school_obj):
        self.course_obj = course_obj
        self.semester = semester
        self.school_obj = school_obj
        self.stu_list = []  # 存放学员列表
        school_obj.class_list.append(self)  # 把自己存放到班级列表中

    def stu_transfer(self, stu_obj, new_class_obj):
        """
        学员转学
        :param stu_obj: 学生对象
        :param new_class_obj: 新班级对应的对象
        :return:
        """

    def stu_dropout(self, stu_obj, new_class_obj):
        """
        学员退学
        :param stu_obj: 学生对象
        :param new_class_obj: 新班级对应的对象
        :return:
        """

    def __str__(self):
        return "%s-%s-第%s期" % (self.school_obj.name, self.course_obj.name, self.semester)

    def __repr__(self):
        return "%s-%s-第%s期" % (self.school_obj.name, self.course_obj.name, self.semester)


class Staff(object):
    """员工"""

    def __init__(self, name, age, salary, position, finance, dept, school_obj):
        self.name = name
        self.age = age
        self.salary = salary
        self.position = position
        self.finance = finance
        self.dept = dept
        self.school_obj = school_obj
        school_obj.staff_enrollment(self)

    def punch_card(self):
        pass


class Teacher(Staff):
    """老师"""

    def __init__(self, name, age, salary, position, finance, dept, school_obj, course_obj):
        super().__init__(name, age, salary, position, finance, dept, school_obj)
        self.course_obj = course_obj  # 老师可以上的课程

    def teach_class(self, class_obj):
        pass


class Student(object):
    """学员"""

    def __init__(self, name, age, finance, class_obj):
        self.name = name
        self.age = age
        self.finance = finance
        self.class_obj = class_obj

        # 加入班级
        class_obj.stu_list.append(self)
        class_obj.school_obj_stu_num = class_obj.stu_list
        # 交学费
        class_obj.school_obj.finance += class_obj.course_obj.price
        self.finance -= class_obj.course_obj.price

    def punch_card(self):
        pass

    def pay_tuition(self):
        pass


# 创建校区
header = Headquarters("唐糖IT学习网站", "上海市宛平南路600号", 000000, "ttang.com")
s1 = Branch("漕河泾校区", "上海市漕河泾开发区", 111111, "cch.com", header)
s2 = Branch("虹桥校区", "上海市虹桥火车站", 2222222, "hq.com", header)
b1 = Branch("北京沙河校区", "北京市昌平沙河", 3333333, "bj.com", header)
# 创建课程
py3_c = Course("Python", 22500, None)
linux_c = Course("Linux", 19900, None)
go_c = Course("Golang", 28800, None)
php_c = Course("Php", 19900, None)
# 创建班级
py_1 = Class(py3_c, 1, header)
linux_1 = Class(linux_c, 1, s1)
go_1 = Class(go_c, 1, b1)
# 创建老师,员工和学员
st1 = Staff("Jack", 25, 22000, "教学主任", 0, "经教办", header)
st2 = Staff("Tom", 24, 8000, "HR", 0, "公司前台", header)
st1 = Staff("Mike", 27, 40000, "总经理", 0, "总经办", header)

t1 = Teacher("tiger", 30, 30000, "讲师", 0, "教学部", s1, py3_c)
t2 = Teacher("pig", 27, 40000, "讲师", 0, "教学部", s2, go_c)
t3 = Teacher("lion", 28, 30000, "讲师", 0, "教学部", b1, php_c)

stu1 = Student("小张", 22, 0, py_1)
stu2 = Student("小红", 21, 0, linux_1)
stu3 = Student("小黑", 22, 0, go_1)

# 查看总收入
# header.count_total_revenue()
# 查看班级
# header.count_class_list()
# 统计学生的人数
# header.count_stu_num()
# 发工资
header.pay_money()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发酵的西瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值