?? 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 + -