Arrays Lazarus中两种阵列的比较

Arrays Lazarus中两种阵列的比较,arrays,comparison,pascal,lazarus,Arrays,Comparison,Pascal,Lazarus,我对帕斯卡有意见,尤其是拉扎勒斯 首先,我创建了两个随机整数数组: procedure TForm1.b_arraycreate1Click(Sender: TObject); begin randomize; for i := 1 to 5 do arr1[i] := random(10); end; 及 我知道,我也可以把它放在一个程序中,但现在不重要了 我想比较一下这两个。我编写了以下代码: procedure TForm1.b_comparisonCli

我对帕斯卡有意见,尤其是拉扎勒斯

首先,我创建了两个随机整数数组:

    procedure TForm1.b_arraycreate1Click(Sender: TObject);
begin
   randomize;
   for i := 1 to 5 do
      arr1[i] := random(10);
end;

我知道,我也可以把它放在一个程序中,但现在不重要了

我想比较一下这两个。我编写了以下代码:

procedure TForm1.b_comparisonClick(Sender: TObject);
var v:boolean;
begin

for i := 1 to 5 do begin
       for j := 1 to 5 do begin
           if   arr1[i] = arr2[j]
                then
                    begin
                         v:=true;
                    end
                else
                    begin
                         v:=false;
                    end;
       end;
end;

if v = true
     then
         begin
              ShowMessage('Yes, there is a similarity! You can find number ' +IntToStr(arr1[i])+ ' in array 1, position ' +IntToStr(i)+ ' and also in array 2, position ' +IntToStr(j)+ '.');
         end
     else
     begin
          ShowMessage('No similarities... Generate new ones!');
    end
end;  
用我自己的话来说:我想按下一个按钮,然后如果数组1和数组2中存在一个数字(例如7),就会出现一个信息窗口。如果是,还应写下该编号的位置(索引)

不幸的是,这个程序不起作用,我不知道为什么。它总是显示“没有相似性”(并且不用担心数组的创建。我还有一个标签,每次都可以在这里测试数组的内容)


我的代码中有(愚蠢的)错误吗?

正如MartynA在评论中已经解释的那样,您的算法是错误的。你的话是:

如果数组1和数组2中存在一个数字

若要查看是否是这样,必须扫描所有数组1,并针对每个数字,查看数组2中是否存在该数字

是的,你需要两个循环,一个嵌套在另一个中。一旦你找到一封信,你就必须停下来。或者,如果您想要更多结果(找到多个重复项),请显示消息,而不是停止,然后继续。第三种可能性(更复杂):找到后,存储两个索引(不覆盖旧结果…),然后继续。我将仅显示第一个选项:

procedure TForm1.b_comparisonClick(Sender: TObject);
var
  i,j: integer;
  v:   boolean;

begin
  v := false;
  for i := 1 to 5 do begin
    for j := 1 to 5 do begin
      if arr1[i] = arr2[j] then begin
        v := true;
        break
      end
    end  // inner, j
  end;  // outer, i

  if v = true
    then ShowMessage(.....)
    else ShowMessage('No similarities...');
end;  // proc comparison
我试着尊重你的代码,有一些可能的“捷径”;例如,如果
v
是一个布尔变量,则最好编写
if v then
而不是
if v=true then
,以及其他一些变量,如

v := arr1[i]=arr[j];
……或者。。。外部循环不需要开始+结束

*******当心(请参阅下面关于
中断的评论)
停止/退出两个嵌套循环并不是那么简单。。。也许是一个
goto
。。。上面的代码可以工作,但是
中断
几乎不起作用

*******第二次更新,如下面的评论所述。它不起作用,因为如果中断不同时退出两个循环,则外部索引将被修改。使用两次中断的正确循环如下所示:

  for i := 1 to 5 do begin
    for j := 1 to 5 do begin
      if arr1[i] = arr2[j] then begin
        v := true;
        break
      end
    end;  // inner, j
    if v then break
  end;  // outer, i
对不起,我犯了错误…:-)


我更喜欢GOTO同时退出两个循环:它更快,单指令,更清晰(“GOTO-found”而不是一般的中断)。但是GOTOs不是很受欢迎。。。所以我一直很害怕

好吧,除此之外,你的比较算法是完全错误的。
v
的值始终是最终比较的结果(即当
i
j
都等于5时。一旦发现比较结果为假,您应该停止比较,例如,通过中断两个
循环来进行比较。FWIW,
if-then begin v:=true end else begin v:=false end;
可以缩短为
v:=;
如果v=true,则
ifv然后
中断
在内部循环中也会中断外部循环吗?如果不会呢?@TomBrunberg ehm…你是对的,我想得不够。在这种情况下,它仍然有效,但“中断”没有什么意义。抱歉,我会更新答案。不,它不会…因为索引可能对o不正确外部循环(它将始终是最高的索引)。如果v=true,则添加一个
,然后在内部循环后中断
(并恢复外部循环
开始
结束
)@TomBrunberg再次回答是的。是的,我更新了我的答案。@Tom:结构化编程从来都不是为了跳转。但是为了避免跳转,有时你必须这样做。所以,也许有时候,Dijkstra是错的。请注意,Dijkstra在写关于跳转的文章时,并不是完全认真的(他后来这么说的)。
  for i := 1 to 5 do begin
    for j := 1 to 5 do begin
      if arr1[i] = arr2[j] then begin
        v := true;
        break
      end
    end;  // inner, j
    if v then break
  end;  // outer, i