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

📄 mainunit.~pas

📁 一个从UML的状态图的MDL文件获取测试用例的源码
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
  //head:=0;
 // tail:=0;
  pointer:=0;
  judge:=true;
  for i:=0 to MAX do
     begin
      middle[i].first:=0;
      middle[i].second:=0;
      end;
  for i:=0 to MAXNODE do
    for j:=0 to MAXNODE do
      begin
        cost[i][j]:=MAXCOST;
        if i=j then cost[i][j]:=0;
      end;
  for i:=0 to stategrafh.Count-1 do
  begin
    p:=Pvertex_node(stategrafh.Items[i]).link;
    while p<>nil do
    begin
      j:=p.nextnodenum;
      cost[i][j]:=1;
      p:=p.nextedge;
    end;
  end;
        for i:=0 to stategrafh.Count-1 do
           begin
            dist[i]:=cost[findnumber('start')][i];
            s[i]:=0;
           end;
        s[findnumber('start')]:=1;
        i:=0;
        for k:=0 to stategrafh.Count-1 do  //...........................................
          if findnumber('start')<>k then
          begin
            middle[i].first:= findnumber('start');
            middle[i].second:=k;
            i:=i+1;
          end;
        //v:= findnumber('start');
        //path[tail]:=findnumber('start');
        //tail:=tail+1;
        for i:=0 to stategrafh.Count-1 do
          begin
             mindis:=MAXCOST;
             for j:=0 to stategrafh.Count-1 do  /////选到开始节点最小的边
                begin
                if(dist[j]<mindis )and (s[j]=0)  then
                   begin
                    mindis:=dist[j];
                    u:=j;
                   end;
               end;
            s[u]:=1;
            for k:=0 to (stategrafh.Count-i-1) do   //................................
             if middle[k].second=u then
               begin
                  answer[pointer].first:=middle[k].first;
                  answer[pointer].second:=middle[k].second;
                  pointer:=pointer+1;
                  for l:=k to (stategrafh.Count-i-2) do
                  begin
                    middle[l].first:=middle[l+1].first;
                    middle[l].second:=middle[l+1].second;
                  end;
                  break;
               end;
           //path[tail]:=u;
            //tail:=tail+1;
            for j:=0 to stategrafh.Count-1 do     ///////优化代选边表
                begin
                if(s[j]=0) then
                   begin
                    dis:=dist[u]+cost[u][j];
                    if dist[j]>dis then
                     begin
                       dist[j]:=dis;
                       l:=0;
                       while (middle[l].second<>j) and (l<MAX) do
                           l:=l+1;
                       if middle[l].second=j then
                           middle[l].first:=u;
                     end;
                    //dist[j]=dist[j]<dis ? dist[j]:dis;
                  end;
                end;
     end;
     {while head<>tail do
     begin
       memo1.Lines.Add(Pvertex_node(stategrafh.items[path[head]]).vertexname);
       memo1.Lines.Add('------->');
       head:=head+1;
     end; }
     memo3.Lines.Add('◎◎◎◎◎◎◎◎◎◎最短路径计算◎◎◎◎◎◎◎◎◎◎');
     for i:=0 to stategrafh.Count-1 do
         begin
         if i<>findnumber('start') then
            begin
              showmessage('输出开始节点(start)到节点'+Pvertex_node(stategrafh.Items[i]).vertexname+'的最短路径');
              memo3.Lines.Add('start------->'+Pvertex_node(stategrafh.Items[i]).vertexname+':');
              if dist[i]=MAXCOST then
                 memo3.Lines.Add('no path!')
              else
                 memo3.Lines.Add('   cost= '+inttostr(dist[i]));
            end ;

        end;
        memo3.Lines.Add('');
        memo3.Lines.Add('%%%%%%%迪杰斯特拉算法执行后得到的边有:%%%%%%%');
        for l:=0 to stategrafh.Count-2 do
        memo3.Lines.Add(Pvertex_node(stategrafh.Items[answer[l].first]).vertexname+'--------'+findedge(answer[l].first,answer[l].second)+'-------->'+Pvertex_node(stategrafh.Items[answer[l].second]).vertexname);

end;
end;

procedure TForm1.stateCoverGrafhClick(Sender: TObject);
var
  i,j,k,l:integer;
  p:Pedge_node;
  stack:array[0..MAX] of edge_pair;
  top:integer;
  aim:integer;
  s:array[0..MAXNODE] of integer;
  rrr,event:string;
  covered:array[0..MAXNODE]of boolean;
