Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Моделирование систем.doc
Скачиваний:
11
Добавлен:
01.04.2025
Размер:
1 Мб
Скачать
☆

Содержание отчета по лабораторной работе

1. Титульный лист.

2. Тема лабораторной работы.

3. Цель лабораторной работы.

4. Отражение хода лабораторной работы.

5. Вывод.

18.2. Лабораторная работа №2. Имитационное моделирование информационных процессов на языке высокого уровня. Модель с постоянным шагом.

Цель работы: исследование возможностей и приобретение навыков использования имитационных моделей, реализованных с помощью языка С++ на основе модели с постоянным шагом.

Методические указания

Рассмотрим процесс моделирования системы на языке С++. Пусть генерируются заявки каждые 3+-2 секунды, которые попадают в очередь. После этого транзакты поступают в одну из свободных ЭВМ и обрабатываются втечении 8+-1 и 4+-2 сек. соответственно. Далее после обработки они удаляются из системы. Данный процесс показан на рисунке 18.1.

Рис. 18.1. Q-схема прохождения заявки

В этой задаче необходимо найти:

1. Текущее количество заявок в очереди.

2. Обработанное количество заявок.

Форма приложения представлена на рисунке 18.2.

Рис. 18.2. Форма приложения

На ней показаны параметры модели, которые можно регулировать, кнопка запуска и результаты моделирования.

Заголовочный файл программы имеет вид:

model.h

//-----------------------------------------------

#ifndef modelH

#define modelH

//-----------------------------------------------#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

//-----------------------------------------------class TForm1 : public TForm

{

__published: // IDE-managed Components

TGroupBox *GroupBox1;

TLabel *Label1;

TEdit *Edit1;

TLabel *Label2;

TEdit *Edit2;

TEdit *Edit3;

TLabel *Label3;

TEdit *Edit4;

TEdit *Edit5;

TLabel *Label4;

TEdit *Edit6;

TEdit *Edit7;

TButton *Button1;

TGroupBox *GroupBox2;

TLabel *Label5;

TEdit *Edit8;

TLabel *Label6;

TEdit *Edit9;

TLabel *Label7;

TLabel *Label8;

TLabel *Label9;

void __fastcall Button1Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

struct Device{ //структура Устройство

boolean free;//состояние, true-свободен, false-занят

int count; //обработанные заявки

int time; //время обслуживания устройством

};

//-----------------------------------------------extern PACKAGE TForm1 *Form1;

//-----------------------------------------------

#endif

Листинг формы представлен следующим образом:

model.cpp

//-----------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "model.h"

#include <stdlib.h>

//-----------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//-----------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

int tm=0;//модельное время

int tk=0,ak=0;//время генерации заявки и ее интервал

Device c1,c2;//ЭВМ1 и ЭВМ2

int queue1=0;//очередь

int tgen1,tgen2;//время генерация заявок

int tend;//время окончания моделирования

int t1evm1,t2evm1,t1evm2,t2evm2;//время обработки на ЭВМ1 и ЭВМ2;

//инициализация данных

tgen1=StrToInt(Edit1->Text);

tgen2=StrToInt(Edit2->Text);

tend=StrToInt(Edit3->Text);

t1evm1=StrToInt(Edit4->Text);

t2evm1=StrToInt(Edit5->Text);

t1evm2=StrToInt(Edit6->Text);

t2evm2=StrToInt(Edit7->Text);

c1.free=True;//ЭВМ1 свободна

c1.count=0;//текущее количество обработанных заявок равно 0

c1.time=0;

c2.free=True;//ЭВМ2 свободна

c2.count=0;

c2.time=0;

Randomize();

//открываем цикл по времени

while (tm<tend)

{

tm++;//увеличиваем модельное время

if (ak==0)//если можно создать заявку,

{

//то генерируем интервал ее поступления

ak=(tgen1-tgen2)+random(2*tgen2+1);

tk=tk+ak;//вычисляем время генерации следующей заявки

}

if (tm==tk)//если модельное время равно времени генерации заявки, то

{

queue1++;//увеличиваем очередь на 1

}

if (c1.free&&queue1>0)//если ЭВМ1 свободна и очередь не пуста,

{

//то определяем время занятости ЭВМ1

c1.time=(t1evm1-t2evm1)+random(2*t2evm1+1);

//и занимаем ее

c1.free=False;

queue1--;//удаляем заявку из очереди

}

else //иначе, если свободна ЭВМ2 и очередь не пуста,

if (c2.free&&queue1>0)//то обрабатываем заявку на этом устройстве

{

c2.time=(t1evm2-t2evm2)+random(2*t2evm2+1);

c2.free=False;

queue1--;

}

if (c1.time>0) c1.time--;//уменьшаем время обработки на ЭВМ1

else

if (c1.time==0&&!(c1.free))//если время обслуживания завершено

//и ЭВМ1 не свободна,

{

c1.free=True;//то освобождаем ЭВМ1

c1.count++;//увеличиваем число обслуженных заявок

}

if (c2.time>0) c2.time--;//уменьшаем время обработки на ЭВМ2

else

if (c2.time==0&&!(c2.free))//если время обслуживания завершено,

{

c2.free=True;//то освобождаем ЭВМ2

c2.count++;//увеличиваем число обслуженных заявок

}

if (ak>0) ak--;//приближаемся к генерации следующей заявки

}

//вывод результатов моделирования

Edit8->Text=IntToStr(queue1);

Edit9->Text=IntToStr(c1.count+c2.count);

}

//-----------------------------------------------

В заголовочном файле model.h описывается структура Device, которая применяется в основном модуле программы model.cpp. Программа сначала считывает исходные данные для моделирования и инициализирует состояние системы. Затем в цикле происходит генерация новой заявки, помещение ее в очередь и занятие одним из устройств либо ЭВМ1, либо ЭВМ2. Если обе машины заняты, то возвращаемся на начало цикла и увеличиваем время моделирования системы на единицу. Цикл продолжается до тех пор, пока не истечен заданный период имитации.