我对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)的信息。 。如果是,则还应写出该数字的位置(索引)。
不幸的是,该程序无法运行,我也不知道为什么。它总是显示“无相似性”(并且不必担心数组的创建。我还有一个标签,可以每次测试数组的内容)。
我的代码中是否有(愚蠢的)错误?
答案 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并不是很受欢迎...所以我一直很害怕!