📄 mainunit.pas
字号:
unit mainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
type
Pedge_node =^Edge_node;//状态迁移事件节点【边节点】
Edge_node = record
edgename:string;
nextnodenum:integer; //边节点名称
nextedge:Pedge_node; //下一条边
end;
type
Pvertex_node = ^vertex_node;//状态节点【点节点】
vertex_node = record
vertexname:String; //状态节点名称
link:Pedge_node; //连接到边节点
end;
////////////////++++++++++
const
MAXNODE=20;
MAXCOST=30;
const
MAX=20; /////最大的边数
type
edge_pair=record
first:integer;
second:integer;
end;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
openfile: TMenuItem;
save: TMenuItem;
N3: TMenuItem;
statecover: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N1: TMenuItem;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
stateCoverFile: TMenuItem;
stateCoverGrafh: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N2: TMenuItem;
procedure openfileClick(Sender: TObject);
function match(substr:string;str:string):string;
function findnumber(name:string):integer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure stateCoverFileClick(Sender: TObject);
function findedge(first:integer;second:integer):string;
procedure stateCoverGrafhClick(Sender: TObject);
procedure N2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
judge:boolean;
Stategrafh:Tlist;////////用于存储状态图的邻接表
answer:array[0..MAX] of edge_pair;
implementation
uses Unit2,Unit3;
{$R *.dfm}
function TForm1.findedge(first:integer;second:integer):string;//输入两个状态节点的编号返回他们对应的边的名称,如果不存在并提示错误
var
p:Pedge_node;
begin
if (stategrafh.Count>0) and (first<stategrafh.Count) and (second<stategrafh.Count) then
begin
p:=Pvertex_node(stategrafh.Items[first]).link;
while (p.nextnodenum<>second) and (p<>nil) do
begin
p:=p.nextedge;
end;
if p=nil then
begin
showmessage('这条边不存在##');
result:='';
end
else result:=p.edgename;
end
else
begin
showmessage('错误:你还没有输入状态转换图!!!!!或者程序调用错误!!!');
result:='';
end;
end;
function Tform1.findnumber(name:string):integer;
var
i:integer;
rr:integer;
pp:Pvertex_node;
begin
rr:=-1;
for i:=0 to stategrafh.Count-1 do
begin
pp:=stategrafh.Items[i];
if pp.vertexname=name then
begin
rr:=i;
break;
end;
end;
result:=rr;
end;
function TForm1.match(substr:string;str:string):string;
var
i,j,k:integer;
tt:string;
y:string;
begin
y:='';
for i:=1 to (length(str)-length(substr)+1) do
begin
k:=i;
tt:='';
for j:=1 to length(substr) do
begin
tt:=tt+str[k];
k:=k+1;
end;
if tt=substr then
begin
// y:='';
for k:=i+length(substr) to length(str) do
begin
if str[k]<>'"' then
y:=y+str[k]
else break;
end;
// result:=y;
// break;
end;
end;
result:=y;
end;
procedure TForm1.openfileClick(Sender: TObject);
var
F: TextFile;
other:string;
S: string;
output:string;
event:string;
supplier:string;
first,second:string;
vertex:Pvertex_node;
edge:Pedge_node;
i:integer;
midfile:TextFile; //开始节点必须为'start'
ind:integer;
begin
// ind:=-1; ////最大的节点数
if OpenDialog1.Execute then { Display Open dialog box }
begin
AssignFile(F, OpenDialog1.FileName); { File selected in dialog }
Reset(F);
while not EOF(F) do //初始化邻接表
begin
readln(F,S);
// Edit1.Text := S; { Put string in a TEdit control }
output:=match('(object State "',S);
ind:=findnumber(output);
if (output<>'')and (ind=-1) then
begin
// memo1.Lines.Add(output);
new(vertex);
vertex.vertexname:=output;
vertex.link:=nil;
stategrafh.Add(vertex);
end;
// edit2.Text:=output;
end;
memo1.Lines.Clear; /////
memo2.Lines.Clear;
memo3.Lines.Clear;
memo1.Lines.Add('############状态节点如下: ###########') ;
for i:=0 to stategrafh.Count-1 do
memo1.Lines.Add(Pvertex_node(stategrafh.Items[i]).vertexname);
CloseFile(F);
Reset(F);
readln(F,S);
first:=match('(object State "',S);
while (not EOF(F))and(first='') do //寻找点节点对应的边节点
begin
readln(F,S);
first:=match('(object State "',S);
end;
memo2.Lines.Add('※※※※※※※※※※※※从文件中提取的状态转移图如下※※※※※※※※※※※※');
while(not EOF(F))and (other='') do
begin
if first<>'' then
begin
memo2.Lines.Add('******************************');
memo2.Lines.Add('ObjectState: '+first);///////////////////////////////////////////
ind:=findnumber(first);
readln(F,S);
second:=match('(object State "',S);
while (not EOF(F)) and (second='')and (other='') do
begin
supplier:=match('supplier "',S);
other:=match('(object Association "',S);
//if other<>'' then break;
if supplier<>'' then
begin
memo2.Lines.Add('supplier: '+supplier); //////////////////////////
new(edge);
if findnumber(supplier)=-1 then
showmessage('!!!!!!!!!!!!!!!!!!!!!');
edge.nextnodenum:=findnumber(supplier);
readln(F,S);
readln(F,S);
event:=match('Event (object Event "',S);
memo2.Lines.Add('event: '+event);///////////////////
edge.edgename:=event;
edge.nextedge:=Pvertex_node(stategrafh.Items[ind]).link;
Pvertex_node(stategrafh.Items[ind]).link:= edge;
end;
readln(F,S);
second:=match('(object State "',S);
other:=match('(object Association "',S);
end;
first:=second;
end;
end;
closeFile(F);
end;
memo1.Lines.Add('');
memo1.Lines.Add('************边节点如下:*************');
for i:=0 to stategrafh.Count-1 do
begin
edge:=Pvertex_node(stategrafh.Items[i]).link;
while edge<>nil do
begin
memo1.Lines.Add((Pvertex_node(stategrafh.Items[i]).vertexname+'------'+edge.edgename+'------>'+Pvertex_node(stategrafh.items[edge.nextnodenum]).vertexname));
edge:=edge.nextedge;
end;
memo1.Lines.Add('**********************************************');
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
judge:=false;
Stategrafh:=Tlist.Create;
for i:=0 to MAX do
begin
answer[i].first:=0;
answer[i].second:=0;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i:integer;
p:Pvertex_node;
edgehead,edgetail:Pedge_node;
begin
for i:=0 to stategrafh.Count-1 do
begin
p:=stategrafh.Items[i];
edgehead:=p.link;
edgetail:=p.link;
while(edgehead<>nil) do
begin
edgehead:=edgetail.nextedge;
dispose(edgetail);
edgetail:=edgehead;
end;
dispose(p);
end;
Stategrafh.Destroy;
end;
procedure TForm1.stateCoverFileClick(Sender: TObject); //转换为矩阵的形式易于编程,采用迪杰斯特拉算法求解
var
middle:array[0..MAX] of edge_pair;
cost:array[0..MAXNODE,0..MAXNODE]of integer;
dist: array[0..MAXNODE] of integer;//20 代表最大的节点数 ,如果要超过20的话就要修改最大的节点数MAXNODE
s:array[0..MAXNODE] of integer;
p:Pedge_node;
i,j:integer;
u,dis:integer;
mindis:integer;
pointer:integer;
k,l:integer;
// head,tail:integer;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -