⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 可以简单计算petri网的状态空间,用来分析petri网的特性
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    this->Label1->Caption = "请输入位置(Place)的数目: N(小于10)=";
    this->Edit1->Text = "";

    this->Label2->Caption = "请输入过渡(Tansition)的数目: M(小于10)=";
    this->Edit2->Text = "";

    GroupBox1->Align=alClient;
    GroupBox2->Align=alClient;
    GroupBox3->Align=alClient;
    GroupBox2->Visible = false;
    GroupBox3->Visible = false;
    this->Width = 600;
    this->Height = 250;

}


//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
    if( Key != 8 )
    {
      if( (Key<'0' || Key>'9') || (Key=='0' && Edit1->Text.Length() == 0) )
       {
            Key = 0;
            MessageBeep(MB_OK);
       }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
   if( Key != 8 )
    {
      if( (Key<'0' || Key>'9') || (Key=='0' && Edit2->Text.Length() == 0) )
       {
            Key = 0;
            MessageBeep(MB_OK);
       }
    }
}
//----------------------------------------------------------------------------
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{
   if( Key != 8 )
    {
      if( Key<'0' || Key>'9' )
       {
            Key = 0;
            MessageBeep(MB_OK);
       }
    }
}
//-----------------------------------------------------------------------------
void __fastcall TForm1::EditKeyPress(TObject *Sender, char &Key)
{
    if( Key != 8 )
    {
      if(Key<'0' || Key>'1') 
       {
            Key = 0;
            MessageBeep(MB_OK);
       }
    }
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    this->Edit1->Text = "";
    this->Edit2->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     if( Edit1->Text.Length() == 0 || Edit2->Text.Length() == 0)
     {
        MessageBox(this->Handle, "输入数据为空!请重输!", "错误", 0);
        return;
     }
     
     n = Edit1->Text.ToInt();
     m = Edit2->Text.ToInt();

     this->Height = 400 + 40*m ;
     this->Width  = (100 + 70*n >600)?100 + 70*n:600;
     this->Button3->Top = 300 + 40*m ;
     this->Button3->Left = this->Width-200 ;

     for(int i=0; i<500; i++)
        for(int j=0; j<MaxN; j++)
            StatusSpace[i][j] = 0;
     
     Label3->Caption = "请逐个输入每个过渡的输入位置,是输入位置用1表示,反之用0表示:";
     Label4->Caption = "请逐个输入每个过渡的输出位置,是输出位置用1表示,反之用0表示:";
     Label4->Left = 40;
     Label4->Top = 100+20*m;
     Label5->Caption = "请逐个输入每个位置的Token数:";
     Label5->Left = 40;
     Label5->Top = 195+40*m;
     Label6->Caption = "请输入状态转移的你想要的最大深度:";
     Label6->Left = 40;
     Label6->Top = 300+40*m;
     Edit3->Left = 270;
     Edit3->Top = 300+40*m;
     GroupBox1->Visible = false;
     GroupBox2->Visible = true;
     EditIn.Length  = m;
     EditOut.Length = m;
     EditToken.Length = n;
     LabelIn.Length  = m;
     LabelOut.Length = m;
     LabelPlaceIn.Length = n;
     LabelPlaceOut.Length = n;
     LabelPlaceToken.Length = n;

     for(int i=0; i<n; i++)
     {
        LabelPlaceIn[i]  = new TLabel(this);
        LabelPlaceIn[i]->Parent =  GroupBox2;
        LabelPlaceIn[i]->Caption = "位置" + String(i+1);
        LabelPlaceIn[i]->Height = 20;
        LabelPlaceIn[i]->Width = 50;
        LabelPlaceIn[i]->Top =  60;
        LabelPlaceIn[i]->Left = 50+i*70;
        
        LabelPlaceOut[i] = new TLabel(this);
        LabelPlaceOut[i]->Parent =  GroupBox2;
        LabelPlaceOut[i]->Caption = "位置" + String(i+1);
        LabelPlaceOut[i]->Height = 20;
        LabelPlaceOut[i]->Width = 50;
        LabelPlaceOut[i]->Top =  125+20*m;
        LabelPlaceOut[i]->Left = 50+i*70;

        LabelPlaceToken[i] = new TLabel(this);
        LabelPlaceToken[i]->Parent =  GroupBox2;
        LabelPlaceToken[i]->Caption = "位置" + String(i+1);
        LabelPlaceToken[i]->Height = 20;
        LabelPlaceToken[i]->Width = 50;
        LabelPlaceToken[i]->Top =  220+40*m;
        LabelPlaceToken[i]->Left = 50+i*70;

        EditToken[i] = new TEdit(this);
        EditToken[i]->Name = "EditToken" + String(i+1);
        EditToken[i]->Parent = GroupBox2;
        EditToken[i]->Text = "0";
        EditToken[i]->Width = 50;
        EditToken[i]->Height = 20;
        EditToken[i]->Top  = 240+40*m;
        EditToken[i]->Left = 50+i*70;
        EditToken[i]->Visible = true;
        EditToken[i]->MaxLength = 2;
        EditToken[i]->OnKeyPress = Edit3KeyPress;


     }

     for(int i=0; i<m; i++)
     {
        EditIn[i].Length  = n;
        EditOut[i].Length = n;

        LabelIn[i]  = new TLabel(this);
        LabelIn[i]->Parent =  GroupBox2;
        LabelIn[i]->Caption = "过渡" + String(i+1);
        LabelIn[i]->Height = 20;
        LabelIn[i]->Width = 50;
        LabelIn[i]->Top = 85+i*20;
        LabelIn[i]->Left = 10;

        LabelOut[i] = new TLabel(this);
        LabelOut[i]->Parent =  GroupBox2;
        LabelOut[i]->Caption = "过渡" + String(i+1);
        LabelOut[i]->Height = 20;
        LabelOut[i]->Width = 50;
        LabelOut[i]->Top = 155+20*m+i*20;
        LabelOut[i]->Left = 10;

        for(int j=0; j<n; j++)
        {
            EditIn[i][j] = new TEdit(this);
            EditIn[i][j]->Name = "EditIn" + String(i) + String(j);
            EditIn[i][j]->Parent = GroupBox2;
            EditIn[i][j]->Text = "0";
            EditIn[i][j]->Width = 50;
            EditIn[i][j]->Height = 20;
            EditIn[i][j]->Top  = 80+i*20;
            EditIn[i][j]->Left = 50+j*70;
            EditIn[i][j]->Visible = true;
            EditIn[i][j]->MaxLength = 1;
            EditIn[i][j]->OnKeyPress = EditKeyPress;

            EditOut[i][j] = new TEdit(this);
            EditOut[i][j]->Name = "EditOut" + String(i) + String(j);
            EditOut[i][j]->Parent = GroupBox2;
            EditOut[i][j]->Text = "0";
            EditOut[i][j]->Width = 50;
            EditOut[i][j]->Height = 20;
            EditOut[i][j]->Top  = 150+20*m+i*20;
            EditOut[i][j]->Left = 50+j*70;
            EditOut[i][j]->Visible = true;
            EditOut[i][j]->MaxLength = 1;
            EditOut[i][j]->OnKeyPress = EditKeyPress;
         }
     }

}

