/
a_lukin
/
Labs_Python
Обзор
Документация
Войти
/
a_lukin
/
Labs_Python
Код
Запросы
2
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
lab3
lab3.py
570 строк
23 KB
a_lukin
create: lab3.py, timetable.json, лаба 3.docx
13 фев 2026, 22:54
Верифицирован
13 фев 2026, 22:54
092ef19
Код
Авторство
О чём код?
import json import os from datetime import datetime class Lesson: """Класс, представляющий отдельное занятие""" def __init__(self, subject="", time="", classroom="", teacher=""): self.__subject = subject # приватный атрибут self.__time = time # приватный атрибут self.__classroom = classroom # приватный атрибут self.__teacher = teacher # приватный атрибут # Геттеры и сеттеры def get_subject(self): return self.__subject def set_subject(self, subject): if subject and isinstance(subject, str): self.__subject = subject return True return False def get_time(self): return self.__time def set_time(self, time): if time and isinstance(time, str): self.__time = time return True return False def get_classroom(self): return self.__classroom def set_classroom(self, classroom): if classroom and isinstance(classroom, str): self.__classroom = classroom return True return False def get_teacher(self): return self.__teacher def set_teacher(self, teacher): if teacher and isinstance(teacher, str): self.__teacher = teacher return True return False # Публичные методы для работы с объектом def to_dict(self): """Преобразует объект в словарь для JSON""" return { "subject": self.__subject, "time": self.__time, "classroom": self.__classroom, "teacher": self.__teacher } @staticmethod def from_dict(data): """Создает объект из словаря""" return Lesson( subject=data.get("subject", ""), time=data.get("time", ""), classroom=data.get("classroom", ""), teacher=data.get("teacher", "") ) def __str__(self): return f"{self.__subject} | {self.__time} | Ауд.{self.__classroom} | {self.__teacher}" class Schedule: """Класс, представляющий расписание на один день""" def __init__(self, day_of_week=""): self.__day_of_week = day_of_week # приватный атрибут self.__lessons = [] # приватный атрибут (список занятий) # Геттеры и сеттеры def get_day_of_week(self): return self.__day_of_week def set_day_of_week(self, day_of_week): if day_of_week and isinstance(day_of_week, str): self.__day_of_week = day_of_week return True return False def get_lessons(self): return self.__lessons.copy() # Публичные методы для работы с занятиями def add_lesson(self, lesson): """Добавляет занятие в расписание дня""" if isinstance(lesson, Lesson): self.__lessons.append(lesson) return True return False def remove_lesson(self, index): """Удаляет занятие по индексу""" if 0 <= index < len(self.__lessons): del self.__lessons[index] return True return False def edit_lesson(self, index, lesson): """Редактирует занятие по индексу""" if 0 <= index < len(self.__lessons) and isinstance(lesson, Lesson): self.__lessons[index] = lesson return True return False def get_lesson_count(self): """Возвращает количество занятий в этот день""" return len(self.__lessons) def to_dict(self): """Преобразует объект в словарь для JSON""" return { "day_of_week": self.__day_of_week, "lessons": [lesson.to_dict() for lesson in self.__lessons] } @staticmethod def from_dict(data): """Создает объект из словаря""" schedule = Schedule(day_of_week=data.get("day_of_week", "")) for lesson_data in data.get("lessons", []): schedule.add_lesson(Lesson.from_dict(lesson_data)) return schedule def __str__(self): if not self.__lessons: return f"{self.__day_of_week}: Нет занятий" result = f"{self.__day_of_week}:\n" for i, lesson in enumerate(self.__lessons, 1): result += f" {i}. {lesson}\n" return result class Timetable: """Класс для управления всем расписанием""" def __init__(self): self.__schedules = [] # приватный атрибут (список расписаний по дням) self.__file_path = "timetable.json" # Геттеры и сеттеры def get_schedules(self): return self.__schedules.copy() def set_file_path(self, path): if path and isinstance(path, str): self.__file_path = path return True return False # Публичные методы для работы с расписанием def add_schedule(self, schedule): """Добавляет расписание на день""" if isinstance(schedule, Schedule): # Проверяем, нет ли уже расписания на этот день for s in self.__schedules: if s.get_day_of_week().lower() == schedule.get_day_of_week().lower(): return False self.__schedules.append(schedule) return True return False def remove_schedule(self, day_of_week): """Удаляет расписание на указанный день""" for i, schedule in enumerate(self.__schedules): if schedule.get_day_of_week().lower() == day_of_week.lower(): del self.__schedules[i] return True return False def get_schedule_by_day(self, day_of_week): """Возвращает расписание на указанный день""" for schedule in self.__schedules: if schedule.get_day_of_week().lower() == day_of_week.lower(): return schedule return None def search_lessons(self, **criteria): """Поиск занятий по критериям (предмет, преподаватель, аудитория)""" results = [] for schedule in self.__schedules: for lesson in schedule.get_lessons(): match = True if "subject" in criteria and criteria["subject"]: if criteria["subject"].lower() not in lesson.get_subject().lower(): match = False if "teacher" in criteria and criteria["teacher"]: if criteria["teacher"].lower() not in lesson.get_teacher().lower(): match = False if "classroom" in criteria and criteria["classroom"]: if criteria["classroom"].lower() not in lesson.get_classroom().lower(): match = False if "time" in criteria and criteria["time"]: if criteria["time"].lower() not in lesson.get_time().lower(): match = False if match: results.append({ "day": schedule.get_day_of_week(), "lesson": lesson }) return results def filter_by_teacher(self, teacher_name): """Фильтрует занятия по преподавателю""" return self.search_lessons(teacher=teacher_name) def filter_by_classroom(self, classroom): """Фильтрует занятия по аудитории""" return self.search_lessons(classroom=classroom) # Методы для работы с файлами def save_to_file(self): """Сохраняет состояние в JSON файл""" try: data = { "schedules": [schedule.to_dict() for schedule in self.__schedules] } with open(self.__file_path, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2) print(f"✅ Данные успешно сохранены в файл: {self.__file_path}") return True except PermissionError: print("❌ Ошибка: Нет прав на запись в файл") except Exception as e: print(f"❌ Ошибка при сохранении файла: {e}") return False def load_from_file(self): """Загружает состояние из JSON файла""" if not os.path.exists(self.__file_path): print("ℹ️ Файл с данными не найден. Начинаем с пустого расписания.") return False try: with open(self.__file_path, 'r', encoding='utf-8') as f: data = json.load(f) self.__schedules = [] for schedule_data in data.get("schedules", []): self.__schedules.append(Schedule.from_dict(schedule_data)) print(f"✅ Данные успешно загружены из файла: {self.__file_path}") return True except json.JSONDecodeError: print("❌ Ошибка: Файл поврежден или имеет неверный формат JSON") except Exception as e: print(f"❌ Ошибка при загрузке файла: {e}") return False def __str__(self): if not self.__schedules: return "📚 Расписание пустое" result = "📅 ПОЛНОЕ РАСПИСАНИЕ:\n" + "="*50 + "\n" for schedule in self.__schedules: result += str(schedule) + "\n" return result class TimetableApp: """Консольное приложение для управления расписанием""" def __init__(self): self.timetable = Timetable() def run(self): """Запуск главного меню""" # Загружаем данные при запуске self.timetable.load_from_file() while True: self.print_main_menu() choice = self.get_user_input("Выберите действие: ") if choice == "1": self.add_schedule_menu() elif choice == "2": self.remove_schedule_menu() elif choice == "3": self.add_lesson_menu() elif choice == "4": self.edit_lesson_menu() elif choice == "5": self.remove_lesson_menu() elif choice == "6": self.view_timetable() elif choice == "7": self.search_menu() elif choice == "8": self.save_data() elif choice == "9": if self.confirm_action("Вы уверены, что хотите выйти?"): self.save_before_exit() print("👋 До свидания!") break else: print("❌ Неверный выбор. Пожалуйста, введите число от 1 до 9.") def print_main_menu(self): """Выводит главное меню""" print("\n" + "="*50) print("📚 СИСТЕМА УПРАВЛЕНИЯ РАСПИСАНИЕМ ЗАНЯТИЙ") print("="*50) print("1. ➕ Добавить день в расписание") print("2. 🗑️ Удалить день из расписания") print("3. 📝 Добавить занятие в день") print("4. ✏️ Редактировать занятие") print("5. ❌ Удалить занятие") print("6. 👁️ Просмотреть все расписание") print("7. 🔍 Поиск и фильтрация") print("8. 💾 Сохранить данные в файл") print("9. 🚪 Выход") print("="*50) def get_user_input(self, prompt): """Безопасный ввод от пользователя""" try: return input(prompt).strip() except KeyboardInterrupt: print("\n⚠️ Операция отменена") return "" def confirm_action(self, prompt): """Запрос подтверждения действия""" response = self.get_user_input(f"{prompt} (д/н): ").lower() return response in ["д", "да", "y", "yes"] def add_schedule_menu(self): """Меню добавления дня в расписание""" print("\n--- ДОБАВЛЕНИЕ ДНЯ ---") day = self.get_user_input("Введите день недели: ") if not day: print("❌ Название дня не может быть пустым") return schedule = Schedule(day) if self.timetable.add_schedule(schedule): print(f"✅ День '{day}' успешно добавлен в расписание") else: print(f"❌ День '{day}' уже существует в расписании") def remove_schedule_menu(self): """Меню удаления дня из расписания""" print("\n--- УДАЛЕНИЕ ДНЯ ---") day = self.get_user_input("Введите день недели для удаления: ") if not day: print("❌ Название дня не может быть пустым") return if self.timetable.remove_schedule(day): print(f"✅ День '{day}' успешно удален из расписания") else: print(f"❌ День '{day}' не найден в расписании") def add_lesson_menu(self): """Меню добавления занятия""" print("\n--- ДОБАВЛЕНИЕ ЗАНЯТИЯ ---") if not self.timetable.get_schedules(): print("❌ Сначала добавьте день в расписание") return day = self.get_user_input("Введите день недели: ") schedule = self.timetable.get_schedule_by_day(day) if not schedule: print(f"❌ День '{day}' не найден в расписании") return print("\nВведите данные занятия:") subject = self.get_user_input("Предмет: ") time = self.get_user_input("Время: ") classroom = self.get_user_input("Аудитория: ") teacher = self.get_user_input("Преподаватель: ") lesson = Lesson(subject, time, classroom, teacher) if schedule.add_lesson(lesson): print("✅ Занятие успешно добавлено") else: print("❌ Не удалось добавить занятие") def edit_lesson_menu(self): """Меню редактирования занятия""" print("\n--- РЕДАКТИРОВАНИЕ ЗАНЯТИЯ ---") day = self.get_user_input("Введите день недели: ") schedule = self.timetable.get_schedule_by_day(day) if not schedule: print(f"❌ День '{day}' не найден в расписании") return if schedule.get_lesson_count() == 0: print("📭 В этот день нет занятий") return print(schedule) try: lesson_num = int(self.get_user_input("Введите номер занятия для редактирования: ")) if lesson_num < 1 or lesson_num > schedule.get_lesson_count(): print(f"❌ Занятия с номером {lesson_num} не существует") return except ValueError: print("❌ Введите корректный номер") return print("\nВведите новые данные (оставьте пустым, чтобы оставить без изменений):") current_lesson = schedule.get_lessons()[lesson_num - 1] subject = self.get_user_input(f"Предмет [{current_lesson.get_subject()}]: ") if subject: current_lesson.set_subject(subject) time = self.get_user_input(f"Время [{current_lesson.get_time()}]: ") if time: current_lesson.set_time(time) classroom = self.get_user_input(f"Аудитория [{current_lesson.get_classroom()}]: ") if classroom: current_lesson.set_classroom(classroom) teacher = self.get_user_input(f"Преподаватель [{current_lesson.get_teacher()}]: ") if teacher: current_lesson.set_teacher(teacher) print("✅ Занятие успешно отредактировано") def remove_lesson_menu(self): """Меню удаления занятия""" print("\n--- УДАЛЕНИЕ ЗАНЯТИЯ ---") day = self.get_user_input("Введите день недели: ") schedule = self.timetable.get_schedule_by_day(day) if not schedule: print(f"❌ День '{day}' не найден в расписании") return if schedule.get_lesson_count() == 0: print("📭 В этот день нет занятий") return print(schedule) try: lesson_num = int(self.get_user_input("Введите номер занятия для удаления: ")) if schedule.remove_lesson(lesson_num - 1): print("✅ Занятие успешно удалено") else: print(f"❌ Занятия с номером {lesson_num} не существует") except ValueError: print("❌ Введите корректный номер") def view_timetable(self): """Просмотр всего расписания""" print(str(self.timetable)) def search_menu(self): """Меню поиска и фильтрации""" print("\n--- ПОИСК И ФИЛЬТРАЦИЯ ---") print("1. 🔍 Поиск по всем критериям") print("2. 👨🏫 Фильтр по преподавателю") print("3. 🏢 Фильтр по аудитории") choice = self.get_user_input("Выберите действие: ") if choice == "1": self.search_by_criteria() elif choice == "2": self.filter_by_teacher() elif choice == "3": self.filter_by_classroom() else: print("❌ Неверный выбор") def search_by_criteria(self): """Поиск по критериям""" print("\n--- ПОИСК ПО КРИТЕРИЯМ ---") print("(Оставьте пустым, если критерий не важен)") subject = self.get_user_input("Предмет: ") teacher = self.get_user_input("Преподаватель: ") classroom = self.get_user_input("Аудитория: ") time = self.get_user_input("Время: ") criteria = {} if subject: criteria["subject"] = subject if teacher: criteria["teacher"] = teacher if classroom: criteria["classroom"] = classroom if time: criteria["time"] = time results = self.timetable.search_lessons(**criteria) self.display_search_results(results) def filter_by_teacher(self): """Фильтрация по преподавателю""" teacher = self.get_user_input("Введите ФИО преподавателя: ") if not teacher: print("❌ Имя преподавателя не может быть пустым") return results = self.timetable.filter_by_teacher(teacher) self.display_search_results(results) def filter_by_classroom(self): """Фильтрация по аудитории""" classroom = self.get_user_input("Введите номер аудитории: ") if not classroom: print("❌ Номер аудитории не может быть пустым") return results = self.timetable.filter_by_classroom(classroom) self.display_search_results(results) def display_search_results(self, results): """Отображает результаты поиска""" if not results: print("🔍 Ничего не найдено") return print(f"\n🔍 Найдено занятий: {len(results)}") print("-" * 50) for i, result in enumerate(results, 1): print(f"{i}. День: {result['day']}") print(f" {result['lesson']}") print() def save_data(self): """Сохраняет данные в файл""" self.timetable.save_to_file() def save_before_exit(self): """Предлагает сохранить данные перед выходом""" if self.confirm_action("Сохранить изменения перед выходом?"): self.timetable.save_to_file() if __name__ == "__main__": app = TimetableApp() app.run()