Pascal 交替打印数字

Pascal print numbers alternately

我的任务是交替打印输入中的每个数字,首先是索引为偶数的数字,然后是索引为奇数的数字。我已经解决了,但是只有一行数字,但是我要读n行数字。

预期输入:

2

3 5 7 2

4 2 1 4 3

预期输出:

7 5 2

1 3 2 4

其中2是行数,3和4是数字的数字,5,7,2和2,1,4,3是这些数字。

Program numbers;
Uses crt;

var k,n,x,i,j: integer;
var tab : Array[1..1000] of integer;
var tab1 : Array[1..1000] of integer;
var tab2 : Array[1..1000] of integer;

begin
    clrscr;
    readln(k);
    
    for i:=1 to k do
    begin
    read(n);
        for j:=1 to n do
        begin
            read(tab[j]);
            if(j mod 2 = 0) then
            tab1[j]:=tab[j]
            else 
            begin
            tab2[j]:=tab[j];
            end;
        end;
    end;
    
    for j:=1 to n do
    if tab1[j]<>0 then write(tab1[j], ' ');
    for j:=1 to n do
    if tab2[j]<>0 then write(tab2[j], ' ');
         
end.

让我们清理格式,并使用记录来跟踪输入的每一“行”。

program numbers;
uses
  crt;

type
  TLine = record
    count : integer;
    numbers : array[1..1000] of integer
  end;

var
  numLines, i, j : integer;
  lines : Array[1..1000] of TLine;

begin
  clrscr;
  readln(numLines);

  for i := 1 to numLines do
  begin
    read(lines[i].count);

    for j := 1 to lines[i].count do
      read(lines[i].numbers[j])
  end

end.

我们可以读入每一行。现在,我们如何一起打印奇数和偶数索引?好吧,我们 可以 对每个索引进行数学计算, 我们可以只增加 2 而不是 1 使用while 循环。

program numbers;
uses
  crt;

type
  TLine = record
    count : integer;
    numbers : array[1..1000] of integer
  end;

var
  numLines, i, j : integer;
  lines : Array[1..1000] of TLine;

begin
  clrscr;
  readln(numLines);

  // Read in lines.

  for i := 1 to numLines do
  begin
    read(lines[i].count);

    for j := 1 to lines[i].count do
      read(lines[i].numbers[j])
  end;

  // Print out lines.

  for i := 1 to numLines do
  begin
    j := 1;

    while j <= lines[i].count do
    begin
      write(lines[i].numbers[j], ' ');
      j := j + 2
    end;

    j := 2;

    while j <= lines[i].count do
    begin
      write(lines[i].numbers[j], ' ');
      j := j + 2
    end;

    writeln
  end
end.

现在如果我们运行这个:

2
3 4 5 6
4 6 2 4 1
4 6 5
6 4 2 1

我们可以注意到的一件事是,除了起始索引之外,以下循环对于奇数索引和偶数索引都是相同的。

    while j <= lines[i].count do
    begin
      write(lines[i].numbers[j], ' ');
      j := j + 2
    end;

这是使用程序的完美场所。我们称它为 PrintEveryOther 并让它从一个索引开始并打印一行。

program numbers;
uses
  crt;

type
  TLine = record
    count : integer;
    numbers : array[1..1000] of integer
  end;

var
  numLines, i, j : integer;
  lines : Array[1..1000] of TLine;
  
  procedure PrintEveryOther(start : integer; line :TLine);
  var
    i : integer;

  begin
    i := start;

    while i <= line.count do
    begin
      write(line.numbers[i], ' ');
      i := i + 2
    end

  end;
  
begin
  clrscr;
  readln(numLines);

  for i := 1 to numLines do
  begin
    read(lines[i].count);

    for j := 1 to lines[i].count do
      read(lines[i].numbers[j])
  end;

  for i := 1 to numLines do
  begin
    PrintEveryOther(1, lines[i]);
    PrintEveryOther(2, lines[i]);
    writeln
  end
  
end.