【问题标题】:Making new array whose elements are every second element of another array.(Pascal)制作新数组,其元素是另一个数组的每隔一个元素。(Pascal)
【发布时间】: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 &lt; n do,并在循环内将i 增加所需的数量。它使代码更清晰,IMO,并防止超出数组的末尾。您还应该至少在开发期间启用范围检查 ({$R+}) 和溢出检查 ({$Q+}),以发现任何可能的问题。
  • 是的,while 循环更清晰,我在这种情况下使用了它们。老实说,我不知道 Pascal 可以在forloop 中执行自定义步骤,但非常感谢你展示我 step.我知道 dyn.arrays 以索引 0 开头,但我想知道如果我最后说 for 循环来写我从 -1x 的新数组的元素呢?数组会开始吗?用:0 0 然后从程序开始输入数组的整数值?这是否意味着 array[-1],array[-2] 也是空元素,尽管它们没有被索引(我认为)或分配任何值?

标签: arrays pascal


【解决方案1】:

用一个字符A, C: array of integer 声明变量是一种不好的做法。变量的名称会告诉你它的类型和含义。 (强烈推荐)

阅读匈牙利符号,你就会明白为什么TArrarrA 而不是ArrA。没必要,但推荐。 (也推荐)

对于第二个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

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2015-08-15
    • 2022-07-06
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多