【发布时间】:2014-01-31 15:34:14
【问题描述】:
我一直在尝试编写一个程序,要求用户输入数组的元素,然后使用该数组创建一个新数组,其元素将是输入数组的每个第二个元素。这就是我写的:
program Keanu;
uses crt;
type Arr=array of integer;
var n,i:integer;
A,C:Arr;
begin
writeln('--Enter desired length of array--');
readln(n);
setlength(A,n);
setlength(C,n);
writeln('Elements of array A:');
for i:=1 to n do
readln(A[i]);
writeln('Elements of array C are:');
i:=1;
while (i<=n) do
begin
c[i]:=a[i];
i:=i+2;
end;
write('C = {');
for i:=1 to n do
begin
if c[i]=0 then continue else
begin
write(c[i],' ');
end;
end;
write('}');
readln;
end.
但正如您所注意到的,这远不是让这个程序完成这项工作的有效方法。
首先,因为我的新数组将包含空白/空元素(零),我只是用continue 语句忽略了它们,如果可能的话我不想这样做。
其次,我在输入数组长度的偶数时遇到问题。输出窗口中新数组的最后一个元素非常小,负数,他根本不应该在那里。我知道这与我的计数器“我" 进入数组的“未定义”索引。
我还尝试用以下变体替换 while 循环:
for i:=0 to n do
c[i]:=a[2*i-1] ;
哪种方式更优雅,但除了想要的结果外,我仍然得到那些大数字,这也是因为数组的限制。我怀疑这必须通过正确的步骤来完成新数组的制作和移动这些元素彼此相邻,没有空白元素。 所以,如果有人能给我一些解决方案,说明如何将这些循环步骤和限制按正确的顺序排列,并制定高效、最短的算法,如果可能的话最好不要使用 while 循环,并且绝对不要忽略新数组的那些空白元素。
【问题讨论】:
-
如果新数组应该包含原始数组的所有其他元素,那么新数组的大小将是旧数组的一半(我们假设原始数组的元素个数为偶数)现在数组)。因此,您需要做的是将新数组分配为
n div 2元素长,然后使用两个索引变量,例如i用于读取,j用于写入,每个循环步骤将i增加两个,j增加一个。 -
谢谢先生的提示。这很明显,但我需要一点“推动”来思考。我也让它与奇数一起使用
x:=Round(n/2+0.1);,其中x是新数组的长度。 -
动态数组基于 0=,因此您从两个数组中的 array[0] 处的一个空元素开始。您还可以在
for循环中使用step子句,如for i := 0 to n - 1 step 2 do,它将循环使用0、2、4 等。我个人会改用while i < n do,并在循环内将i增加所需的数量。它使代码更清晰,IMO,并防止超出数组的末尾。您还应该至少在开发期间启用范围检查 ({$R+}) 和溢出检查 ({$Q+}),以发现任何可能的问题。 -
是的,
while循环更清晰,我在这种情况下使用了它们。老实说,我不知道 Pascal 可以在forloop 中执行自定义步骤,但非常感谢你展示我step.我知道 dyn.arrays 以索引 0 开头,但我想知道如果我最后说for循环来写我从-1到x的新数组的元素呢?数组会开始吗?用:0 0 然后从程序开始输入数组的整数值?这是否意味着 array[-1],array[-2] 也是空元素,尽管它们没有被索引(我认为)或分配任何值?