?? unit1.~cpp
字號(hào):
//---------------------------------------------------------------------------
#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 = "請(qǐng)輸入位置(Place)的數(shù)目: N(小于10)=";
this->Edit1->Text = "";
this->Label2->Caption = "請(qǐng)輸入過(guò)渡(Tansition)的數(shù)目: 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, "輸入數(shù)據(jù)為空!請(qǐng)重輸!", "錯(cuò)誤", 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 = "請(qǐng)逐個(gè)輸入每個(gè)過(guò)渡的輸入位置,是輸入位置用1表示,反之用0表示:";
Label4->Caption = "請(qǐng)逐個(gè)輸入每個(gè)過(guò)渡的輸出位置,是輸出位置用1表示,反之用0表示:";
Label4->Left = 40;
Label4->Top = 100+20*m;
Label5->Caption = "請(qǐng)逐個(gè)輸入每個(gè)位置的Token數(shù):";
Label5->Left = 40;
Label5->Top = 195+40*m;
Label6->Caption = "請(qǐng)輸入狀態(tài)轉(zhuǎn)移的你想要的最大深度:";
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 = "過(guò)渡" + 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 = "過(guò)渡" + 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)
{ //判斷當(dāng)前過(guò)渡T在 當(dāng)前狀態(tài)Current下能否被點(diǎn)燃
for(int i=0; i<n; i++)
{
int temp = EditIn[T][i]->Text.ToInt(); //是T的輸入位置
if( (temp == 1) && (StatusSpace[Current][i] == 0) ) //但當(dāng)前狀態(tài)該位置沒(méi)有Token
return false;
}
return true;
}
//-------------------------------------------------------------------------
bool __fastcall TForm1::IsRepeat(int t)
{ //判斷t位置的狀態(tài)是否與它前面的狀態(tài)有重復(fù)
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, "數(shù)據(jù)輸入不完整!", "錯(cuò)誤", 0);
return;
}
}
}
for(int i=0; i<n; i++)
{
if(EditToken[i]->Text == "")
{
MessageBox(this->Handle, "數(shù)據(jù)輸入不完整!", "錯(cuò)誤", 0);
return;
}
}
if(Edit3->Text == "")
{
MessageBox(this->Handle, "數(shù)據(jù)輸入不完整!", "錯(cuò)誤", 0);
return;
}
if(Edit3->Text.ToInt()>20)
{
MessageBox(this->Handle, "你需要計(jì)算的深度過(guò)大!請(qǐng)改小點(diǎn)!", "錯(cuò)誤", 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++)//對(duì)每一個(gè)過(guò)渡
{
if( CanFire(j,i) )//該過(guò)渡能被點(diǎn)燃
{
for(int s=0; s<n; s++) //復(fù)制當(dāng)前狀態(tài)
StatusSpace[total][s] = StatusSpace[i][s];
for(int k=0; k<n; k++) //修改輸入輸出位置的Token
{
if(EditIn[j][k]->Text.ToInt()==1)//是該過(guò)渡的輸入
StatusSpace[total][k] -= 1; //失去Token
if(EditOut[j][k]->Text.ToInt()==1)//是該過(guò)渡的輸出
StatusSpace[total][k] += 1; //得到Token
}
StatusSpace[total][n] = i; //保存狀態(tài)轉(zhuǎn)移的原狀態(tài)
StatusSpace[total][n+1]= j ; //保存狀態(tài)轉(zhuǎn)移的經(jīng)過(guò)的過(guò)渡
if(!IsRepeat(total)) total += 1; //沒(méi)有與以前的狀態(tài)重復(fù)就保存
}
}//當(dāng)前狀態(tài)所有過(guò)渡都已經(jīng)處理完畢
}//該層已經(jīng)處理完畢
if( end+1 == total ) break; //沒(méi)有生成新的狀態(tài)
start = end+1;
end = total-1; //設(shè)置新的開(kāi)始位置與結(jié)束位置
depth += 1;
}
GroupBox1->Visible = false;
GroupBox3->Visible = true;
GroupBox2->Visible = false;
this->Width = 800;
TListItem *NewItem;
NewItem = Form1->ListView1->Items->Add();
NewItem->Caption = "初始狀態(tài):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]; //原來(lái)過(guò)渡
AnsiString s1 ;
s1 = "T" + AnsiString(j+1);
int k = StatusSpace[i][n]; //原來(lái)狀態(tài)
while(k>0)
{
s1.Insert("T" + AnsiString(StatusSpace[k][n+1]+1) + "-->" , 0);
k = StatusSpace[k][n];
}
s1.Insert("狀態(tài):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;
delete EditToken;
}
}
//---------------------------------------------------------------------------
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -