二维数组
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
begin write(‘’:4,I:5);
for j:=1 to 6 do
write(cjb[I,j]:6:1);
writeln;
end;
仔细阅读下列程序段: var a:array[1..3,1..4] of integer;
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
begin
s:=0;{累计每位同学的各科目总分。初始化,避免前面同学分数还在}
for j:=1 to 5 do{控制列,即每个科目。}
begin
read(cjb[I,j]);
s:=s+cjb[I,j];
end;
cjb[I,6]:=s/5;{每位同学的平均分都是放在第6列中。}
readln;
end;
for I:=1 to 4 do
Sa+(5-1)*10*3+(8-1)*3+1=sa+141
输入4名学生的数学、语文、自然、英语、Pascal五门课 程的成绩,求出每名学生的平均分,打印成绩表。
【问题分析】 问题分析如下: 接收4名学生各门课的成绩。 计算每名学生的平均值。 输出成绩表
课程学号 数学
语文
自然
英语
pascal 平均分
例如3阶方阵,则按上述算法可排成:
438
951
276
奇数阶魔阵伪代码
有了以上的算法,解题主要思路可用伪代码描述 如下: 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; 8 a[i,j] ←k; 9 endfor
给定一个具有n 层的数学三角形如下,从顶至底有多条路径,每一步可沿左斜线 向下或沿右斜线向下,路径所经过的数字之和为路径得分,请求出最小路径得分。
2 62 184 1568 输入数据: 第1 行,一个正整数n ,表示三角形的行数。 第2 至n+ 1 行,照描述输入三角形。 输出数据: 最小路径得分,行末有换行 样例输入: 4 2 62 184 1568 样例输出: 10 【注意】 测试数据规模: 保证100% 的数据n ≤ 1000 。
1
88.5
90
95
68
89
2
76
86
94.5
96.5
99
3
99.5
95
96
75
100
4
100
99
97
79
95.5
var
cjb:array[1..4,1..6] of real;{存放学生各科目成绩和平均分}
i,j:integer;s:real;{ s存放每一位同学的各科目总成绩}
begin
for I:=1 to 4 do{控制行,即第几个同学。}
课堂练习
读入5个学生的学号和成绩,计算他们的 平均分,若比平均分高10分的等第为A, 若比平均分高小于10分的等地为B,若 低于平均分,则等第为C,输出他们的成 绩和等第。
杨辉三角形(YHTriangle)
1 11 121 1331 14641 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 输入数据: 一个正整数n ,表示三角形的行数。 输出数据: n 行杨辉三角形。
二维数组及其应用
安庆四中
范江文
二维数组
一维数组在编程中多用于描述线性的关系: 如一组数;一组成绩;一组解答等。数组 元素只有一个下标,表明该元素在数组中 的位置。二维数组在编程中多数用于描述 二维的关系:如地图、棋盘、城市街道、 迷宫等等。 二维数组元素有两个下标:
第一个下标表示该元素在第几行,
例1设有一程序:
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
213
for j:=1 to n do read(a[i,j]);
在上述分析中,思考问题的角度按照题意给出从第1 层到第n 层,如果换个角 度从第n 层到第1 层,每次按规则从可选的相邻两数中选择小的数向上传递,可 以发现效果是一样,且当走到第1 层时,即为最小分值和。这样就不必再在最后 一行中求最小数。
算法描述:
(1)定义二维数组a 存放数据; (2)读入原始数据;
计算:
1、设数组a[10..100,20..100] 以行优先的方式顺序存储,每 个元素占有4个字节,且已知a[10,20]的地址为1000,则
a[50,90]的地址是___B___。
A、14350 B、14240 C、15340 D、13250
分析:[(50-10)*(100-20+1)+90-20]*4+1000=14240
i,j,k:integer;
begin a[1]:=1; for i:=1 to n do begin for j:=1 to i do b[j]:=a[j]+a[j-1]; a:=b; for k:=1 to i do write(a[k]:4); writeln; end;
end.
数字三角形(NT) 。 问题描述:
331
readln; end; for i:=1 to n do
121 则程序的输出应是?
begin
for j:=1 to n do
write(a[j,i]:5);
writeln;
end;
end.
奇数阶魔阵
奇数魔阵是用自然数1,2,3…,n2填n阶方阵的各个元素位置,使
方阵的每行的元素之和、每列元素之和及主对角线元素之和均相等。
writeln(a[1 ,1]) ;//输出最小分值和 End.
问题分析: 求最小路径得分,比较容易想到的是: (1)如果知道从第1 行走到第n 行各数字上的最小得分,那么,从中取最小值 即可。 (2)第n 行是从n - 1 行走下来的,如果知道第n - 1 层各数字位置上的最小 得分值,那么根据规则每步只能沿左斜线向下或沿右斜线向下,要使第n 层的各数 字位上得到最小得分值,只能从左上和右上两个得分值中取小的一个与当前位的数 字相加。 (3)同理,第n - 1 层各数位上的最小得分可以从第n - 2 层推出。 (4)考虑第i 层与第i - 1 层的关系,可以推出如下关系: 设d[i ,j]表示第i 层,第j 列位置上的最小路径得分,a[i ,j]表示第i 层,第j 列位置上的数字,则: d[i ,j] = min(d[i - 1 ,j] ,d[i - 1 ,j - 1]) + A[i ,j] (5)从上至下求得d[i ,j] ,那么问题的解为d[n ,j](1 ≤ j ≤ n)中最小 数。 进一步分析:
c[i ,i] ∶= 1 ; end ; for i∶= 1 to n do
for j∶= 1 to ido if j= i then writeln(c[i,j]) else write(c[i,j] ,’ ’) ;
End.
思考:怎么利用一维数组实现杨辉三角?
program yh; CONST N=10; var a,b:array[-1..n]of integer;
算法描述:
(1)定义二维数组c 存放杨辉三角形的值; (2)赋初值:c[1,1]=1,c[2,1]=1,c[2,2]=1; (3)用二重循环控制二维数组下标的变化,从上到下,从左到右求元素值;
(4)输出杨辉三角形。
Const n= 20 ; //输出行数
var c∶ array[0 ..n ,0 ..n]of longint ; i,j ,m ∶ longint ;
问题分析: 观察杨辉三角形不难看出,数字是有规律的,从第3 行开始,每行第1 个和最
后1 个值为1 ,其他值为上方和左上方数字和。 设二维数组c[i ,j]存储行坐标为i 、列坐标为j 位置上元素值,则 c[i ,j] = c (i - 1 ,j - 1) + c (i - 1 ,j)
每个元素值由其左上方和上方元素求和得到,因此,可以按从上到下,从左到右 顺序一行一行地求得元素值。
奇数阶魔阵的一个算法是将自然数数列从方阵的中间一行最后一个位
置排起,每次总是向右下角排(即A[i,j]的下一个是A[i+1,j+1])。但若 遇以下四种情形,则应修正排数法。
(1) 列排完(即j=n+1时),则转排第一列; (2) 行排完(即i=n+1时),则转排第一行; (3) 对A[n,n]的下一个总是A[n,n-1]; (4) 若A[i,j]已排进一个自然数,则排A[i-1,j-2]。
begin readln(n) ;//读入数据 for i∶= 1 to n do begin for j∶= 1 to ido read(a[i ,j]) ; readln ; end ; for i∶= n - 1 downto 1 do //控制第n - 1 行至第1 行 for j∶= 1 to I do //每个元素值为正下方和右下方两数中小的数加自身数 if a[i+ 1 ,j] < = a[i+ 1 ,j+ 1] then a[i,j]:=a[i,j]+a[i+1,j] else a[i,j]:=a[i+1,j+1];
第二个下标表示在第几列
二维数组的定义格式如下:
var a:array[1..10,1..5] of integer;
{ 二维数组的输入输出要用双重循环来控制:}
for i:=1 to 10 do{————控制行数} begin for j:=1 to 5 do read(a[i,j]) {————第一行读入5个元素} readln; {————读入一个换行符} end; {——最常用的方法:从键盘读入数据初始化二维数组} for i:=1 to 10 do for j:=1 to 5 do a[i,j]:=0; {——最常用的方法:将二维数组清0} for i:=1 to 10 do begin for j:=1 to 5 do write(a[i,j]:4); writeln; end; {——最常用的输出方法:按矩阵形式输出二维数组的值}
begin c[1 ,1] ∶= 1 ; //赋初值 c[2 ,1] ∶= 1 ;c[2 ,2] ∶= 1 ;
for i∶= 3 to n do //从第3 ~ n行
begin c[i ,1] ∶= 1 ; for j∶= 2 to i- 1 do //从第2 ~ i- 1 列 c[i ,j] ∶= c[i- 1 ,j- 1] + c[i- 1 ,j] ;
(3)控制循环变量i 从n - 1 行到第1 行,每行重复下列 操作:求每列的元素值为当前元素值与a[i + 1 ,j] 、a [i + 1 ,j + 1]两元素中最Байду номын сангаас值之和; (4)输出a[1 ,1] 。
program nt ; Var
n∶ longint ; a∶ array[1 ..1000 ,1 ..1000]of longint ; i,j∶ longint ;
从10-50共40行 从20-100共81列 第50行中还有(90-20)列
2、已知数组a中,每个元素a[I,j]在存储时要占3个字节,设I从1 变化到8,j从1变化到10,分配内存时是从地址sa 开始连续按行
存储分配的。试问:a[5,8]的起始地址为___A___。
A、sa+141 B、sa+180 C、sa +222 D、sa+225