DM-2 - вторая лабораторная работа по дискретной математике
Цель работы: изучить основные свойства бинарных отношений и операции над бинарными отношениями.
Что это?
Лабораторная работа. Решил вот выложить в открытый доступ чтоб все, кому может понадобиться помощь могли посмотреть, как что-либо реализовано у меня. Эта работа уже была сдана(на 5/5), сдача похожих работ будет обнаружена программой анти плагиата, так что не рекомендую в тупую копировать мой код.
Внимание!
Для запуска потребуется установить пакет networkx
. Сама программа написана на python 3
. Далее следует небольшое объяснение некоторых вещей. Если будут вопросы — можно обратиться ко мне в телеграм.
Интерфейс
Весь интерфейс был написан на Qt
с использованием QtDesigner
. Как показывает практика, по сравнению с тем же Tkinter
времени на разработку тратится меньше, а результат получается в разы лучше.
Сборка .ui
файла из QtDesigner’а в файл разметки интерфейса для непосредственной разработки на Python производится при помощи команды:
pyuic5 input.ui -o output.py
В общем и целом, написание интерфейса — это прикольно и не составляет особого труда.
Структура
Мне не особо понравилось описание окон в методичке. Поэтому было принято решение использовать следующую структуру окон:
- Главное окно: содержит абсолютно все элементы управления программой.
- 7 одинаковых окон для вывода графического представления отношений(вызываются из главного окна). Эти окна — графики из библиотеки
matplotlib
. - Окно “О программе”. Просто для красоты(вызывается из главного окна).
Bells and whistles
В главном окне был использован компонент
QStatusBar
для отображения справки при наведении курсора мыши на любой элемент интерфейса. Для этого используется свойствоstatusTip
любого из видимых компонентов интерфейса. Довольно интересно реализовано отображение графов. Я уверен, что реализация далеко не идеальна, но рабочая.
Структура программы
Программа состоит из 5 основных файлов(не считая файлов разметки интерфейса).
Файл main.py:
Файл для запуска программы. Создает главное окно и передает управление iface.py
.
Файл iface.py:
Основной файл программы. В нем описана обработка событий интерфейса, построение и отображение графов, работа с listWidget
элементами, запись данных в файл и чтение данных из файла. Рассмотрю некоторые части программы:
Метод def __init__(self):
Производится инициализация окна, после чего добавляются имена в элементы listWidget
и подключаются функции-обработчики нажатия на кнопки(self.pushButton_var_clc.clicked.connect(self.var_clc_btn)
).
Метод def cpy_btn(self):
Выполняет копирование выбранных элементов из listWidget
с именами в множества. Особенность в том, что в списках есть элемент “- None -“. Он нужен в случае, если пользователь решит отменить выделение(соглашусь, есть и более элегантные способы решить эту проблему, но мне было просто лень искать их). Также стоит отметить, что этот метод(как и методы read_a_btn
, read_b_btn
, clear_a_btn
и clear_b_btn
) генерирует множества R и S.
Метод def mtr_s_btn(self):
(и все последующие)
Создает и рисует граф согласно сгенерированным ранее множествам R и S. Код в этом месте не особо понятный, но рабочий. Пример графа:
Файл fr_generator.py:
Файл, содержащий единственную функцию generate
, которая, собственно, генерирует множества R и S. Имеет достаточно запутанный и не оптимизированный алгоритм. Скорее всего будет не нужна, ведь алгоритм генерации зависит от варианта. Скажу лишь про переменные s_possibility
и r_possibility
. Они контролируют вероятность создания отношения между парой двух возможных элементов. Если не использовать этот финт, то может получится так, что множество S будет иметь кучу элементов, а R будет пустым или почти пустым.
Файл ab_iface.py:
Файл для интерфейса второго окна “О программе”. По нажатию на кнопку окно закрывается.
Файл core.py:
Содержит основные настройки(имена, вероятности) и глобальные переменные.
Copyright
Этот проект разработан с лицензией Unlicense
, то есть он полностью принадлежит сообществу. Вы в праве всячески модифицировать мой код даже без указания авторства. Но все же, я бы хотел получить “спасибо” себе в телегу. Вот и все условия лицензии!