DM-2 - вторая лабораторная работа по дискретной математике

Цель работы: изучить основные свойства бинарных отношений и операции над бинарными отношениями.

Preview

Что это?

Лабораторная работа. Решил вот выложить в открытый доступ чтоб все, кому может понадобиться помощь могли посмотреть, как что-либо реализовано у меня. Эта работа уже была сдана(на 5/5), сдача похожих работ будет обнаружена программой анти плагиата, так что не рекомендую в тупую копировать мой код.

Внимание! Для запуска потребуется установить пакет networkx. Сама программа написана на python 3. Далее следует небольшое объяснение некоторых вещей. Если будут вопросы — можно обратиться ко мне в телеграм.

Интерфейс

Весь интерфейс был написан на Qt с использованием QtDesigner. Как показывает практика, по сравнению с тем же Tkinter времени на разработку тратится меньше, а результат получается в разы лучше. Сборка .ui файла из QtDesigner’а в файл разметки интерфейса для непосредственной разработки на Python производится при помощи команды:

pyuic5 input.ui -o output.py

В общем и целом, написание интерфейса — это прикольно и не составляет особого труда.

Структура

Мне не особо понравилось описание окон в методичке. Поэтому было принято решение использовать следующую структуру окон:

Структура программы

Программа состоит из 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. Код в этом месте не особо понятный, но рабочий. Пример графа:

Preview

Файл fr_generator.py:

Файл, содержащий единственную функцию generate, которая, собственно, генерирует множества R и S. Имеет достаточно запутанный и не оптимизированный алгоритм. Скорее всего будет не нужна, ведь алгоритм генерации зависит от варианта. Скажу лишь про переменные s_possibility и r_possibility. Они контролируют вероятность создания отношения между парой двух возможных элементов. Если не использовать этот финт, то может получится так, что множество S будет иметь кучу элементов, а R будет пустым или почти пустым.

Файл ab_iface.py:

Файл для интерфейса второго окна “О программе”. По нажатию на кнопку окно закрывается.

Файл core.py:

Содержит основные настройки(имена, вероятности) и глобальные переменные.

Этот проект разработан с лицензией Unlicense, то есть он полностью принадлежит сообществу. Вы в праве всячески модифицировать мой код даже без указания авторства. Но все же, я бы хотел получить “спасибо” себе в телегу. Вот и все условия лицензии!