Файл: Курсовая работа по дисциплине Технология программирования.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 02.02.2024

Просмотров: 45

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕУЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСТЕТ»


Кафедра

«КАФЕДРА ИНФОРМАТИКИ»
Курсовая работа


по дисциплине

«Технология программирования»
Моделирование движения транспорта на перекрестке


фио
Cтyдeнт _______________ Поверина А.А.


пoдпиcь дaтa

Гpyппa З-УТ-18

Pyкoвoдитeль

учeнaя cтeпeнь yчeнoe звaниe
Доцент, к.т.н. _____________ Батищев Р.В


фио

пoдпиcь дaтa


г.Липецк, 2023

Оглавление

Постановка задачи 2

Описание классов 4

Класс Simulation 4

Класс Mashina 7

Класс RandomNumber 9

Рис.1 Взаимосвязь классов 10

Описание разработанного приложения 10

Тестирование 14

Заключение 17

Список использованной литературы 18

Листинг 19






Постановка задачи


Данное приложение разработано для моделирования перекрёстка со светофором. Программа моделирует движение машин через перекрёсток по четырём направлениям. Моделирование осуществляется N раз (N – количество итераций) и на экран выводятся усреднённые результаты. Таким образом, чем больше N, тем результат более близок к реальному.

Входные данные:

Общие начальные данные для всех направлений:

  • Продолжительность моделируемого периода (время, в течение которого на перекрёсток буду прибывать машины)

  • Режим работы светофора: время горения запрещающего и разрешающего сигналов. С разрешающего сигнала светофор начинает работать по 1-му и 2-му направлениям .

  • Количество программных итераций (N)

Начальные данные по каждому из 4-х направлений:

  • количество полос для движения (пропускная способность перекрёстка по данному направлению).Максимальное количество полос = 10.

  • интенсивность движения машин (диапазон времени между прибытием машин)

  • диапазон времени задержки машин на перекрёстке (т.е. время, которое водитель, при разрешающем сигнале светофора, потратит на то, чтобы освободить перекрёсток )


Результаты моделирования (по каждому направлению):

  • количество машин, проехавших через перекрёсток

  • загруженность каждой полосы (количество машин, проехавших по каждой полосе)

  • среднее время ожидания в пробке

  • среднее время ожидания на светофоре


Описание классов

Класс Simulation


Назначение класса. Класс предназначен для того, чтобы хранить начальные данные, собирать статистику результатов моделирования, осуществлять запуск моделирования и обрабатывать результаты моделирования.

Данные-элементы класса.

RandomNumber rnd – объект класса RandomNumber, использующийся для рассчёта случайных значений

static int TGlobal – переменная для имитации глобального времени

static int timе - длина моделируемого периода работы

int *kolPol - количество полос для движения по каждому из 4-х направлений

static int *arrivalLow , static int *arrivalHigh - диапазон времени между приходами машин по каждому из 4-х направлений

static int *delayLow, static int *delayHigh - диапазон времени задержки машин на перекрёстке по каждому из 4-х направлений

static int TimeGreen - время горения разрешающего сигнала светофора (в секундах)

static int TimeRed - время горения запрещающего сигнала светофора (в секундах)

static int *countElem - количество машин, проехавших через перекрёсток по каждому из 4-х направлений

Данные-элементы, предназначенные для накопления статистики по каждой машине:

static int **Pol – номер полосы для движения, по которой проехала машина по каждому из 4-х направлений

static int **ojOch - время ожидания в очереди (т.е. в случае, когда при прибытии машины на перекрёсток, предыдущая машина ещё не покинула перекрёсток) по каждому из 4-х направлений

static int *ojSv - время ожидания при запрещающем сигнале светофора по каждому из 4-х направлений

Данные для накопления статистики при N программных итераций

static int **countE - [N][4] - хранит количество машин, проехавших через перекрёсток, для каждой итерации

static int **srTimeOjOch - [N][4] среднее время ожидания в пробке по каждому из 4-х направлений по каждой из N итераций

static int **srTimeOjSv - [N][4] среднее время ожидания на светофоре по каждому из 4-х направлений по каждой из N итераций

Интерфейскласса.

Simulation(int, int*, int*, int*, int*, int*, int, int, int) – конструктор класса. В качестве параметров конструктору передаются следующие значения:

  • длина моделируемого периода работы

  • количество полос для движения по каждому из 4-х направлений

  • диапазон времени между приходами машин по каждому из 4-х направлений

  • диапазон времени задержки машин на перекрёстке по каждому из 4-х направлений

  • время горения разрешающего сигнала светофора (в секундах)

  • время горения запрещающего сигнала светофора (в секундах)

  • количество программных итераций


Переданные значения помещаются в соответствующие статические переменные, помеченные как защищённые. Метка static используется для того, чтобы значения этих переменных были одинаковы для всех элементов подкласса Mashina, являющегося наследником класса Simulation.

void RunSimulation() – открытая функция-элемент класса, предназначенная для запуска моделирования. Она создаёт массив элементов класса Mashina, представляющий собой двусвязный список и имитирующий очередь машин. Количество элементов в массиве соответствует количеству полос для движения. Затем она вычисляет время прибытия каждой машины и помещает её в соответствующий список.

