📄 unit1.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 + -