
ПР_4
.docxМИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра ИС
ОТЧЕТ
по лабораторной работе №4
по дисциплине «Объектно-ориентированное программирование»
Студенты гр.
Преподаватель Егоров С. С.
Санкт-Петербург 2024
Задание на практическую работу
Рисунок 1- Диаграмма классов работы №4
Создать распределенное приложение, включающее клиентскую и серверную части, взаимодействующие посредством сетевого обмена сообщениями.
Клиентская часть представляет собой GUI приложение, реализующее интерфейс аналогичный работе №3.
Серверная часть представляет собой консольное приложение, предназначенное для выполнения перечисленных в меню работы №1 функций над квадратной матрицей с рациональными элементами.
Диаграммы классов для клиентского и серверного приложений представлены на рисунке.
Реализовать и отладить программу, удовлетворяющую сформулированным требованиям и заявленным целям. Разработать контрольные примеры и оттестировать на них программу. Оформить отчет, сделать выводы по работе.
*) Класс "Коммуникатор" на основе сетевого протокола Udp с использованием конструкторских классов библиотеки классов Qt и пример его использования прилагаются к работе в виде исходных кодов.
Выполнение работы
Спецификация классов
Класс Matrix – класс, задающий по умолчанию единичную матрицу 3х3. Атрибуты класса:
data: тип array[array[number]], приватный, содержит числовые данные матрицы.
Методы класса:
getitem: публичный метод для доступа к элементам матрицы через оператор []. Возвращает строку матрицы по индексу. Является «магическим» методом python, перегружающим оператор [].
get_number_of_rows: публичный метод, возвращающий число строк в матрице.
get_number_of_columns: публичный метод, возвращающий число столбцов в матрице.
get_minor: приватный вспомогательный метод для получения k- ого минора матрицы, принимает на вход число k, возвращает array[array[number]].
det_count: приватный рекурсивный метод для вычисления определителя матрицы, на вход получает array[array[number]], возвращает number.
det: публичный метод для нахождения определителя матрицы, возвращает number.
print: публичный метод для вывода матрицы на печать, ничего не принимает и не возвращает.
rank: метод для расчета ранга матрицы, возвращает ранг матрицы (integer).
transpose: метод для транспонирования матрицы, ничего не принимает и не возвращает, изменяет атрибут data .
set_data: метод для ввода новых данных в матрицу, на вход принимает array[array[number]], ничего не возвращает, изменяет атрибут data.
Класс TRational – класс, предназначенный для работы с рациональными числами.
Атрибуты класса:
num: int, числитель дроби, приватный;
denom: int, знаменатель дроби, приватный.
Методы класса:
eq: является «магическим» методом в python, перегружающим оператор ==,
проверяет равенство двух рациональных чисел, на вход ничего не принимает,
возвращает bool.
ne: является «магическим» методом в python, перегружающим оператор !=,
проверяет неравенство двух рациональных чисел, на вход ничего не принимает,
возвращает bool.
abs: является «магическим» методом в python, перегружающим функцию abs(),
возвращает модуль рационального числа, на вход ничего не принимает.
str: является «магическим» методом в python, перегружающим приведение
типа к строке, возвращает строковое представление рационального числа, на вход
ничего не принимает, возвращает str.
mul: является «магическим» методом в python, перегружающим оператор *,
выполняет умножение двух рациональных чисел, на вход принимает второй
множитель, принадлежащий классу TRational, возвращает объект класса
TRational.
add: является «магическим» методом в python, перегружающим оператор +,
выполняет сложение двух рациональных чисел, на вход принимает второе
слагаемое, принадлежащее классу TRational, возвращает объект класса TRational.
sub: является «магическим» методом в python, перегружающим оператор -,
выполняет вычитание двух рациональных чисел, на вход принимает второй
множитель, принадлежащий классу TRational, возвращает объект класса
TRational.
truediv: является «магическим» методом в python, перегружающим
оператор /, выполняет деление двух рациональных чисел, на вход принимает
делитель, принадлежащий классу TRational, возвращает объект класса TRational.
nod: вспомогательный метод, использующийся для поиска НОД, на вход ничего не принимает, возвращает целочисленное значение – НОД числителя и знаменателя.
reduce: вспомогательный метод для сокращения дроби. На вход ничего не принимает, возвращает сокращенную дробь.
gt: принимает на вход второе рациональное число, сравнивает их и возвращает bool.
Класс TInterface - класс, отвечающий за работу пользователя с графическим интерфейсом и отображением матрицы в нём. Является классом-наследником класса QWidget.
Атрибуты класса:
matrix: тип Matrix, приватный, содержит объект матрицы;
centralwidget: тип Qwidget, приватный, содержит виджет интерфейса;
size_label, result_label: тип QLabel, приватные, содержат ярлыки с надписью «Размер:» и «Результат»;
size_le, result_le: тип QLineEdit, приватные, содержат поля для ввода размера и вывода результата операции соответственно;
save_size_pb, save_matrix_pb, transpose_pb, det_pb, rank_pb: тип QPushButton, приватные, содержат кнопки для сохранения размера матрицы, сохранения самой матрицы, её транспонирования, вывода определителя и ранга;
tableWidget: приватный, тип QTableWidget, используется для отображения элементов матрицы и записи новых элементов.
Методы класса:
setupUI: приватный метод, используемый для создания и отображения всех элементов, принимает void, возвращает void;
saveMatrix: публичный метод, сохраняющий новую матрицу, принимает void, возвращает void;
save_new_size: публичный метод, изменяющий размер матрицы, принимает void, возвращает void;
show_det: публичный метод, отображающий определитель матрицы в поле result_le, принимает void, возвращает void;
show_rank: публичный метод, отображающий ранг матрицы в поле result_le, принимает void, возвращает void;
transpose: публичный метод, транспонирующий матрицу, принимает void, возвращает void.
Класс TApplication (серверная часть)
communicator:
receive_message: обрабатывает полученное сообщение от TCommunicator.
send_message: отправляет сообщение на сервер.
Класс TApplication (клиентская часть)
communicator:
interface:
read_matrix: возвращает строковое представление матрицы, считанной из интерфейса приложения
transpose: транспонирует матрицу и отправляет результат через объект класса TCommunicator.
show_det: вычисляет определитель матрицы и отправляет результат через объект класса TCommunicator.
show_rank: вычисляет ранг матрицы и отправляет результат через объект класса TCommunicator.
receive_message: обрабатывает полученное сообщение от TCommunicator, разбирает операцию и данные, и вызывает соответствующие методы интерфейса для отображения результата.
Класс TCommunicator часть клиентской стороны приложения, ответственную за взаимодействие с сервером посредством сетевого соединения.
receive_message: обрабатывает входящие сообщения от сервера. При наличии ожидающих датаграмм считывает их, декодирует и отправляет сигнал с полученным сообщением.
send_message: отправляет сообщение на сервер. Кодирует сообщение, чтобы передать его через UDP-соединение на адрес хоста и порт клиента.
my_port:
client_port:
host:
Диаграмма классов
Серверная часть:
Клиентская часть:
Рисунок 2 - диаграмма классов
Описание контрольных примеров с исходными и ожидаемыми данными
Пример 1. Определитель и ранг матрицы.
Исходные данные:
Ожидаемые данные:
Определитель = ¾, ранг = 2.
Результат:
Пример 2. Транспонирование матрицы.
Исходные данные:
Ожидаемые данные:
Результат:
Вывод
В результате выполнения практической работы была разработана программа, состоящая из двух частей: клиентской и серверной частей. Эти компоненты успешно взаимодействуют друг с другом через обмен сообщениями по сети. Создание такого приложения демонстрирует понимание принципов работы сетевых технологий и навыки программирования для обеспечения эффективного обмена данными между различными узлами системы.