delphi语法基础-数组(二维数组)

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2011-03-09 15:56:01
二、二维数组
合并定义:
     var  数组名:array[下标类型1, 下标类型2] of 元素类型;
   下标类型的个数即数组的维数,且说明了每个下标的类型及取值范围。
例如,定义 :var a:array[1..4,1..3]of integer;
     则表示a是二维数组,共有4*3=12个元素,它们是:
  a[1,1]a[1,2]a[1,3]
  a[2,1]a[2,2]a[2,3]
  a[3,1]a[3,2]a[3,3]
  a[4,1]a[4,2]a[4,3]
  因此可以看成一个矩阵,a[4,2]即表示第4行、第2列的元素。
虽然逻辑上可以把二维数组看作是一张表格或一个矩阵,但在计算机内部,二维数组的所有元素对应的存储单元是连续的,与一维数组的存储方式在本质上是相同的。  
对于整个二维数组的元素引用时,大多采用二重循环来实现。如给上例定义的二维数组a进行赋值:
     for i:=1 to 4 do   
         for j:=1 to 3 do  a[i,j]:=i*j;
  同样用二重循环来实现二维数组的输入与输出:
     for i:=1 to 4 do
      for j:=1 to 3 do read(a[i,j]);
     for i:=1 to 4 do
      begin
       for j:=1 to 3 do write(a[i,j]:5);
       writeln;
      end;
例5、已知数组A中,每个元素A(I,J)在存贮时要占3个字节,设I从1变化到8,J从1变化到10,分配内存时是从地址SA开始连续按行存贮分配的。试问:A(5,8)的起始地址为(  )。                          { NOIP2000高中单选13题 }
    A) SA+141    B) SA+180    C) SA+222   D) SA+225
例6、仔细阅读下列程序段:
    var a:array[1..3,1..4] of integer;       { NOIP2000高中单选16题 }  
      b:array[1..4,1..3] of integer;
     x,y:integer;
   begin
   for x:=1 to 3 do
     for y:=1 to 4 do a[x,y]:=x-y;
   for x:=4 downto 1 do
    for y:=1 to 3 do  b[x,y]:=a[y,x];
   writeln(b[3,2]);
   end. 
  上列程序段的正确输出是(   )。 
      A) -1  B) -2  C) -3  D) –4  
  分析: 数组a:                  数组 b:  
         0 –1 –2 –3           0   1   2  
         1         0  -1  -2          -1   0   1  
         2         1   0  -1          -2 –1   0  
                                
-3  -2  -1
例7、输入4名学生数学、物理、英语、化学、pascal五门课的考试成绩,求出每名学生的平均分,打印出表格。
  var a:array[1..4,1..7]of real;  { 下标1学号,下标2某科成绩 }
     i,j:integer;                { 下标2多两列,分别存放总分、平均分 }
begin
   fillchar(a,sizeof(a),0);     { 用函数fillchar将数组a中所有元素置为0 }
   writeln('Input 4 students score');
   for i:=1 to 4 do
      begin
     for j:=1 to 5 do          
   begin
      read(a[i,j]); a[i,6]:=a[i,6]+a[i,j];  {
读每科成绩时同时统计总分 }
     end; 
    a[i,7]:=a[i,6]/5;                        { 求平均分 }
     end;
   writeln( 'No.  Math  Phy  Eng  Che  Pas  Total  Average ');
   for i:=1 to 4 do
    begin
    write(i,' ');
    for j:=1 to 7 do  write(a[i,j]:7:1);
    writeln;
   end;
  end.
例8、奇数魔方阵。输出整数1到n2(n 为齐数),排成的一个n×n方阵,使方阵中的每一行、每一列及对角线上的数之和都相同。
奇数阶魔阵算法:
①     将1填在第一行中间,即 [1,(n+1)/2],然后依次填入2到n2
②     若当前位置为[i,j],下一个填在[i-1,j-1];若左上方无空格,即j-1为0时,则填在[n,j-1];
③     若j-1为0时,则填在[i-1,n];
④     若当前位置为[i,j],而左上方已有数字,则填在正下方,即[i+1,j];
 如3阶方阵,则按上述算法可排成:
          6 1 8  
          7 5 3
          2 9 4
var a : array[1..100,1..100]of integer;
  i,j,k,n,h,l : integer;
 begin
  fillchar(a,sizeof(a),0);
   write('input n:');  readln(n);
  j:=(n+1)/2;  
   i:=1; a[i,j]:=1;   
  for k:=2 to n*n do
   begin
h:=i-1; if h=0 then h:=n;        
l:=j-1; if l=0 then l:=n;
if a[h,l]=0 then begin a[h,l]:=k; i:=h; j:=l end;
            else begin a[i+1,j]:=k; i:=i+1 end;
 end; 
  for i:=1 to n do
   begin  
       for j:=1 to n do write(a[i,j]:5);
      writeln 
   end
end.

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      100%(2)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

广告位置B