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