0

我有一个关于图形中接收器检测的 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   

对于V1,V2V3顶点。(如果我们在两个节点之间有连接,则为 1 个代码,否则为 0 个代码)。

我正在尝试使用此输入跟踪代码,但我不能。原因是我3岁的时候不取结果。让我们看看我到目前为止做了什么:(KATAVOTHRA是sink的名称)。

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 不小于 3A[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 < 3 是假的,所以整个循环在那里终止?我无法理解(尽管我在 Pascal lagnuage 方面没有太多经验)。

这有什么问题?

4

1 回答 1

1

我现在是 3.... 但这次 3 < 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

现在很容易看到:

  • <用于基于零的数组
  • <=用于基于一个的数组
于 2014-11-22T01:06:37.493 回答