1、= 100;end;/6. 根据子界定义数组: TRange = 0.10; arrayTRange of Integer;/7. 根据枚举定义数组: TEnums = (Enum1,Enum2,Enum3); arrayTEnums of string; MyArrEnum1 := 万一; ShowMessage(MyArrEnum1); /万一/8. 根据其他类型定义数组: arrayByte of Char; MyArr255 := #65; ShowMessage(MyArr255); /A/应尽量不使用内建类型,可以新建类型: TNewByte = Byte; arrayTNewBy
2、te of Char;/也可以使用类型别名: TChar = type Char; arrayTChar of Byte; MyArrC := 255; ShowMessage(IntToStr(MyArr); /255/同时定义类型: MyRec = record string; r: Real; b: Byte; end; Arr1: array0.100 of MyRec; Arr2: array0.100 of record s: /可以直接这样定义 Arr3: packed array0.100 of MyRec; /压缩数组定义, 好像没有区别?一. 一维数组 A:Array of
3、 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”,给出二维数组中每个元素( 双下标变量)可以使用下标值
4、的范围。of后面的元素类型就是基类型。一般地,n维数组的格式为:array下标类型1,下标类型2,下标类型n of 元素类型;其中,下标类型的个数即数组的维数,且说明了每个下标的类型及取值范围。*多维数组元素的引用多维数组的数组元素引用与一维数组元素引用类似,区别在于多维数组元素的引用必须给出多个下标。引用的格式为:下标1,下标2,下标n显然,每个下标表达式的类型应与对应的下标类型一致,且取值不超出下标类型所指定的范围。例如,设有说明: 引用内容type matrix=array1.5,1.4of integer;var a:matrix;则表示a是二维数组,共有5*4=20个元素,它们是:
5、引用内容a1,1a1,2a1,3a1,4a2,1a2,2a2,3a2,4a3,1a3,2a3,3a3,4a4,1a4,2a4,3a4,4a5,1a5,2a5,3a5,4因此可以看成一个矩阵,a4,2即表示第4 行、第2 列的元素。由于计算机的存储器是一维的,要把二维数组的元素存放到存储器中,pascal是按行(第一个下标)的次序存放,即按a1,1a1,2a1,3a1,4a2,1,a5,4的次序存放于存储器中某一组连续的存储单元之内。对于整个二维数组的元素引用时,大多采用二重循环来实现。如:给如上说明的二维数组a 进行赋值: 引用内容ai,j=i*j。for i:=1 to 5 do for j
6、:=1 to 4 do ai,j:=i*j;对二维数组的输入与输出也同样可用二重循环来实现: 引用内容for i:=1 to 4 do read(ai,j); for i:=1 to 4 do write(ai,j:5);eg、多维数组的应用示例例7、设有一程序: 引用内容program ex5_3;const n=3;type matrix=array1.n,1.nof integer;var i,j:1.n;=1 to n do begin read(ai,j); readln; write(aj,i: writeln;end.且运行程序时的输入为: 引用内容213331121则程序的输出
7、应是: 引用内容231 132 311例8、输入4名学生数学、物理、英语、化学、pascal五门课的考试成绩,求出每名学生的平均分,打印出表格。分析:用二维数组a 存放所给数据,第一下标表示学生的学号, 第二个下标表示该学生某科成绩,如ai,1、ai,2、ai,3、ai,4、ai,5分别存放第i 号学生数学、物理、英语、化学、pascal 五门课的考试成绩,由于要求每个学生的总分和平均分, 所以第二下标可多开两列,分别存放每个学生5门成绩和总分、平均分。源程序如下: 引用内容program ex5_4;array1.4,1.7of real;integer; fillchar(a,sizeof
8、(a),0); 函数fillchar用以将a中所有元素置为0 writeln(Enter 4 students score);=1 to 5 do 读入每个人5科成绩 读每科成绩时同时统计总分 ai,6:=ai,6+ai,j; ai,7:=ai,6/5;求平均分 writeln( No. Mat. Phy. Eng. Che. Pas. Tot. Ave.); 输出成绩表 write(i:2, );=1 to 7 do write(ai,j:9:2); 换行例9、输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构成回文。所谓回文指从左到右和从右到左读一串字符的值是一样的,如1
9、2321,ABCBA,AA 等。先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。 引用内容program ex5_5; letter : array1.100of char; i,j : 0.100; ch : char; 读入一个字符串以.号结束 write(Input a string:); i:=0;read(ch); while ch. do=i+1;letteri:=ch; read(ch) 判断它是否是回文 j:=1; while (j=i then writeln(Yes.) else write
10、ln(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已排进一个自然数,则排Ai1,j2。例如3阶方阵,则按上述算法可排成:4 3 89 5 12 7 6有了以上的算法,解题主要思路可用伪
11、代码描述如下:1 i?n div 2+1,y?n /*排数的初始位置*/2 ai,j?1;3 for k:=2 to n*n do4 计算下一个排数位置!(i,j);5 if ai,j0 then6 i?i-1;7 j?j-2;6 ai,j?k;7 endfor对于计算下一个排数位置,按上述的四种情形进行,但我们应先处理第三处情况。算法描述如下:1 if (i=n)and(j=n) then2 j?j-1; /*下一个位置为(n,n-1)*/;3 else4 i?i mod n +1;5 j?j mod n +1;6 endif; 引用内容program ex5_7; a :array1.99
12、,1.99of integer; i,j,k,n : write(n=);readln(n);=n div 2+1;=n; for k: if (i=n)and(j=n) then=j-1 else=i mod n +1;=j mod n +1; if ai,j=j-2;=k;二、二维数组 合并定义: var 数组名:array下标类型1, 下标类型2 of 元素类型; 下标类型的个数即数组的维数,且说明了每个下标的类型及取值范围。例如,定义 :array1.4,1.3of integer; 则表示a是二维数组,共有4*3=12个元素,它们是:a1,1a1,2a1,3a2,1a2,2a2,3a
13、3,1a3,2a3,3a4,1a4,2a4,3因此可以看成一个矩阵,a4,2即表示第4行、第2列的元素。虽然逻辑上可以把二维数组看作是一张表格或一个矩阵,但在计算机内部,二维数组的所有元素对应的存储单元是连续的,与一维数组的存储方式在本质上是相同的。如给上例定义的二维数组a进行赋值: for i:=1 to 4 do =1 to 3 do ai,j:同样用二重循环来实现二维数组的输入与输出: for i: for j:=1 to 3 doread(ai,j); for i: begin for j:=1 to 3 dowrite(ai,j: writeln; end;例5、已知数组A中,每个元
14、素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:array1.3,1.4 of integer; NOIP2000高中单选16题 b:array1.4,1.3 of integer; x,y: beginfor x:=1 to 3 do for y:=1 to 4 doax,y:=x-y;=4 downto 1 do for y:=1 t
15、o 3 do bx,y:=ay,x;writeln(b3,2); end. 上列程序段的正确输出是( )。 A) -1B) -2C) -3D) 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: 下标1学号,下标2某科成绩 i,j: 下标2多两列,分别存放总分、平均分 fillchar(a,sizeof(a),0); 用函数fillchar将数组a中所有元素置为0 writeln(I
16、nput 4 students score);for i: for j:=1 to 5 do begin read(ai,j); 读每科成绩时同时统计总分 end;ai,7: 求平均分 writeln( No. Math Phy Eng Che Pas Total Average write(i, for j:=1 to 7 do write(ai,j:7:1);writeln;end. 例8、奇数魔方阵。输出整数1到n2(n 为齐数),排成的一个nn方阵,使方阵中的每一行、每一列及对角线上的数之和都相同。奇数阶魔阵算法: 将1填在第一行中间,即 1,(n+1)/2,然后依次填入2到n2; 若
17、当前位置为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 32 9 4 var a : array1.100,1.100of integer;i,j,k,n,h,l : integer; fillchar(a,sizeof(a),0); write(input n: readln(n); j:=(n+1)/2;ai,j: for k: begin h: if h=0 then h:l:=j-1; if l=0 then l:if ah,l=0 then begin ah,l:=h;=l end; else begin ai+1,j:=i+1 end;=1 to n dowrite(ai,j: writeln end end.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1