二维数组(第十七课)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例5.9 设有一程序 program ex5_9; const n=3; var a: array[1..n,1..n]of integer; 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.
例5.13 输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构 成回文。 【分析】所谓回文指从左到右和从右到左读一串字符的值是一样的,如 12321,ABCBA,AA等。先读入要判断的一串字符(放入数组letter中),并 记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断 出是否为回文。 程序如下: program ex5_13; var letter:array[1..100]of char; j:=1; //判断它是否是回文 while (j<i)and(letter[j]=letter[i])do i,j:0..100; begin ch:char; i:=i-1;j:=j+1; begin //读入一个字符串以'.'号结束 end; write('Input a string:'); i:=0;read(ch); if j>=i then writeln('Yes.') else writeln('No.'); while ch<>'.' do end. begin i:=i+1; letter[i]:=ch; read(ch) end;
程序如下: program ex5_12; var a : array[1..10,1..10] of integer; i,j : integer; begin a[1,1] := 1; //设定第一行的值 for i := 2 to 10 do //从第二行开始推 begin a[i,1] := 1; a[i,i] := 1; //设定每一行的首尾值为1 for j := 2 to i-1 do //当前行非首尾的数 a[i,j] := a[i-1,j-1] + a[i-1,j]; //每个数等于上一行的二个数之和 end; for i := 1 to 10 do begin if i<>10 then write(' ' :30-3*i); //控制每行的起始位置,即空格数量 for j := 1 to i do write(a[i,j] :6); writel一维数组元素的类型也是一维数组时,便构成了“数组的数组”,即二维 数组。二维数组定义的一般格式:我们一般这样定义二维数组: 数组名:array[下标类型1,下标类型2] of 元素类型;

说明:其中两个下标类型与一维数组定义一样,可以看成"下界1..上界1" 和"下界2..上界2",给出二维数组中每个元素( 双下标变量)可以使用下标值的 范围。of后面的元素类型就是基类型。


for j := 1 to 5 do
a[i,j] := 1;
二维数组元素的引用
对二维数组的输入与输出也同样可用二重循环来实现 : for i := 1 to 3 do for j := 1 to 5 do read(a[i,j]); for i := 1 to 3 do begin for j := 1 to 5 do write(a[i,j] :5); writeln; end; 说明:当定义的数组下标有多个时,我们称为多维数组, 下标的个数并不局限在一个或二个,可以任意多个,如定 义一个三维数组a和四维数组b: a : array[1..100,1..3,1..5] of integer; b : array[1..100,1..100,1..3,1..5] of integer; 多维的数组引用赋值等操作与二维数组类似。
二维数组的定义

二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元素的引用必须给出二个下标。 引用的格式为: <数组名>[下标1,下标2] 说明:显然,每个下标表达式的类型应与对应的下标类型一致,且取值不超出下标类型所指定的范围,否则会导致致命的越界 错误。 例如,设有定义:a : array[1..3,1..5]of integer; 则表示a是二维数组(相当于一个3*5的表格),共有3*5=15个元素,它们是: a[1,1]a[1,2]a[1,3]a[1,4] a[1,5] a[2,1]a[2,2]a[2,3]a[2,4] a[2,5] a[3,1]a[3,2]a[3,3]a[3,4] a[3,5] 因此可以看成一个矩阵(表格),a[3,4]即表示第3行、第4列的元素。 对于整个二维数组的元素引用时,采用二重循环来实现。如:给如上定义二维数组a都赋值为1,表达如下: for i := 1 to 3 do
且运行程序时的输入为: 2□1□3←┘ 3□3□1←┘ 1□2□1←┘ 则程序的输出应是: 2□3□1 1□3□2 3□1□1
二维数组程序设计
例5.10 已知一个6*6的矩阵(方阵),把矩阵二条对角线上的元素值加上10, 然后输出这个新矩阵。 【分析】 矩阵即表格,是一个二维数组,有6行6列共36个元素,每个矩阵都有 二条对角线,本题难点在于对角线的元素怎么确定。 Program ex5_10; var a : array[1..6,1..6]of integer; i,j : integer; begin for i := 1 to 6 do //输入矩阵元素 for j := 1 to 6 do read(a[i,j]); for i := 1 to 6 do //更改对角线上元素的值 for j := 1 to 6 do if (i = j) or (i+j = 7) then a[i,j] := a[i,j]+10; //寻找对角线的特征 for i := 1 to 6 do //输出6行6列的矩阵元素 begin for j := 1 to 6 do write(a[i,j] :5); writeln; end; end.
上机练习5.2

