使用Pascal语言的接收检测算法

时间:2013-03-27 17:40:55

标签: pascal

我在Pascal中有一个关于接收器检测的实现。这是代码:

FUNCTION KATAVOTHRA (A:MATRIX; N:INTEGER): INTEGER;
VAR 
  I,J,K,S:INTEGER;
BEGIN
  KATAVOTHRA:=0;  
  I:=1;
  WHILE (KATAVOTHRA=0 AND I<N) DO   {1}
  BEGIN
    J:=1;
    WHILE (A[I,J]=0 AND J<N) DO J:=J+1;  {2}
    IF (J=N) THEN BEGIN
      S:=0;
      FOR K:=1 TO N DO S:=S+A[K,I];
      IF (S=N-1) THEN 
        KATAVOTHRA:=1;
    END;
    I:=I+1;
  END;    
END;

假设我们有以下邻接矩阵:

 0 0 1
 1 0 1
 0 0 0   

代表V1V2V3个顶点。 (如果我们在两个节点之间有连接,则为1个代码,否则为零代码。)

我试图用这个输入来跟踪代码,但我不能。原因是当我3岁时我没有得到结果。让我们看看到目前为止我做了什么:(KATAVOTHRA是接收器的名称)。

BEGIN with I:=1; and J:=1(在第一个while循环中)

首先我们检查A[1,1]如果为零,那么(当然是1 <3,以便继续)所以J= J+1 => J=2

A[1,2]也为零,所以再次递增J,现在J为3. 3不小于3且A[1,3]不为0.所以我们要转到IF语句IF( J = N) => IF( 3 = 3 ) then S=0 (sum) 所以我们要进入FOR循环并总结A[1,1] + A[2,1] + A[3,1]

IF( S = N-1) THEN我们找到了一个接收器。但是这里S=1没有2.我们走出FOR循环,我现在将再次成为2 WHILE(KATAVOTHRA=0 AND 2<3) J是1我们现在检查A[2,1]但不是零而2不是3所以我们出去......我现在将成为3 ......但是这次3&lt; 3是假的,所以整个循环终止于那里?我无法理解(尽管我对Pascal lagnuage没有多少经验。)

这有什么问题?

1 个答案:

答案 0 :(得分:1)

  

我现在将是3 ....但这次3&lt; 3是假的,所以整个循环终止于那里?

正如您已经注意到的那样,您的循环过早结束了一个数字。 为避免这种情况,您必须测试I <= N

这是一个显示两种变体的简短程序:

PROGRAM LoopTest;

VAR
   i : Integer;

BEGIN
   WriteLn("Example with <");
   i := 0;
   WHILE (i < 3) DO
   BEGIN
      WriteLn(" Loopvar: ", i);
      i := i + 1;
   END;
   WriteLn;

   WriteLn("Example with <=");
   i := 1;
   WHILE (i <= 3) DO
   BEGIN
      WriteLn(" Loopvar: ", i);
      i := i + 1;
   END;
END.

输出:

Example with <
 Loopvar: 0
 Loopvar: 1
 Loopvar: 2

Example with <=
 Loopvar: 1
 Loopvar: 2
 Loopvar: 3

现在很容易看到:

  • <用于基于零的数组
  • <=用于一个基础数组