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