数组
来源:互联网 发布:原生js创建节点对象 编辑:程序博客网 时间:2024/05/29 09:17
引入:为什么要使用数组
例:输入50个学生的某门课程的成绩,打印出低于平均分的同学号数与成绩 。
一维数组类型的定义
一般格式: type 数组类型名=array[下标1..下标2] of <基类型>;
说明:其中array和of是pascal保留字。下标1和下标2 是同一顺序类型,且下标2的序号大于下标1的序号。它给出了数组中每个元素(下标变量) 允许使用的下标类型,也决定了数组中元素的个数。基类型是指数组元素的类型,它可以是任何类型,同一个数组中的元素具有相同类型。因此我们可以说,数组是由固定数量的相同类型的元素组成的。
实例
一般在定义数组类型标识符后定义相应的数组变量,如: type arraytype=array[1..8] of integer; var a1,a2:arraytype;
其中arraytype为一个类型标识符,表示一个下标值可以是1到 8,数组元素类型为整型的一维数组;而a1,a2则是这种类型的数组变量。
也可以将其全并起来:
var a1,a2:array[1..8]of integer;
一维数组的引用
当定义了一个数组,则数组中的各个元素就共用一个数组名( 即该数组变量名),它们之间是通过下标不同以示区别的。对数组的操作归根到底就是对数组元素的操作。一维数组元素的引用格式为: 数组名[下标表达式]
说明:①下标表达式值的类型,必须与数组类型定义中下标类型完全一致,并且不允许超越所定义的下标下界和上界 ②数组是一个整体,数组名是一个整体的标识,要对数组进行操作,必须对其元素操作。数组元素可以像同类型的普通变量那样作用。如:a[3]:=34;是对数组a中第三个下标变量赋以34的值。read(a[4]);是从键盘读入一个数到数组a第4个元素中去。 特殊地,如果两个数组类型一致,它们之间可以整个数组元素进行传送。
对于一维数组的输入与输出,都只能对其中的元素逐个的输入与输出。通常用循环结构来完成这一功能 。
一维数组的初始化
下面是几个常用输入数组元素的例子:
for i:=1 to 10 do read(a[i]); {——从键盘读入数组元素的值;最常用的方法}
for i:=1 to 10 do a[i]:=i; {——数组元素a[1]到a[10]的值分别为1到10;数据赋初值}
for i:=1 to 10 do a[i]:=0; {——数组元素清0;最常用的数据初始化的方法}
for i:=1 to 10 do a[i]:=random(100); {——随机产生10个100以内的数,赋给各数组元素}
例:输入50个学生的某门课程的成绩,打印出低于平均分的同学号数与成绩 。
type
arr=array[1..50] of integer;
var
a:arr;
i:integer;
sum:real;
begin
sum:=0;
for i:=1 to 50 do
begin
read(a[i]);
sum:=sum+a[i];
end;
sum:=sum/50;
for i:=1 to 50 do
begin
if a[i]<sum then
writeln(i,' ',a[i]);
end;
end.
练习
从键盘输入10个数,将这10个数逆序输出,并求这10个数的和,输出这个和。
program p1;
var
a:array [1..10] of integer;
i,s:integer;
begin
for i:=1 to 10 do read(a[i]);
for i:=10 downto 1 do write(a[i],' ');
s:=0;
for i:=1 to 10 do s:=s+a[i];
writeln('s=',s)
; end.
思考:我们可以边读入或边输出时求和,减少一次循环。请改写程序
例题
1、在长度为n的数组里,删除第K个数,输出删除后的数组。
输入:第一行包含两个数n(0<n<=100),表示数组的长度,k(K<=n),表示要删除的数。第二行包含n个数。
输出:删除后的数组。
2、在长度为n的数组里,在第K个位置插入值M,输出插入后的数组。
输入:第一行包含三个数:n(0<n<=100),k(0<k<=n),m(整型范围)。第二行包含n个数。
输出:插入后的数组。
3、将一个数组中的所有元素对调存放,如:
4、查找数组A 中是否有等于NUM 这个数,有则返回这个数在数组中的位置;没有,则返回0。(假设A 中有N个互异的整数)
二维数组
当一维数组元素的类型也是一维数组时,便构成了二维数组。二维数组定义的一般格式: array[下标类型1] of array[下标类型2] of 元素类型;
但我们一般这样定义二维数组: array[下标类型1,下标类型2] of 元素类型
说明:其中两个下标类型与一维数组定义一样,可以看成"下界1..上界1"和"下界2..上界2",给出二维数组中每个元素( 双下标变量)可以使用下标值的范围。of后面的元素类型就是基类型。
二维数组在编程中多数用于描述二维的关系:如地图、棋盘、城市街道、迷宫等等。而二维数组元素有两个下标:第一个下标表示该元素在第几行,第二个下标表示在第几列。二维数组的定义格式如下
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],’ ‘);
writeln;
end; {——最常用的输出方法:按矩阵形式输出二维数组的值}
例题
竞赛小组共有N位同学,这学期每位同学共参与了三项比赛,请统计每位同学的平均分。
输入格式:有N行,对于第i行,每行三个整数xi,Yi,Zi(0<=Xi<=Yi<=Zi<=10),表示第i个同学三项比赛的得分
输出格式:输出共一行,包含N个数字,数字之间用空格隔开。
分析:定义一个20行3列的二维数组来存放这些成绩。定义一个20个元素的一维数组来存放平均分。
program p1;
var
a:array [1..20,1..3] of integer;
b:array [1..20] of real;
i,j:integer;
begin
for i:=1 to 20 do
begin
for j:=1 to 3 do
read(a[i,j]);
readln;
end;
for i:=1 to 20 do b[i]:=0;
for i:=1 to 20 do
begin
for j:=1 to 3 do
b[i]:=b[i]+a[i,j];
b[i]:=b[i]/3;
end;
for i:=1 to 20 do
writeln(b[i]:0:2);
writeln;
end.
练习
1、定义一个10×10的二维数组,将每个元素的值设为其行列值之和,并将结果输出到屏幕上(10行10列,尽量工整)。
2、输入一个二维数组,找出其中最小的数,输出它的值以及所在行号和列号。
3、找出一个二维数组的鞍点,即该位置上的元素在该行上最大、该列上最小,也可能没有鞍点。数组的值从键盘输入,如: 19 23 21 13 61 25 34 45 67 32 39 29 39 98 27 56 如果没有鞍点则显示NO!,有则显示每个鞍点的位置和值,一个占一行。
4、矩阵转置:输入一个矩阵,将其右旋90度,输出。如
1 2 3 3 6 9
4 5 6 → 2 5 8
7 8 9 1 4 7