Хабаровский Государственный Технический Университет
Кафедра ПОВТ и АС
Лабораторная работа по ТВП №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); - проверяет уровень достижимости графа
Листинг программы:
По соображениям экономии места не приводится (см. код программы)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.