Uploaded by anastasia

ООП курсовая

advertisement
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра ИС
КУРСОВАЯ РАБОТА
по дисциплине «Объектно-ориентированное программирование»
Тема: Разработка распределенной программной системы, имитирующей
жизненный цикл объектов предметной области
Вариант: 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
Download