拉撒路两个阵列的比较

时间:2019-03-21 20:50:43

标签: arrays comparison pascal lazarus

我对Pascal有问题,尤其是拉撒路。

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

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

procedure TForm1.b_arraycreate2Click(Sender: TObject);
begin
   randomize;
   for j := 1 to 5 do
       arr2[j] := 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 数组中是否存在一个数字(例如7)的信息。 。如果是,则还应写出该数字的位置(索引)。

不幸的是,该程序无法运行,我也不知道为什么。它总是显示“无相似性”(并且不必担心数组的创建。我还有一个标签,可以每次测试数组的内容)。

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

1 个答案:

答案 0 :(得分:0)

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

  

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

要查看是否是如此,必须扫描所有array1,并针对每个数字查看它是否存在于array2中。

是的,您需要两个循环,一个循环嵌套在另一个循环中。一旦找到对应关系,就必须停止。或者,如果您想要更多结果(查找多个重复项),请显示一条消息而不是停止-然后继续。第三种可能性(更复杂):找到后,存储几个索引(不覆盖旧结果...)并继续。我只会显示第一个选项:

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];

...或者...外循环不需要begin + end。

*******注意(请参阅下面有关break的评论) 要从两个嵌套循环中停止/退出并不是那么简单...也许上面的代码有效goto,但是break却没什么用。

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

  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”而不是一般的中断)。但是GOTO并不是很受欢迎...所以我一直很害怕!