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

📄 mainunit.~pas

📁 一个从UML的状态图的MDL文件获取测试用例的源码
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
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.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
  if stategrafh.count>0 then
begin

⌨️ 快捷键说明

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