begin
top:=0;
rrr:='';
event:='';
  for i:=0 to MAXNODE do
   begin
     s[i]:=0;
     covered[i]:=false;
     if i>=stategrafh.Count then covered[i]:=true;
   end;
  if (stategrafh.Count>0) and (judge=true) then
  begin
     form2.Edit1.Text:='start';
     form2.Show;
     for i:=0 to stategrafh.Count-1 do
     begin
       form2.ComboBox1.Items.Add(Pvertex_node(stategrafh.items[i]).vertexname);
     end;
     for i:=0 to stategrafh.Count-1  do   //输出开始节点到目标节点的最短路径
     begin
       if Pvertex_node(stategrafh.Items[i]).vertexname<>'start' then
       begin
         form2.Memo2.Lines.Add('******************************************');
         form2.Memo2.Lines.Add('开始节点start到目标节点'+Pvertex_node(stategrafh.Items[i]).vertexname+'的路径为: ');
         for j:=0 to stategrafh.Count-1   do      //找到到目标节点的最后一条边,
         begin
          if (answer[j].second)=i then
           begin
             stack[top].first:= answer[j].first;
             stack[top].second:= answer[j].second;
             top:=top+1;
             aim:=answer[j].first;
             break;
           end
           else ;
          end;
          while stack[top-1].first<>findnumber('start') do //递归地往前搜索直到到达开始节点
             for j:=0 to stategrafh.Count-1   do
                if answer[j].second = aim then
                begin
                 stack[top].first:= answer[j].first;
                 stack[top].second:= answer[j].second;
                 top:=top+1;
                 aim:= answer[j].first;
                 break;
                end;
          while top>0 do
          begin
            top:=top-1;
            p:=Pvertex_node(stategrafh.Items[stack[top].first]).link;

            while (p<>nil) and (p.nextnodenum<>stack[top].second) do
               p:=p.nextedge;
              if p.nextnodenum = stack[top].second   then
                 event:=p.edgename
              else showmessage('这条边不存在');

            rrr:=Pvertex_node(stategrafh.Items[stack[top].first]).vertexname+'---------->'+Pvertex_node(stategrafh.Items[stack[top].second]).vertexname;
            form2.Memo2.Lines.Add(rrr+'        EVENT:  '+event);
          end;
         //form2.Memo2.Lines.Add(rrr);
         form2.Memo2.Lines.Add('');
       end;
     end;

 ////////////////////////////////////////
  begin
    top:=0;
    rrr:='';
    event:='';
    l:=1;
    i:=form1.findnumber('end');
    if (Pvertex_node(stategrafh.Items[i]).vertexname<>'start') and (i<stategrafh.Count) then
       begin
         form2.Memo3.Lines.Add('******************************************');
         form2.Memo3.Lines.Add('用例-1:');
         for j:=0 to stategrafh.Count-1   do      //找到到目标节点的最后一条边,
         begin
          if (answer[j].second)=i then
           begin
             covered[i]:=true;
             stack[top].first:= answer[j].first;
             stack[top].second:= answer[j].second;
             top:=top+1;
             aim:=answer[j].first;
             break;
           end
           else ;
          end;
          while stack[top-1].first<>form1.findnumber('start') do //递归地往前搜索直到到达开始节点
             for j:=0 to stategrafh.Count-1   do
                if answer[j].second = aim then
                begin
                 covered[aim]:=true;
                 stack[top].first:= answer[j].first;
                 stack[top].second:= answer[j].second;
                 top:=top+1;
                 aim:= answer[j].first;
                 break;
                end;
                covered[form1.findnumber('start')]:=true;
          while top>0 do
          begin
            top:=top-1;
            p:=Pvertex_node(stategrafh.Items[stack[top].first]).link;

            while (p<>nil) and (p.nextnodenum<>stack[top].second) do
               p:=p.nextedge;
              if p.nextnodenum = stack[top].second   then
                 event:=p.edgename
              else showmessage('这条边不存在');

              rrr:=Pvertex_node(stategrafh.Items[stack[top].first]).vertexname+'------>'+Pvertex_node(stategrafh.Items[stack[top].second]).vertexname ;
              form2.Memo3.Lines.Add(rrr+'        EVENT:  '+event+'           ');
             // form2.Memo3.Lines.Add();
          end;
          //memo1.Clear;
         //form2.Memo2.Lines.Add(rrr);

       end;
   for k:=0 to stategrafh.count-1 do
    if covered[k] = false  then
    begin
       l:=l+1;
       top:=0;
       rrr:='';
       event:='';
       i:=k;
       if (Pvertex_node(stategrafh.Items[i]).vertexname<>'start') and (i<stategrafh.Count) then
       begin
         form2.Memo3.Lines.Add('******************************************');
         form2.Memo3.Lines.Add('用例-'+inttostr(l)+':');
         for j:=0 to stategrafh.Count-1   do      //找到到目标节点的最后一条边,
         begin
          if (answer[j].second)=i then
           begin
             covered[i]:=true;
             stack[top].first:= answer[j].first;
             stack[top].second:= answer[j].second;
             top:=top+1;
             aim:=answer[j].first;
             break;
           end
           else ;
          end;
          while stack[top-1].first<>form1.findnumber('start') do //递归地往前搜索直到到达开始节点
             for j:=0 to stategrafh.Count-1   do
                if answer[j].second = aim then
                begin
                 covered[aim]:=true;
                 stack[top].first:= answer[j].first;
                 stack[top].second:= answer[j].second;
                 top:=top+1;
                 aim:= answer[j].first;
                 break;
                end;
          while top>0 do
          begin
            top:=top-1;
            p:=Pvertex_node(stategrafh.Items[stack[top].first]).link;

            while (p<>nil) and (p.nextnodenum<>stack[top].second) do
               p:=p.nextedge;
              if p.nextnodenum = stack[top].second   then
                 event:=p.edgename
              else showmessage('这条边不存在');

              rrr:=Pvertex_node(stategrafh.Items[stack[top].first]).vertexname+'------>'+Pvertex_node(stategrafh.Items[stack[top].second]).vertexname+'        EVENT:  '+event+'           ';
              form2.Memo3.Lines.Add(rrr);
          end;
          //memo1.Clear;
         //form2.Memo2.Lines.Add(rrr);
         //form2.Memo3.Lines.Add(rrr);
       end;
    end;
 end;

///////////////////////////////////////////////////////////////////
   end
   else showmessage('没有选择可供描述的状态图,请选择帮助,查看执行步骤?');
end;
procedure TForm1.N2Click(Sender: TObject);
begin
 Form3.show;
end;

end.

⌨️ 快捷键说明

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