我一直在尝试创建一个程序,要求用户输入数组元素,然后使用该数组创建一个新元素,其元素将是输入数组的每个第二个元素。这就是我写的:
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
语句,如果可能的话我不想这样做。
第二,我在为数组长度输入偶数时遇到问题。输出窗口中新数组的最后一个元素非常小,负数,他不应该在那里。我知道这必须对我的计数器“i做一些事情” “进入”未定义的“数组索引。
我还尝试使用以下某些变体替换while
循环:
for i:=0 to n do
c[i]:=a[2*i-1] ;
这是更优雅的方式,但除了期望的结果之外,我仍然得到那些大数字,再次因为数组的交叉限制。我怀疑这必须通过适当的步骤来完成新数组的制作并移动这些元素彼此相邻,没有空白元素。 所以,如果有人能给我一些解决方案,如何将这些循环步骤和限制变为正确的顺序,并制作有效,最短的算法,并且最好不使用while循环,如果可能的话,绝对不要忽略新数组的那些空白元素。
答案 0 :(得分:1)
按一个字符A, C: array of integer
声明变量是一种不好的做法。变量的名称将告诉您它的类型和含义。 (强烈推荐)
阅读匈牙利符号,然后您就会明白为什么TArr
和arrA
而不是Arr
和A
。没有必要,但建议。 (也推荐)
对于第二个arrC
,您可以使用运算符div
使其比第一个数组arrA
小两倍。
您还可以创建一个新变量n div 2
,以便不在整个代码中更改 n div 2 (良好实践):
nDivided := n div 2;
SetLength(arrA,n);
SetLength(arrC, nDivided);
这将使您的程序非常有效:您将节省n - (n div 2) * sizeof(integer)
个字节。
以下是两种情况(偶数和奇数N)。没有“空白元素”且没有“新数组末尾的非常小的负数(-32768)”。
N is 6 N is 5
Elements of array A: Elements of array A:
arrA[1]=1 arrA[1]=1
arrA[2]=2 arrA[2]=2
arrA[3]=3 arrA[3]=3
arrA[4]=4 arrA[4]=4
arrA[5]=5 arrA[5]=5
arrA[6]=6
Elements of array C are: Elements of array C are:
arrC[1]=2 arrC[1]=2
arrC[2]=4 arrC[2]=4
arrC[3]=6
无论如何,这里是代码(稍有改动)。也不是很好(高效),但它完全符合你的需要。
program WorkingWithArrays;
uses crt;
type
TArr = Array of Integer;
var
i, n: integer;
arrA, arrC: TArr;
begin
writeln('Enter the length of array:');
readln(n);
SetLength(arrA,n);
SetLength(arrC, n div 2);
writeln('Elements of array A:');
for i:=1 to (n) do begin
arrA[i]:=i;
writeln('@> arrA[',i,']=', arrA[i]);
end;
writeln('Elements of array C are:');
i:=1;
while (i <= n div 2) do
begin
arrC[i]:=arrA[i+i];
i:=i+1;
end;
for i:=0 to (n div 2) do begin
if arrC[i]=0 then continue else begin
writeln('@> arrC[',i,']=', arrC[i]);
end;
end;
readln;
end.
// compiled here: http://www.compileonline.com/compile_pascal_online.php