МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра ИС КУРСОВАЯ РАБОТА по дисциплине «Объектно-ориентированное программирование» Тема: Разработка распределенной программной системы, имитирующей жизненный цикл объектов предметной области Вариант: 15 Студенты Преподаватель Егоров С.С. Санкт-Петербург 2021 ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ Тема работы: Разработка распределенной программной системы, имитирующей жизненный цикл объектов предметной области Исходные данные: В бухгалтерии предприятия имеются N кассиров. Пришедший за заработной платой сотрудник выбирает свободную кассу с равной вероятностью или он становится в очередь в кассу с вероятностями P1, P2, ..., PN, где Pi = (1Li/(L1+L2+...+LN))/(N-1), а L1, L2, ..., LN - текущие длины очередей к кассам на момент прихода сотрудника. Получивший зарплату сотрудник уходит. Содержание пояснительной записки: Постановка задачи, Приложение «Интерфейс», Приложение «Модель», Перечень типов и структуры сообщений, Выводы Предполагаемый объем пояснительной записки: Не менее 20 страниц. Дата выдачи задания: 15.02.2021 Дата сдачи реферата: 08.06.2021 Студенты Преподаватель Егоров С.С. 2 АННОТАЦИЯ В данной курсовой работе была разработана распределенная программная система в объектно-ориентированной методологии, имитирующая обслуживание объектов на производстве. Программная система состоит из двух взаимодействующих по сети приложений. Одного GUI приложения «Интерфейс» (клиент) и другого консольного «Модель» (сервер). 3 СОДЕРЖАНИЕ 1. Постановка задачи 5 1.1. Описание предметной области 5 1.2. Перечень библиотечных конструкторских классов, 5 использованных в проект 2. Приложение «Интерфейс» 9 2.1. Графическое представление интерфейсных окон 9 2.2. Диаграмма классов 14 3. Приложение «Модель» 14 3.1 Модель «сущность-связь» ПрО 14 3.2. Перечень событий, изменяющих состояние ПрО 15 3.3. Диаграмма классов 15 3.4. Диаграммы последовательностей обработки каждого типа 20 событий от приложения «Интерфейс» 4. Перечень типов и структуры сообщений 20 4.1. Перечень типов и структуры сообщений от клиента к серверу 20 4.2. Перечень типов и структуры сообщений от сервера к клиенту 20 5. Выводы 21 Список использованных источников 22 4 1. ПОСТАНОВКА ЗАДАЧИ 1.1. Описание предметной области Предметной областью является бухгалтерия предприятия, где имеется несколько касс. Скорость прихода сотрудников отличается от скорости работы кассиров, поэтому на кассах образуются очереди. 1.2. Перечень библиотечных конструкторских классов, использованных в проекте •QObject Класс QObject — это базовый класс для всех объектов Qt. QObject — сердце Qt Object Model. Главная особенность в этой модели — это очень мощный механизм для связи объектов, называемый сигналами и слотами. Вы можете соединить сигнал со слотом с помощью connect() и разъединить с помощью disconnect(). Во избежание возникновения замкнутых циклов вызовов можно временно блокировать сигналы с помощью blockSignals(). Защищенные функции connectNotify() и disconnectNotify() позволяют отслеживать соединения. Каждый объект имеет objectName - имя объекта, а имя его класса можно найти через соответствующую функцию metaObject() (смотрите функцию QMetaObject::className()). Вы можете определить, унаследован ли класс от другого класса в иерархии наследования QObject, используя функцию inherits(). •QCloseEvent Класс QCloseEvent содержит параметры, описывающие событие закрытия. События закрытия отправляются виджетам, которые пользователь хочет закрыть, обычно путем выбора «Close» в меню окна или путем нажатия кнопки X в строке заголовка. Они также отправляются, когда вы вызываете QWidget :: close() для программного закрытия виджета. 5 •QPushButton Виджет QPushButton предоставляет командную кнопку. Нажимная кнопка или командная кнопка, возможно, является наиболее часто используемым виджетом в любом графическом пользовательском интерфейсе. Нажмите (щелкните) кнопку, чтобы дать компьютеру команду выполнить какое-либо действие или ответить на вопрос. •QLabel Виджет QLabel обеспечивает отображение текста или изображения. Функциональность взаимодействия с пользователем не предусмотрена. Внешний вид метки можно настроить различными способами, и его можно использовать для указания мнемонической клавиши фокуса для другого виджета. •QSpinBox Класс QSpinBox предоставляет виджет счетчика. QSpinBox позволяет пользователю указать значение щелкая мышью по кнопкам вверх/вниз или нажимая клавиши клавиатуры вверх/вниз для увеличения/уменьшения значения, отображенного в настоящий момент. Также пользователь может ввести значение вручную. • QWidget Класс QWidget является базовым для всех объектов пользовательского интерфейса. Виджет - это элементарный объект пользовательского интерфейса: он получает события мыши, клавиатуры и другие события от оконной системы и рисует свое изображение на экране. Каждый виджет имеет прямоугольную форму, и все они отсортированы в порядке наложения (Z-order). Виджет ограничен своим родителем и другими виджетами, расположенными перед ним. •QHostAddress 6 Этот класс содержит IPv4 или IPv6 - адрес независимо от платформы и протокола. QHostAddress обычно используется с QTcpSocket, QTcpServer и QUdpSocket для подключения к хосту или настройки сервера. Адрес хоста задается с помощью set Address () и извлекается с помощью toIPv4Address(), toIPv6Address () или toString(). Вы можете проверить тип с помощью protocol(). • QTcpSocket Этот класс позволяет принимать входящие TCP-соединения. Вы можете указать порт или сделать так, чтобы QTcpServer выбрал его автоматически. .• QByteArray Класс QByteArray предоставляет массив байт. QByteArray может быть использован для хранения как сырых байт (включая и '\0'), так и традиционных 8-битных нультерминированых строк. Использование QByteArray более удобно, чем использование const char *. Здесь всегда гарантировано, что данные завершаются '\0' и используется неявное совместное использование данных (copy-on-write) для экономии памяти и избегания ненужного копирования данных. •QTimer Класс QTimer предоставляет интерфейс программирования высокого уровня для таймеров. Чтобы использовать его, необходимо создать QTimer, подключить его сигнал timeout () к соответствующим слотам и вызвать start (). С этого момента он будет излучать сигнал timeout () с постоянными интервалами. •QApplication Класс QApplication руководит управляющей логикой ГПИ и основными настройками. QApplication содержит основной цикл событий, в котором все события от оконной системы и других 7 источников обрабатываются и координируются. Он также обрабатывает инициализацию и завершение приложения и обеспечивает управление сессиями. Кроме того, QApplication обрабатывает большинство общесистемных и общепрограммных настроек. •QCoreApplication QCoreApplication содержит основной цикл событий, в котором обрабатываются и отправляются все события операционной системы (например, таймер и сетевые события) и других источников. Он также обрабатывает инициализацию и завершение приложения, а также общесистемные и общесистемные настройки. •QString Класс QString предоставляет строку символов Unicode. QString хранит строку 16-битных QChar, где каждому QChar соответствует один символ Unicode 4.0. (Символы Unicode со значениями кодов больше 65535 хранятся с использованием суррогатных пар, т.е. двух последовательных QChar.) •QVector Класс QVector - это шаблонный класс, предоставляющий динамический массив. QVector<T> является одним из общих контейнерных классов Qt. Он хранит свои элементы в смежных ячейках памяти и обеспечивает быстрый доступ по индексу. •QTcpServer Этот класс позволяет принимать входящие TCP-соединения. Вы можете указать порт или сделать так, чтобы QTcpServer выбрал его автоматически. 8 2. ПРИЛОЖЕНИЕ «ИНТЕРФЕЙС» 2.1. Графическое представление интерфейсных окон 2.1.1. Основное окно Рис. 1. Основное окно 2.1.2. Окно параметров ПрО Рис. 2. Окно параметров ПрО 2.1.3. Окно управления событиями ПрО Рис. 3. Окно управления событиями ПрО 9 Рис. 4. Окно управления событиями ПрО 2.1.4. Окно отображения состояния объектов ПрО Рис. 5. Окно отображения состояния объектов ПрО 2.1.5. Заголовочные файлы интерфейсных классов TInterface : bool canControl; TparamWindow *paramWindow; TstateWindow *stateWindow; TcontrolWindow *controlWindow; Qlabel *data; QpushButton *pbtn; QpushButton *sbtn; QpushButton *cbtn; Tinterface(Qwidget *parent = 0); 10 ~Tinterface(); void setControlState(const bool); void setCurrentParams(const TparamData); void setCurrentState(const TstateData); void closeEvent(QcloseEvent*); void paramWindowClosed(); void stateWindowClosed(); void controlWindowClosed() void openParamWindow(); void openStateWindow(); void openControlWindow(); void paramRequest(Eevents,void*); void stateRequest(Eevents,void*); void sendModelParams(TparamData); void reset(); void step(); void mode(bool); TparamWindow Qlabel *l1; Qlabel *l2; Qlabel *l3; QspinBox *modulo; QspinBox *param1; QspinBox *param2; QpushButton *b; TparamWindow(bool,Qwidget *parent = 0); ~TparamWindow(); inline void setEnable(const bool m) { setEnabled(m); } void setCurrentParams(const TparamData); void closeEvent(QcloseEvent*); 11 void setModelParam(); void closing(); void sendModelParams(TparamData); void restoryParams(); TstateWindow Qlabel *l4; Qlabel *l5; Qlabel *state1; Qlabel *l7,*l8,*l9,*l10,*l11; Qlabel *state2; Qlabel *state3; Qlabel *state4; Qlabel *state5; Qlabel *state6; TstateWindow(Qwidget *parent = 0); ~TstateWindow(); void setCurrentState(const TstateData); void closeEvent(QcloseEvent*); void closing(); TcontrolWindow QpushButton *b1; QpushButton *b2; QpushButton *b3; TcontrolWindow(bool,Qwidget *parent = 0); ~TcontrolWindow(); inline void setEnable(const bool m) { setEnabled(m); } void closeEvent(QcloseEvent*); void switchMode(); void closing(); void reset(); 12 void step(); void mode(bool); Tapplication TtcpClient *client; Tinterface *interface; TeventGenerator* generator; TApplication(int,char**); ~TApplication(); void toModel(EEvents,void*); void fromModel(QByteArray); void sendModelParams(TParamData); void reset(); void step(); void mode(bool); TTcpClient bool connected; TTcpClient(QHostAddress,quint16); void connection(); void disconnection(); void reading(); void send(QByteArray); void recieve(QByteArray); 13 2.2. Диаграмма классов Рис. 6. Диаграмма классов Интерфейса 3. ПРИЛОЖЕНИЕ «МОДЕЛЬ» 3.1. Модель «сущность-связь» ПрО Рис. 6. Модель «сущность-связь» ПрО 14 3.2. Перечень событий, изменяющих состояние ПрО Представленная программная система (ПС) имеет следующие события, изменяющие ПрО: Количество касс изменено Изменено отношение скорости прихода клиентов к скорости работы кассиров 3.3. Диаграмма классов Рис.7. Диаграмма классов сервера 3.3.1. Логическое описание полей классов область тип наименование видимости int n privat QVector <QVector <double> > kassa privat Таблица 1. Поля TKassa тип наименование TParamData parameters, static TParamData defaultParameters TStateData state static TStateData defaultState TKassa kassa Таблица 2. Поля TModel 15 область видимости privat privat privat privat privat тип наименование область видимости TTcpServer server privat TModel model privat Таблица 3. Поля TApplication область тип наименование видимости QVector<QTcpSocket*> clints privat Таблица 4. Поля TTcpServer область наименование видимости m privat n privat Таблица 5. Поля TSotr тип int int 3.3.2. Логическое описание методов классов наименование Tkassa ver sr vibor svob sozd plusch minusch och vr vrminud obn vrplus nn параметры вызова int _ _ _ _ int int int int int int int int, double _ Таблица 6. Методы TKassa 16 область видимости public public public public public public public public public public public public public public наименование init init2 tact наименование fromMessage Tapplication ~Tapplication clientno clientRequest наименование TTcpServer ~TTcpServer connection disconnection send sendAll clientno receive наименование Tsotr vibor mm nn nnplus параметры вызова _ _ _ Таблица 7. Методы TModel область видимости public public public область параметры вызова видимости QByteArray&, Eevents, void* private int,char** public _ public int public int,QByteArray public Таблица 8. Методы TApplication параметры вызова quint16 _ _ _ int,QByteArray QByteArray int int,QByteArray Таблица 9. Методы TTcpServer параметры вызова _ int _ _ _ Таблица 10. Методы TSotr область видимости public public private private public public public public область видимости public public public public public 3.3.3. Заголовочные файлы (h-файлы) классов (только поля и прототипы методов) TKassa QVector <QVector <double> > kassa; 17 int n; TKassa(int); void ver(); int sr(); int vibor(); int svob(); void plusch(int); void minusch(int); int och(int); double vr(int); void vrminus(int); void obn(int); void vrplus(int, double); int nn(); TModel static TParamData defaultParameters; TParamData parameters; static TStateData defaultState; TStateData state; TKassa *kassa; TModel(); void init(); void init2(); void tact(); TApplication TTcpServer* server; TModel *model; bool formMessage(QByteArray&,EEvents,void*); TApplication(int,char**); ~TApplication(); 18 void clientno(int); void clientRequest(int,QByteArray); TTcpServer QVector<QTcpSocket*> clients; TTcpServer(quint16); ~TTcpServer(); void connection(); void disconnection(); void reading(); void send(int,QByteArray); void sendAll(QByteArray); void clientno(int); void recieve(int,QByteArray); TSotr int m;//выбирает кассу; int n;//номер TSotr(); void vibor(int); int mm(); int nn(); void nnplus(); 19 3.4. Диаграммы последовательностей обработки каждого типа событий от приложения «Интерфейс» Рис. 8. Диаграмма последовательностей обработки 4. ПЕРЕЧЕНЬ ТИПОВ И СТРУКТУРЫ СООБЩЕНИЙ 4.1. Перечень типов и структуры сообщений от клиента к серверу С клиента на сервер отправляются данные из разных окон. Из окна параметров по нажатию на кнопку «Применить» на сервер отправляются данные о количестве касс и разнице между скоростями прихода сотрудников и работы кассиров. Из окна управления отправляются данные о приходе очередного сотрудника. Кроме того, есть кнопка «Сброс», при нажатии на которую на сервере удаляется информация о пришедших сотрудниках и заполнении касс, остается только информация о количестве касс и разнице между скоростями прихода сотрудников и работы кассиров. Также есть кнопка «Автоматический режим», при нажатии которой сотрудники приходят в бухгалтерию автоматически. 4.2. Перечень типов и структуры сообщений от сервера к клиенту Как только данные приходят на сервер, и они непустые, то они обрабатываются и отправляются к клиенту и обновляются в окне «Состояние». 20 5. ВЫВОДЫ В результате выполнения курсовой работы было создано приложение, имитирующее работу бухгалтерии предприятия, включающего кассы, выдающих зарплаты сотрудникам. Реализована возможность выбора кассы пришедшим сотрудником в соответствии с формулой, указанной в работе, либо равновероятно. В окне параметров устанавливается соотношение скоростей прибывания новых сотрудников и обслуживания этих сотрудников, благодаря чему имитируется поведение реальной очереди. Количество касс и соответственно очередей вводится пользователем также в окне параметров. В окне управления определяется режим работы программы (ручной либо автоматический), после чего в окне состояний пользователь может проследить состояния объектов предметной области. Приложение было написано, опираясь на парадигмы объектноориентрованного программирования. 21 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Леоненков А.В. Самоучитель UML 2. — СПб.: БХВ-Петербург, 2007. — 576 с.: ил. 2. Егоров С.С. Лекции и методические указания. 3. QT Documentation. URL: https://doc.qt.io/ 4. gRPC Documentation. URL: https://grpc.io/ 22