Написание программы, позволяющей создавать и редактировать произвольные сети Петри

Страницы работы

Содержание работы

Хабаровский Государственный Технический Университет

                                                                Кафедра ПОВТ и АС

Лабораторная работа по ТВП №2

                                                             Выполнил: ст-т группы ПО-12 Черенков В.Л.

Проверил: Бакланов  .  .

Хабаровск 2004

Задание: Написать программу, которая позволяла бы создавать и редактировать произвольные сети Петри. Также программа должна уметь проверять уровень достижимости графа.

Описание структуры программы: Программа построена на базе четырёх основных классов по принципу клиент-сервер. Серверная часть расположена в файле PetriServer.h и отвечает за манипуляции с стью Петри как со структурой. Клиентская часть расположена в модуле Unit1.cpp и отвечает за манипуляции с графическим представлением Сети Петри и за корректное реагирование на действия пользователя.

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

//-----------------class Arrow

{

public:

TPoint A,C,D,X; //опорные точки стрелки (AC и AD)

float k,angle;

int h;

Arrow () {h=5;angle=M_PI/6;}//параметры стрелки по умолчанию

void GetData(TPoint Top,TPoint T2,float naklon) {A=Top;k=naklon;X=T2;}

void MakeArrow()

};

class Top    //вершина

{

public:

int XPos,YPos,Radius;

int NChips;

int TopID;

Top () {};

Top (int X,int Y,int N,int id)

{XPos=X;YPos=Y;NChips=N;Radius=15;TopID=id;}

};

class Perehod

{

public:

int X1Pos,Y1Pos,X2Pos,Y2Pos;

int XPos,YPos;//координаты центра

int Radius;

bool Allowed;

int PerID;

Perehod (){};

Perehod (int X1,int Y1,int X2,int Y2,int id)

{

Radius=10;

X1Pos=X1;Y1Pos=Y1;X2Pos=X2;Y2Pos=Y2;

XPos=(X1+X2)/2;YPos=(Y1+Y2)/2;

PerID=id;

Allowed=false;

}

};

class Rib    //ребро

{

public:

TPoint A,B;

int NLines;

int TopID; //ID связанной вершины

int PerID; //ID связанного перехода

Arrow Strelka;

};

class RibTP:public Rib

{

public:

//вершина - переход

Top* TopBegin;

Perehod* PerEnd;

RibTP() {TopBegin=0;PerEnd=0;}

RibTP(Top* T1,Perehod* P2,int N)

{TopBegin=T1;PerEnd=P2;NLines=N;}

~RibTP () {TopBegin=0;PerEnd=0;}

void FillID (){TopID=TopBegin->TopID;PerID=PerEnd->PerID;}

void EvalRibTP();

};

class RibPT:public Rib

{

public:

//переход - вершина

Perehod* PerBegin;

Top* TopEnd;

RibPT () {PerBegin=0;TopEnd=0;}

RibPT (Perehod* P1,Top* T2,int N)

{PerBegin=P1;TopEnd=T2;NLines=N;}

~RibPT () {PerBegin=0;TopEnd=0;}

void FillID (){TopID=TopEnd->TopID;PerID=PerBegin->PerID;}

void EvalRibPT(TPoint LockT,TPoint LockP);

};

enum GrafStatus {AddTopMode,AddPerehodMode,AddRibMode,

TopLightMode,PerehodLightMode,RibLightMode};

enum LightStatus {None,TopLighted,PerehodLighted,

RibPTLighted,RibTPLighted};

class Graf

{

public:

int NTops;

int NRibsTP;

int NRibsPT;

int NPers;

GrafStatus Status;

LightStatus Light;

Top* TopList[1000];

RibTP* RibTPList[1000];

RibPT* RibPTList[1000];

Perehod* PerList[1000];

//-----constructor (Making Empty Graf)

Graf ()

{NTops=0;NRibsPT=0;NRibsTP=0;NPers=0;Status=AddTopMode;Light=None;}

//-----dectructor (Killing Graf)

~Graf ()

{

//удаляем все вершины

for (int i=0;i<NTops;i++) delete TopList[i];

//удаляем все рёбра

for (int i=0;i<NRibsPT;i++) delete RibPTList[i];

for (int i=0;i<NRibsTP;i++) delete RibTPList[i];

//удаляем все переходы

for (int i=0;i<NPers;i++) delete PerList[i];

NTops=0;NRibsPT=0;NRibsTP=0;NPers=0;

Status=AddTopMode;Light=None;

}

//список методов графа

void AddTop(int X,int Y, int NChips);

int TopByXY(int X,int Y);

void AddRibPT(Perehod* P1,Top* T2,int NLines);

void AddRibTP(Top* T1,Perehod* P2,int NLines);

void AddPerehod(int X1,int Y1,int X2,int Y2);

int PerehodByXY(int X,int Y);

void DeleteTop(Top* T);

void DeletePerehod(Perehod* P);

void DeleteRibPT(RibPT* R);

void DeleteRibTP(RibTP* R);

void SaveGraf();

void LoadGraf();

void AnalyzePerehods();

void RunPerehod(Perehod *P);

void RunBackPerehod(Perehod *P);

bool Test(int Level,int* MasSolve);

};

