Skip to content

Latest commit

 

History

History

practice_1.2

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Практическая работа №2 "Связные списки"

Реализуйте простой плейер с графическим интерфейсом. Предусмотрите следующий функционал:

  1. создание плейлиста;
  2. удаление плейлиста;
  3. добавление музыкальной композиции в плейлист;
  4. удаление музыкальной композиции из плейлиста;
  5. перемещение музыкальной композиции на другую позицию плейлисте (изменение порядка);
  6. проигрывание музыкальной композиции;
  7. запуск предыдущей музыкальной композиции;
  8. запуск последующей музыкальной композиции;
  9. после завершения проигрывания последней композиции в плейлисте он должен начинаться сначала.

Подсказка:

Используйте кольцевой двусвязный список

Требования к реализации

Реализуйте класс Composition, представляющий музыкальную композицию, и класс PlayList, реализующий логику работы плейлиста. Класс PlayList унаследуйте от базового класса LinkedList, реализующего операции над связным списком:

  • append_left(self, item) - добавление элемента в начало списка;
  • append_right(self, item) - добавление элемента в конец списка;
  • append(self, item) - алиас для append_right;
  • remove(self, item) - удаление элемента, при его отсутствии в списке должно возбуждать исключение ValueError;
  • insert(self, previous, item) - вставка элемента item после элемента previous.
  • last(self) - получение последнего элемента списка

Добавьте поддержку "магических" методов в классе LinkedList:

  • __len__ - длина списка;
  • __iter__ - получение итератора;
  • __next__ - получение следующего элемента;
  • __getitem__ - получение элемента по индексу;
  • __contains__ - поддержка оператора in;
  • __reversed__ - поддержка функции reversed.

Элементы связного списка реализуйте в виде класса LinkedListItem, который будет содержать ссылки на следующий и предыдущий элементы, а также данные в виде экземпляра Composition.

Реализуйте доступ к следующему и предыдущему элементу в LinkedListItem через свойства (getter и setter):

  • next_item
  • previous_item

Через эти же свойства можно реализовать добавление элементов в список.

Предусмотрите следующие методы в классе PlayList:

  • play_all(self, item) - начать проигрывать все треки, начиная с item;
  • next_track(self) - перейти к следующему треку;
  • previous_track(self) - перейти к предыдущему треку;
  • current(self) - получить текущи трек, реализовать в виде свойства.

Реализовать пользовательский интерфейс можно на любой библиотеке (веб или десктоп), например PyQt или Flask. Использование QMediaPlaylist фреймворка PyQt для реализации плейлиста не допускается.

В файлах linked_list.py размещены упрощенные шаблоны классов и функций. В файле test_linked_list.py вы найдете тесты для проверки решения. Тесты можно запустить с помощью модуля unittest или pylint.

Подсказка:

Проигрывание музыкальных композиций можно реализовать с помощью pygame.

Примерная диаграмма классов

Диаграмма классов

Методика оценивания

Оценка выставляется в соответствии со следующими требованиями:

  1. Общие требования:
    • код работы проходит проверку утилитой pylint с конфигурационным файлом .pylintrc.
    • код работы успешно проходит тесты, если таковые имеются.
    • наличие документации к модулям, функциям, классам и методам.
    • наличие аннотации типов.
  2. На оценку 3 балла:
    • программа поддерживает только один плейлист;
    • реализовать пункты 3, 4, 6, 7 и 8.
  3. На оценку 4 балла:
    • дополнительно реализовать пункты 5 и 9.
  4. На оценку 5 балла:
    • реализовать все методы, указанные в описании к работе.

Полезные материалы