Python面向对象编程中课程冲突检测及代码优化方案咨询
课程冲突检测实现与代码优化建议
一、课程冲突检测功能实现
要实现冲突检测,核心是在添加课程时,将新课程与已添加的所有课程逐一对比:
1. 时间交集判断逻辑
你构思的集合交集方法可行,但用区间重叠的数学判断更高效,无需生成集合:
两个课程时间区间存在交集的条件是:新课程.start_time < 已有课程.end_time 且 已有课程.start_time < 新课程.end_time
(默认课程时间为左闭右开,比如9-11表示覆盖9、10两个时段)
如果坚持用集合方法,修正代码如下:
# 生成课程覆盖的整点集合 time_set = set(range(course.start_time, course.end_time + 1)) # 与已有课程时间集合交集不为空则冲突 if time_set.intersection(existing_time_set): # 冲突处理逻辑
2. 完整冲突检测实现
在Schedule类的add_course方法中加入检测逻辑,每次添加新课程时自动校验:
def add_course(self, course): # 遍历已有课程检查冲突 for existing_course in self.courses: if existing_course.day == course.day: # 判断时间区间是否重叠 if course.start_time < existing_course.end_time and existing_course.start_time < course.end_time: print(f"冲突提示:课程「{course.name}」与已添加的「{existing_course.name}」在{course.day}时间重叠!") # 可选:禁止添加冲突课程,直接return # return # 无冲突则添加课程 self.courses.append(course)
二、代码优化建议
1. 消除冗余代码
- 删除
__init__方法中未使用的program变量; - 将重复定义的工作日、时段列表抽为类常量,避免重复创建:
class Schedule: # 类常量:固定工作日与时段 DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] TIME_SLOTS = ["9", "10", "11", "12", "13", "14", "15", "16", "17"] def __init__(self): self.courses = [] def print_schedule(self): # 初始化日程表结构 program = [self.TIME_SLOTS.copy() for _ in self.DAYS] # 填充课程信息 for course in self.courses: day_idx = self.DAYS.index(course.day) start_idx = course.start_time - 9 end_idx = course.end_time - 9 for j in range(start_idx, end_idx): course_info = f" | {course.name}({course.instructor} @ {course.classroom})" program[day_idx][j] += course_info # 格式化打印日程 for day, slots in zip(self.DAYS, program): print(f"\n{day}:") for slot in slots: print(slot)
2. 增强类的可读性与调试性
给Course类添加__repr__方法,方便调试时查看课程信息:
class Course: def __init__(self, name, classroom, instructor, day, start_time, end_time): self.name = name self.classroom = classroom self.instructor = instructor self.day = day self.start_time = start_time self.end_time = end_time def __repr__(self): return f"Course(name='{self.name}', day='{self.day}', time={self.start_time}-{self.end_time})"
3. 输入合法性校验
在Course初始化方法中添加参数校验,避免无效输入:
def __init__(self, name, classroom, instructor, day, start_time, end_time): if start_time >= end_time: raise ValueError("课程结束时间必须晚于开始时间") valid_days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] if day not in valid_days: raise ValueError(f"无效日期,必须是{valid_days}中的一个") # 其余初始化代码
4. 日程打印格式优化
原打印方式会导致时段字符串过长,改用分隔符分隔时段与课程信息,提升可读性(如上述优化后的print_schedule方法)。
内容的提问来源于stack exchange,提问作者4DescarTes
相关产品推荐
相关产品推荐

