最新delphi 数组定义汇总Word文档下载推荐.docx
《最新delphi 数组定义汇总Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新delphi 数组定义汇总Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
=100;
end;
//6.根据子界定义数组:
TRange=0..10;
array[TRange]ofInteger;
//7.根据枚举定义数组:
TEnums=(Enum1,Enum2,Enum3);
array[TEnums]ofstring;
MyArr[Enum1]:
='
万一'
;
ShowMessage(MyArr[Enum1]);
//万一
//8.根据其他类型定义数组:
array[Byte]ofChar;
MyArr[255]:
=#65;
ShowMessage(MyArr[255]);
//A
//应尽量不使用内建类型,可以新建类型:
TNewByte=Byte;
array[TNewByte]ofChar;
//也可以使用类型别名:
TChar=typeChar;
array[TChar]ofByte;
MyArr['
C'
]:
=255;
ShowMessage(IntToStr(MyArr['
]));
//255
//同时定义类型:
MyRec=record
string;
r:
Real;
b:
Byte;
end;
Arr1:
array[0..100]ofMyRec;
Arr2:
array[0..100]ofrecords:
//可以直接这样定义
Arr3:
packedarray[0..100]ofMyRec;
//压缩数组定义,好像没有区别?
一.一维数组
A:
Arrayofinteger;
setlength(A,5)
二:
二维数组
定义整型二维数组
aiMyarray:
arrayofarrayofinteger
大小设置
setlength(aiMyarray,5,5)
三、多维数组的定义
当一维数组元素的类型也是一维数组时,便构成了二维数组。
二维数组定义的一般格式:
array[下标类型1]ofarray[下标类型2]of元素类型;
但我们一般这样定义二维数组:
array[下标类型1,下标类型2]of元素类型;
说明:
其中两个下标类型与一维数组定义一样,可以看成“下界1..上界1”和“下界2..上界2”,
给出二维数组中每个元素(双下标变量)可以使用下标值的范围。
of后面的元素类型就是基类型。
一般地,n维数组的格式为:
array[下标类型1,下标类型2,…,下标类型n]of元素类型;
其中,下标类型的个数即数组的维数,且说明了每个下标的类型及取值范围。
**多维数组元素的引用
多维数组的数组元素引用与一维数组元素引用类似,区别在于多维数组元素的引用必须给出多个下标。
引用的格式为:
<
数组名>
[下标1,下标2,…,下标n]
显然,每个下标表达式的类型应与对应的下标类型一致,且取值不超出下标类型所指定的范围。
例如,设有说明:
引用内容typematrix=array[1..5,1..4]ofinteger;
vara:
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。
fori:
=1to5do
forj:
=1to4do
a[i,j]:
=i*j;
对二维数组的输入与输出也同样可用二重循环来实现:
引用内容fori:
=1to4doread(a[i,j]);
fori:
=1to4dowrite(a[i,j]:
5);
eg、多维数组的应用示例
例7、设有一程序:
引用内容programex5_3;
const
n=3;
type
matrix=array[1..n,1..n]ofinteger;
var
i,j:
1..n;
=1tondo
begin
read(a[i,j]);
readln;
write(a[j,i]:
writeln;
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门成
绩和总分、平均分。
源程序如下:
引用内容programex5_4;
array[1..4,1..7]ofreal;
integer;
fillchar(a,sizeof(a),0);
{函数fillchar用以将a中所有元素置为0}
writeln(’Enter4studentsscore’);
=1to5do{读入每个人5科成绩}
{读每科成绩时同时统计总分}
a[i,6]:
=a[i,6]+a[i,j];
a[i,7]:
=a[i,6]/5;
{求平均分}
writeln(’No.Mat.Phy.Eng.Che.Pas.Tot.Ave.’);
{输出成绩表}
write(i:
2,’’);
=1to7do
write(a[i,j]:
9:
2);
{换行}
例9、输入一串字符,字符个数不超过100,且以“.”结束。
判断它们是否构成回文。
所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。
先读入要
判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,
就可以判断出是否为回文。
引用内容programex5_5;
letter:
array[1..100]ofchar;
i,j:
0..100;
ch:
char;
{读入一个字符串以’.’号结束}
write(’Inputastring:
’);
i:
=0;
read(ch);
whilech<
>
’.’do
=i+1;
letter[i]:
=ch;
read(ch)
{判断它是否是回文}
j:
=1;
while(j<
i)and(letter[j]=letter[i])do
=i-1;
j:
=j+1;
ifj>
=ithenwriteln(’Yes.’)
elsewriteln(’No.’);
例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阶方阵,则按上述算法可排成:
438
951
276
有了以上的算法,解题主要思路可用伪代码描述如下:
1i?
ndiv2+1,y?
n/*排数的初始位置*/
2a[i,j]?
1;
3fork:
=2ton*ndo
4计算下一个排数位置!
(i,j);
5ifa[i,j]<
0then
6i?
i-1;
7j?
j-2;
6a[i,j]?
k;
7endfor
对于计算下一个排数位置,按上述的四种情形进行,但我们应先处理第三处情况。
算法描述如下:
1if(i=n)and(j=n)then
2j?
j-1;
/*下一个位置为(n,n-1)*/;
3else
4i?
imodn+1;
5j?
jmodn+1;
6endif;
引用内容programex5_7;
a:
array[1..99,1..99]ofinteger;
i,j,k,n:
write(‘n=’);
readln(n);
=ndiv2+1;
=n;
fork:
if(i=n)and(j=n)then
=j-1
else
=imodn+1;
=jmodn+1;
ifa[i,j]<
=j-2;
=k;
二、二维数组
合并定义:
var数组名:
array[下标类型1,下标类型2]of元素类型;
下标类型的个数即数组的维数,且说明了每个下标的类型及取值范围。
例如,定义:
array[1..4,1..3]ofinteger;
则表示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进行赋值:
fori:
=1to4do
=1to3do a[i,j]:
同样用二重循环来实现二维数组的输入与输出:
fori:
forj:
=1to3do read(a[i,j]);
fori:
begin
forj:
=1to3do write(a[i,j]:
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、仔细阅读下列程序段:
vara:
array[1..3,1..4]ofinteger;
{NOIP2000高中单选16题}
b:
array[1..4,1..3]ofinteger;
x,y:
begin
forx:
=1to3do
fory:
=1to4do a[x,y]:
=x-y;
=4downto1do
fory:
=1to3do b[x,y]:
=a[y,x];
writeln(b[3,2]);
end.
上列程序段的正确输出是( )。
A)-1 B)-2 C)-3 D)–4
分析:
数组a:
数组b:
0–1–2–3012
10-1-2-101
210-1-2–10
-3-2-1
例7、输入4名学生数学、物理、英语、化学、pascal五门课的考试成绩,求出每名学生的平均分,打印出表格。
vara:
{下标1学号,下标2某科成绩}
i,j:
{下标2多两列,分别存放总分、平均分}
fillchar(a,sizeof(a),0);
{用函数fillchar将数组a中所有元素置为0}
writeln('
Input4studentsscore'
);
fori:
forj:
=1to5do
begin
read(a[i,j]);
{读每科成绩时同时统计总分}
end;
a[i,7]:
{求平均分}
writeln('
No.MathPhyEngChePasTotalAverage'
write(i,'
'
forj:
=1to7do write(a[i,j]:
7:
1);
writeln;
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阶方阵,则按上述算法可排成:
618
753
294
vara:
array[1..100,1..100]ofinteger;
i,j,k,n,h,l:
integer;
fillchar(a,sizeof(a),0);
write('
inputn:
'
readln(n);
j:
=(n+1)/2;
a[i,j]:
fork:
begin
h:
ifh=0thenh:
l:
=j-1;
ifl=0thenl:
ifa[h,l]=0thenbegina[h,l]:
=h;
=lend;
elsebegina[i+1,j]:
=i+1end;
=1tondo write(a[i,j]:
writeln
end
end.