您的位置:首页 > 编程语言 > Delphi

delphi数组

2015-10-19 13:30 543 查看
在c语言中

有:a[5]={1,2,3,4,5} ;

那么在 delphi中,这个数组的赋值该怎么写?? 

问题补充:下面有人说的对,我就是想在声明数组的时候赋初值,至于初值的内容你们不需要知道,我想知道的只是申明的时候赋值的格式,而不是通过一个过程去实现

var

  a:=array[1..5] of integer=(1,2,3,4,5)

只有全局变量才能赋初始值,而且5个值都要赋满

s:array[1..264]   of   integer;   

  s:=((1),(2),(2),(1),(1),(2),(2),(1),(2),(1),(1),(1),(1),(2),(2),(1),(1),(2),(1),(1),(2),(2),(1),(1),(2),(1),(1),(2),(2),(2),(1),(2),(1),(2),(1),(2),(2),(2),(2),(1),(2),(2),(1),(2),(1),(1),(2),(1),(2),(1),(1),(2),(1),(1),(1));   

    

  s:=(122112221211111111111111222221212121212121212);   

    

  都显示错误哦;C语言可以的哦

 

静态数组的定义方法

//1. 标准方法:

var

  MyArr: array[0..10] of Integer;  //定义静态数组

--------------------------------------------------------------------------------

//2. 可以使用非0下标:

var

  MyArr: array[9..10] of Integer;  //不能提倡,这样不容易与系统函数沟通

--------------------------------------------------------------------------------

//3. 根据预定义类型来声明数组:

type

  TMyArr = array[0..10] of Integer;  //先定义一个数组类型

var

  MyArr: TMyArr;  //再定义静态数组

--------------------------------------------------------------------------------

//4. 在非过程区可以直接赋值:

var

  MyArr: array[0..2] of Integer = (11,22,33);

--------------------------------------------------------------------------------

//5. 多维数组:

var

  MyArr: array[0..2, 0..2] of Integer;

begin

  //使用

  MyArr[1,2] := 100;

end;

--------------------------------------------------------------------------------

//6. 根据子界定义数组:

type

  TRange = 0..10;

var

  MyArr: array[TRange] of Integer;

--------------------------------------------------------------------------------

//7. 根据枚举定义数组:

type

  TEnums = (Enum1,Enum2,Enum3);

var

  MyArr: array[TEnums] of string;

begin

  MyArr[Enum1] := '万一';

  ShowMessage(MyArr[Enum1]);  //万一

end;

--------------------------------------------------------------------------------

//8. 根据其他类型定义数组:

var

  MyArr: array[Byte] of Char;

begin

  MyArr[255] := #65;

  ShowMessage(MyArr[255]);  //A

end;

//应尽量不使用内建类型,可以新建类型:

type

  TNewByte = Byte;

var

  MyArr: array[TNewByte] of Char;

begin

  MyArr[255] := #65;

  ShowMessage(MyArr[255]);  //A

end;

//也可以使用类型别名:

type

  TChar = type Char;

var

  MyArr: array[TChar] of Byte;

begin

  MyArr['C'] := 255;

  ShowMessage(IntToStr(MyArr['C']));  //255

end;

//同时定义类型:

type

  MyRec = record

    s: string;

    r: Real;

    b: Byte;

  end;

var

  Arr1: array[0..100] of MyRec;

  Arr2: array[0..100] of record s: string; r: Real; b: Byte; end;  //可以直接这样定义

  Arr3: packed array[0..100] of MyRec;  //压缩数组定义, 好像没有区别?

 

一. 一维数组

    A:Array of integer ;

    setlength(A,5)

二: 二维数组

   定义整型二维数组 

aiMyarray : array of array of integer 

大小设置 

setlength(aiMyarray,5,5)

三、多维数组的定义

当一维数组元素的类型也是一维数组时,便构成了二维数组。二维数组定义的一般格式:

array[下标类型1] of array[下标类型2] of 元素类型;

但我们一般这样定义二维数组:

array[下标类型1,下标类型2] of 元素类型;

说明:其中两个下标类型与一维数组定义一样,可以看成“下界1..上界1”和“下界2..上界2”,

给出二维数组中每个元素( 双下标变量)可以使用下标值的范围。of后面的元素类型就是基类型。

一般地,n维数组的格式为:

array[下标类型1,下标类型2,…,下标类型n] of 元素类型;

其中,下标类型的个数即数组的维数,且说明了每个下标的类型及取值范围。

**多维数组元素的引用

多维数组的数组元素引用与一维数组元素引用类似,区别在于多维数组元素的引用必须给出多个下标。

引用的格式为:

<数组名>[下标1,下标2,…,下标n]

说明:显然,每个下标表达式的类型应与对应的下标类型一致,且取值不超出下标类型所指定的范围。

例如,设有说明:

 引用内容type matrix=array[1..5,1..4]of integer;

var a:matrix;

则表示a是二维数组,共有5*4=20个元素,它们是:

 引用内容

a[1,1]a[1,2]a[1,3]a[1,4]

a[2,1]a[2,2]a[2,3]a[2,4]

a[3,1]a[3,2]a[3,3]a[3,4]

a[4,1]a[4,2]a[4,3]a[4,4]

a[5,1]a[5,2]a[5,3]a[5,4]

因此可以看成一个矩阵,a[4,2]即表示第4 行、第2 列的元素。由于计算机的存储器是一维的,

要把二维数组的元素存放到存储器中,pascal是按行(第一个下标)的次序存放,即按a[1,1]a[1,

2]a[1,3]a[1,4]a[2,1]…,a[5,4]的次序存放于存储器中某一组连续的存储单元之内。

对于整个二维数组的元素引用时,大多采用二重循环来实现。如:给如上说明的二维数组a 进行赋

值:

 引用内容a[i,j]=i*j。

for i:=1 to 5 do

   for j:=1 to 4 do

     a[i,j]:=i*j;

对二维数组的输入与输出也同样可用二重循环来实现:

 引用内容for i:=1 to 5 do

begin

   for j:=1 to 4 do read(a[i,j]);

end;

   for i:=1 to 5 do

begin

   for j:=1 to 4 do write(a[i,j]:5);

end;

eg、多维数组的应用示例

例7、设有一程序:

 引用内容program ex5_3;

const 

   n=3;

type 

   matrix=array[1..n,1..n]of integer;

var 

   a:matrix;

   i,j:1..n;

begin

   for i:=1 to n do

   begin

     for j:=1 to n do

         read(a[i,j]);

     readln;

   end;

   for i:=1 to n do

   begin

     for j:=1 to n do

         write(a[j,i]:5);

     writeln;

   end;

end.

且运行程序时的输入为:

 引用内容2□1□3←┘

3□3□1←┘

1□2□1←┘

则程序的输出应是:

 引用内容2□3□1

       1□3□2

       3□1□1

例8、输入4名学生数学、物理、英语、化学、pascal五门课的考试成绩,求出每名学生的平均分,

打印出表格。

分析:用二维数组a 存放所给数据,第一下标表示学生的学号, 第二个下标表示该学生某科成绩,如

a[i,1]、a[i,2]、a[i,3]、a[i,4]、a[i,5]分别存放第i 号学生数学、物理、英语、化学、pascal 五门

课的考试成绩,由于要求每个学生的总分和平均分, 所以第二下标可多开两列,分别存放每个学生5门成

绩和总分、平均分。源程序如下:

 引用内容program ex5_4;

var 

   a:array[1..4,1..7]of real; i,j:integer;

begin

   fillchar(a,sizeof(a),0);       {函数fillchar用以将a中所有元素置为0}

   writeln(’Enter 4 students score’);

   for i:=1 to 4 do

   begin

     for j:=1 to 5 do {读入每个人5科成绩}

     begin

         read(a[i,j]); {读每科成绩时同时统计总分}

         a[i,6]:=a[i,6]+a[i,j];

     end;

     readln;

     a[i,7]:=a[i,6]/5;{求平均分}

   end;

   writeln( ’No. Mat. Phy. Eng. Che. Pas. Tot. Ave.’); {输出成绩表}

   for i:=1 to 4 do

   begin

     write(i:2,’ ’);

     for j:=1 to 7 do

         write(a[i,j]:9:2);

     writeln; {换行}

   end;

end.

例9、输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构成回文。

分析:所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA 等。先读入要

判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,

就可以判断出是否为回文。

源程序如下:

 引用内容program ex5_5;

var

   letter : array[1..100]of char;

   i,j : 0..100;

   ch : char;

begin

   {读入一个字符串以’.’号结束}

   write(’Input a string:’);

   i:=0;read(ch);

   while ch<>’.’ do

   begin

   i:=i+1;letter[i]:=ch;

   read(ch)

   end;

   {判断它是否是回文}

   j:=1;

   while (j<i)and(letter[j]=letter[i])do

   begin

     i:=i-1;j:=j+1;

   end;

   if j>=i then writeln(’Yes.’)

   else writeln(’No.’);

end.

例10、奇数阶魔阵

魔阵是用自然数1,2,3…,n2填n 阶方阵的各个元素位置,使方阵的每行的元素之和、每列元素之

和及主对角线元素之和均相等。奇数阶魔阵的一个算法是将自然数数列从方阵的中间一行最后一个位置排

起,每次总是向右下角排(即Aij的下一个是Ai+1,j+1)。但若遇以下四种情形,则应修正排数法。

(1)列排完(j=n+1时),则转排第一列; (2)行排完(即i=n+1时),则转排第一行;

(3)对An,n的下一个总是An,n-1; (4)若Aij已排进一个自然数,则排Ai-1,j-2。

例如3阶方阵,则按上述算法可排成:

4 3 8

9 5 1

2 7 6

有了以上的算法,解题主要思路可用伪代码描述如下:

1     i?n div 2+1,y?n /*排数的初始位置*/

2   a[i,j]?1;

3   for k:=2 to n*n do

4   计算下一个排数位置!(i,j);

5   if a[i,j]<>0 then

6   i?i-1;

7   j?j-2;

6   a[i,j]?k;

7   endfor

对于计算下一个排数位置,按上述的四种情形进行,但我们应先处理第三处情况。算法描述如下:

1   if (i=n)and(j=n) then

2   j?j-1; /*下一个位置为(n,n-1)*/;

3   else

4   i?i mod n +1;

5   j?j mod n +1;

6   endif;

源程序如下:

 引用内容program ex5_7;

var 

   a :array[1..99,1..99]of integer;

   i,j,k,n :integer;

begin

   fillchar(a,sizeof(a),0);

   write(‘n=’);readln(n);

   i:=n div 2+1;j:=n;

   a[i,j]:=1;

   for k:=2 to n*n do

   begin

     if (i=n)and(j=n) then

         j:=j-1

     else

     begin

         i:=i mod n +1;

         j:=j mod n +1;

     end;

     if a[i,j]<>0 then

     begin

         i:=i-1;

         j:=j-2;

     end;

     a[i,j]:=k;

   end;

   for i:=1 to n do

   begin

     for j:=1 to n do

         write(a[i,j]:5);

     writeln;

   end;

end.

 

 

二、二维数组 

合并定义: 

     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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delphi 数组