5、给一维数组输入M个整数,假设M=6,数组元素分别为 7 4 8 9 1 5, 要求建立一个如下数组(矩阵): 7 4 8 9 1 5 4 8 9 1 5 7

8 9 1 5 7 4
9 1 5 7 4 8 1 5 7 4 8 9
5 7 4 8 9 1
上机练习5.2
如:a : array[1..4,1..10] of integer;



可以这样理解:a : array[1..4] of arr; (arr=array[1..10] of integer;)
a数组实质上是一个有4行、10列的表格,表格中可储存40个元素。第1行 第1列对应a数组的a[1,1],第n行第m列对应数组元素a[n,m]。
例5.11 大部分元素是0的矩阵称为稀疏矩阵,假设有k个非元素,则可把稀疏矩阵用K*3的矩阵 简记之,其中第一列是行号,第二列是列号,第三列是该行、该列下的非元素的值。如: 0 0 0 5 写简记成: 1 4 5 //第1行第4列有个数是5 0 2 0 0 2 2 2 //第2行第2列有个数是2 0 1 0 0 3 2 1 //第3行第2列有个数是1 试编程读入一稀疏矩阵,转换成简记形式,并输出。 【分析】 本题中需要解决的主要问题是查找非零元素并记忆位置。将原始矩阵存于数组a。转换 后的矩阵存于数组b,当然b数组的行数可以控制在一个小范围内。 program ex5_11; if a[i,j]<>0 then //找到非零值,存储 const n=3; m=5; begin var a:array[1..n,1..m] of integer; k:=k+1; b:array[1..100,1..3] of integer; b[k,1]:=i; b[k,2]:=j; b[k,3]:=a[i,j]; i,j,k:integer; end; begin for i:=1 to k do //输出 for i:=1 to n do //矩阵初始 begin for j:=1 to m do read(a[i,j]); for j:=1 to 3 do write(b[i,j]:3); k:=0; writeln; for i:=1 to n do end; for j:=1 to m do end.


6、建立如下矩阵: 2 3 4 5
3 4 5 6 4 5 6 7 5 6 7 8 注意:一般情况下,给二维数组赋初值,都是找A [ I,J ] 与I和J的函数关系,对于任意的A [ I,J ] =I+J。 7、设数组a是有n个元素的整数数组,从中找出最大和子序列。

8、打印杨辉三角形的前10行。

1、输入一个3×3二维数组,找出其中最小的数,输出它的值以及所在行 号和列号。 2、输入4行4列数组,将第2行与第3行元素对调。 3、输入4×4方阵,分别求两条对角线上元素之和。
4、矩阵的转置:
A: 1 2 3 4 5 6 7 8 9 转置为 B: 1 4 7 10 2 5 8 11 3 6 9
上机练习5.2
例5.12 打印杨辉三角形的前10行。杨辉三角形如下图: 1 1 1 1 1 1 1 2 1 1 2 1 1 3 3 1 1 3 3 1 1 4 6 4 1 1 4 6 4 1 [图6-3] [图6-4] 【分析】 观察图6-3,大家不容易找到规律,但是如果将它转化 为图6-4,不难发现杨辉三角形其实就是一个二维表的小三 角形部分,假设通过二维数组yh存储,每行首尾元素为1, 且其中任意一个非首位元素yh[i,j]的值其实就是yh[i-1,j-1]与 yh[i-1,j]的和,另外每一行的元素个数刚好等于行数。有了 数组元素的值,要打印杨辉三角形,只需要控制好输出其 始位置就行了。
相关文档
最新文档