1. class Arrow

Ответственность:

Отвечает за выдачу корректных координат опорных точек стрелки по заданным параметрам.

Атрибуты:

TPoint A,C,D,X; - четыре опорные точки стрелки.

float k,angle; - коэффициент K ур-я линии стрелки y=K*x+b, angle – угол отклонения стрелки от прямой.

int h; - длина стрелки.

2. class Top

Ответственность:

Хранит информацию об одной из вершин сети Петри.

Атрибуты:

int XPos,YPos,Radius; - координаты вершины и её радиус.

int NChips; - кол-во фишек вершины.

int TopID; - идентификатор вершины.

3. class Perehod

Ответственность:

Хранит информацию об одном из переходов сети Петри.

Атрибуты:

int X1Pos,Y1Pos,X2Pos,Y2Pos;int XPos,YPos; - координаты перехода.

int Radius; - радиус кружочка посередине перехода.

bool Allowed; - переход разрешён/запрещён.

int PerID; - идентификатор перехода.

4. class Rib

Ответственность:

Абстрактный класс, содержит атрибуты общие для рёбер «вершина-переход» и «переход-вершина».

Атрибуты:

TPoint A,B; - точки для постоения ребра

int NLines; - количество линий

int TopID; - ID связанной вершины

int PerID; - ID связанного перехода

Arrow Strelka; - стрелка ребра

5. class RibTP:public Rib

Ответственность:

Класс ребро «вершина-переход». Отвечает за работу с выходящим из вершины ребром.

Атрибуты:

Top* TopBegin; - связанная вершина

Perehod* PerEnd; - связанное ребро

Методы:

void FillID () – заполняет поля TopID и PerId идентификаторами связанной вершины и перехода.

void EvalRibTP() – определяет точки, по которым наиболее оптимально можно связать вершину и переход

6. class RibPT:public Rib

(абсолютно аналогичен предыдущему классу)

7. class Graf

Ответственность:

Ответственнен за выполнение всех операций с сетью Петри.

Атрибуты:

int NTops; - количество вершин в сети Петри

int NRibsTP; - количество рёбер вершина-переход

int NRibsPT; - количество рёбер переход-вершина

int NPers; - количество переходов

GrafStatus Status; - текущий режим графа (добавление вершины, добавление перехода, добавление ребра, выборка вершины, выборка перехода, выборка ребра)

LightStatus Light; - текущий статус графа (обычный, выбрана вершина, выбран переход, выбрано ребро переход-вершина, выбрано ребро вершина-переход)

Top* TopList[1000]; - список вершин сети Петри

RibTP* RibTPList[1000]; - список рёбер вершина-переход

RibPT* RibPTList[1000]; - список рёбер переход-вершина

Perehod* PerList[1000]; - список переходов

Методы:

void AddTop(int X,int Y, int NChips); - добавляет вершину в сеть

int TopByXY(int X,int Y); - поиск вершины по координатам

void AddRibPT(Perehod* P1,Top* T2,int NLines); - добавляет ребро1 в сеть

void AddRibTP(Top* T1,Perehod* P2,int NLines); - добавляет ребро2 в сеть

void AddPerehod(int X1,int Y1,int X2,int Y2); - добавляет переход в сеть

int PerehodByXY(int X,int Y); - поиск перехода по координатам

void DeleteTop(Top* T); - удаляет вершину из сети

void DeletePerehod(Perehod* P); - удаляет переход из сети

void DeleteRibPT(RibPT* R); - удаляет ребро1

void DeleteRibTP(RibTP* R); - удаляет ребро2

void SaveGraf(); - сохраняет граф в файлы

void LoadGraf(); - загружает граф из файлов

void AnalyzePerehods(); - проставляет всем переходам сети свойство Allowed

void RunPerehod(Perehod *P); - запускает переход

void RunBackPerehod(Perehod *P); - отменяет запуск перехода

bool Test(int Level,int* MasSolve); - проверяет уровень достижимости графа

Листинг программы:

По соображениям экономии места не приводится (см. код программы)

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
48 Kb
Скачали:
0