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, то есть он полностью принадлежит сообществу. Вы в праве всячески модифицировать мой код даже без указания авторства. Но все же, я бы хотел получить “спасибо” себе в телегу. Вот и все условия лицензии!