При помещении машины в список, в специальные данные-члены класса помещается вся информация по данной машине. Так, в этих данных-членах накапливается информация о всех машинах, проехавших через перекрёсток.

Так же здесь происходит изменение глобального времени путём прибавления к нему времени прибытия очередной машины. Моделирование завершается тогда, когда глобальное время становится больше времени моделирования, которое задаётся пользователем.

Весь этот процесс моделирования выполняется в цикле N раз. При каждой итерации заполняются массивы, предназначенные для сбора статистики по всем итерациям.

Функции-утилиты.

int SrTimeOjOch(int h) - возвращает среднее время ожидания в пробке. В качестве аргумента функции передаётся номер направления

int SrTimeOjSv(int h) - возвращает среднее время ожидания на светофоре.

Класс Mashina


Назначение класса. Класс предназначен для имитации очереди машин. Он представляет собой двусвязный список, в который добавляются машины, прибывшие на перекрёсток. На время отбытия прибывшей машины влияет время отбытия предшествующей ей машины, т.к. машина может покинуть перекрёсток только после того, как покинет перекрёсток стоящая перед ней машина.

Данные-элементы класса.

Открытые данные-элементы, обеспечивающие работу двусвязного списка:

Mashina *pHead - указатель на первый элемент списка

Mashina *pPrev - указатель на последний элемент списка

Mashina *next, *pred - указатели на следующий и на предыдущий элементы списка

Закрытые данные-элементы, содержащие всю информацию об элементе списка:

int Tprib - время прибытия

int TojPer - время ожидания на перекрёстке


int TojOch - время ожидания в очереди (т.е. в случае, когда при прибытии машины на перекрёсток, предыдущая машина ещё не покинула перекрёсток)

int TojSv - время ожидания при запрещающем сигнале светофора

int Totb - время отбытия с перекрёстка

Интерфейс класса.

void addToList(int, int, int, int) - функция добавления элемента в список. В качестве параметров функции передаётся время прибытия машины, номер полосы, на которую встала машина, номер направления и номер итерации. Вся остальная информация о машине (время ожидания на перекрёстке, время ожидания в очереди, время ожидания при запрещающем сигнале светофора, время отбытия с перекрёстка) рассчитывается внутри функции. Все данные о машине записываются в статические данные-элементы класса Simulation, которые накапливают информацию о всех машинах, прошедших через перекрёсток.

int KolOstMash(int) - в качестве параметра функции передаётся время прибытия очередной машины. Функция возвращает количество машин, время отбытия которых (Totb) больше, чем время прибытия очередной машины (tprib), т.е. количество машин, ещё не уехавших с перекрёстка в момент прибытия очередной машины. Значение, возвращаемое функцией используется в открытой функции-элементе RunSimulation класса Simulation при выборе полосы, на которую встать машине при подъезде к перекрёстку. Выбирается та полоса, на которой меньше (не уехавших!) машин.

Класс RandomNumber


Назначение класса. Класс предназначен для получения случайных натуральных чисел, которые используются для расчёта времени прибытия машины и времени ожидания машины на перекрёстке.

Данные-элементы класса.

unsigned long randSeed - текущее seed-значение

Интерфейс класса.

RandomNumber () – конструктор. Задаёт seed-значение посредством функции time (0).

unsigned short Random ( unsigned long n ) - функция, которая возвращает целое псевдослучайное число, равномерно распределенное в диапазоне [ 0, n -1 ].

При каждом вызове функция изменяет текущее значение сво­его параметра (seed-значение) и создает из него случайное число. Функция в силу детерминированной природы алгоритма создает не абсолютно случайные числа, а псевдослучайные числа. Если запус­кать генератор с одним и тем же начальным seed-значением, то он будет порождать одну и ту же последовательность псевдослу­чайных чисел. Однако, если его запускать с разными начальными seed-значениями, то он будет создавать уникальные последова­тельности псевдослучайных чисел.



RandomNumber

Simulation





Mashina


- наследование

- композиция



Рис.1 Взаимосвязь классов









Описание разработанного приложения


При первом запуске приложения пользователю предлагается ввести исходные данные для моделирования:



Рис.2 Вид разработанного приложения

Вводим начальные данные и нажимаем кнопку «Запустить моделирование».



Рис.3 Вид разработанного приложения
На форме появилась надпись «Моделирование успешно завершено!».

Результаты моделирования появились на информационном табло.

При этом в директории, откуда запускалось приложение, создался файл с именем «data.txt», куда записались начальные значения, введённые пользователем.


Теперь, при следующем запуске программы, начальные значения, сохранённые при предыдущем моделировании, автоматически заполнят пустые ячейки:




Рис.4 Вид разработанного приложения
Для того, чтобы при запуске приложения ячейки автоматически не заполнялись, нужно удалить файл data.txt.

Тестирование


Задаём следующие начальные значения:

Длина моделируемого периода : 3 мин

Время горения разрешающего сигнала светофора :20 сек

Время горения запрещающего сигнала светофора :25 сек

Количество программных итераций : 1000
1-е направление

Интервал времени между прибытием машин : 2 - 3 сек

Интервал времени задержки машин на перекрёстке : 3 - 5 сек