//---------------------------------------------------------------------------
bool __fastcall TForm1::CanFire(int T, int Current)
{ //判断当前过渡T在 当前状态Current下能否被点燃
   for(int i=0; i<n; i++)
   {
      int temp = EditIn[T][i]->Text.ToInt(); //是T的输入位置
      if( (temp == 1) && (StatusSpace[Current][i] == 0) ) //但当前状态该位置没有Token
                   return false;
   }

   return true;

}
//-------------------------------------------------------------------------
bool __fastcall TForm1::IsRepeat(int t)
{  //判断t位置的状态是否与它前面的状态有重复
   int i,j;
   for( i=0; i<t; i++)
   {
      for( j=0; j<n; j+=1)
        {  if(StatusSpace[t][j] != StatusSpace[i][j])   break;  }
      if( j==n )  return true;
   }

   return false;


}
//--------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    for(int i=0; i<m; i++)
    {
       for(int j=0; j<n; j++)
       {
          if( EditIn[i][j]->Text == "" || EditOut[i][j]->Text == "" )
          {
               MessageBox(this->Handle, "数据输入不完整!", "错误", 0);
               return;
          }
       }
    }

    for(int i=0; i<n; i++)
    {
       if(EditToken[i]->Text == "")
       {
               MessageBox(this->Handle, "数据输入不完整!", "错误", 0);
               return;
       }
    }

    if(Edit3->Text == "")
    {
          MessageBox(this->Handle, "数据输入不完整!", "错误", 0);
          return;
    }

    if(Edit3->Text.ToInt()>20)
    {
          MessageBox(this->Handle, "你需要计算的深度过大!请改小点!", "错误", 0);
          return;
    }

    int depth, start, end, total;
    depth=start=end=0;
    total=1;

    for(int i=0; i<n; i++)   StatusSpace[0][i] = EditToken[i]->Text.ToInt();

    while(depth<Edit3->Text.ToInt())
    {
       for(int i=start; i<=end; i++)
       {
           for(int j=0; j<m; j++)//对每一个过渡
           {
               if( CanFire(j,i) )//该过渡能被点燃
               {
                    for(int s=0; s<n; s++) //复制当前状态
                            StatusSpace[total][s] = StatusSpace[i][s];
                    for(int k=0; k<n; k++) //修改输入输出位置的Token
                    {
                        if(EditIn[j][k]->Text.ToInt()==1)//是该过渡的输入
                            StatusSpace[total][k] -= 1;  //失去Token
                        if(EditOut[j][k]->Text.ToInt()==1)//是该过渡的输出
                            StatusSpace[total][k] += 1;  //得到Token
                    }
                    
                    StatusSpace[total][n]  = i;  //保存状态转移的原状态
                    StatusSpace[total][n+1]= j ;    //保存状态转移的经过的过渡

                    if(!IsRepeat(total))   total += 1;  //没有与以前的状态重复就保存
               }
           }//当前状态所有过渡都已经处理完毕
       }//该层已经处理完毕
       if( end+1 == total )   break;  //没有生成新的状态
       start = end+1;
       end   = total-1;  //设置新的开始位置与结束位置
       depth += 1;
    }

    GroupBox1->Visible = false;
    GroupBox3->Visible = true;
    GroupBox2->Visible = false;
    this->Width = 800;

    TListItem *NewItem;
    NewItem = Form1->ListView1->Items->Add();
    NewItem->Caption = "初始状态:U" + String(0);
    AnsiString s;
    for(int i=0; i<n; i++)  s = s + AnsiString(StatusSpace[0][i]) + "--";
    NewItem->SubItems->Add(s);

    for(int i=1; i<total; i++)
    {
        NewItem = Form1->ListView1->Items->Add();
        int j=StatusSpace[i][n+1]; //原来过渡
        AnsiString s1 ;
        s1 = "T" + AnsiString(j+1); 
        int k = StatusSpace[i][n];  //原来状态
        while(k>0)
        {
           s1.Insert("T" + AnsiString(StatusSpace[k][n+1]+1) + "-->" , 0);
           k =  StatusSpace[k][n];
        }
        s1.Insert("状态:U" + AnsiString(i) + ">>", 0);
        NewItem->Caption = s1;
        AnsiString s2;
        for(int x=0; x<n; x++)  s2 = s2 + AnsiString(StatusSpace[i][x]) + "--";
        NewItem->SubItems->Add(s2);
    }

    
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
      for(int i=0; i<m; i++)
      {
         delete LabelIn[i];
         delete LabelOut[i];
         for(int j=0; j<n; j++)
         {
              delete EditIn[i][j];
              delete EditOut[i][j];
         }
      }

      for(int i=0; i<n; i++)
      {
         delete LabelPlaceIn[i];
         delete LabelPlaceOut[i];
         delete LabelPlaceToken[i];
         delete EditToken[i];

      }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -