delphi 数组定义

摘要:
在c语言中,a[5]={1,2,3,4,5};如何在delphi中编写此数组的赋值??I一维阵列A:阵列探测器;集合长度(A,5)II:二维数组定义整数二维数组aiMyarray:arrayfarrayintergrar大小设置集合长度III:多维数组的定义当一维数组的元素类型也是一维数组时,就会形成二维数组。由于计算机内存是一维的,所以二维数组的元素应该被存储

在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 数组定义》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Handsontable对单元格的操作Android openGL ES 2.0里Surfaceview背景透明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Delphi Ole操作Word,判断是否有打开的文档,并且给关闭

Delphi Ole操作Word,判断是否有打开的文档,并且给关闭。 Function ChkWordIsOpen(const AFullFileName: string): boolean;var  WordApp: variant;  CurrDoc: variant;begin  Result := False;  WordApp := GetAct...

数据可视化之powerBI技巧(十八)Power BI动态技巧:动态显示列和度量值

今天分享一个可视化小技巧,如何在PowerBI的表格中动态显示需要的列? 就是这样的效果, 也就是根据切片器的筛选,来显示需要的列,做起来很简单,步骤如下: 01 逆透视表 进入Powerquery编辑其中,对该表格逆透视。 选中基础列,也就是固定显示的列,比如[产品名称],然后逆透视其他列, 逆透视后的表格如下, 是不是很乱的感觉? 02 利用矩阵...

Delphi中的Sender:TObject对象解析

procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Procedure是过程,TForm是窗体类,加上数字就是某个窗体,像TForm1就是Form1窗体。 Button1是你的按钮控件的名称,Button1Click就是按钮的单击事件,(Sender:Tobject)就是发送消息到对象...

Delphi的保存文件对话框-TsaveDialog

TsaveDialog继承于TOpenDialog,只介绍以下几个内容: 1、TsaveDialog如何设定为保存的默认路径是当前程序所在的文件夹: 默认目录是当前程序所在目录应设置属性InitialDir: opendialog1.InitialDir := extractfilepath(application.ExeName); savedial...

FireDAC 下的 Sqlite [1]

很长时间没静下心来写博客了, 现在回来, 是 Delphi 不断地进步让我感动、振奋.Delphi XE5 并入了 FireDAC, 第一印象非常好, 恐怕 dbExpress 等等都要靠边站了.让我最高兴地是 FireDAC 对 Sqlite 的支持!优秀的 Sqlite 早就有很多 Delphi 的包装(http://www.sqlite.org/cv...

骨牌覆盖问题 KxM

 前面我们说了一些简单的骨牌覆盖问题,有了上面的经验,我们可以尝试解决K*M的 思路和上一篇文章所提到的3*N的 很类似; 依然是矩阵快速幂。我们需要把一个小的边固定下来作为的已知边,然后进行矩阵快速幂,要进行矩阵快速幂,我们需要知道初始矩阵,与构造出的递推矩阵; 我们如何得到这两个矩阵? 初始矩阵:矩阵宽度为 2^n  次方;第一排只可能出现,0或者横...