认识数组
我们先做下面两个题:
第一个:
输入n(n<100)个数,并且以相反的顺序输出这些数。(假设当n=5时,我们可以通过定义5个不同变量很轻松地解决这个问题。程序为:(假设5个变量分别为x1、x2、x3、x4、x5)请写出程序。
但是当n值超过一定个数时,如n=100,定义变量及数据的输出、输出成为一个非常繁琐的过程,需要定义100个变量,写100个read语句和100个write语句。这样是不现实的。
利用数组就能很方便地处理这个问题,且程序规模不受影响,并且非常明了清晰:
假设n=100,我们引入数组x,分别用x[1], x[2],…,x[100]表示这100个变量,其中x为数组名称,方括号中的数字称为下标,下标可以用变量表示,如x[i]表示的数据由i决定,当i=1,x[i]表示x[1],i=20, x[i]表示x[20],i=100, x[ i ]表示x[100], ……,不同的x[i]就是不同的数组元素,于是程序可以修改为:
Const n=100;
V ar x: ] of integer ;
I: integer ;
Begin
For i:=1 to n do read(x[i]);
For i:=n downto 1 do write(x[i] );
End.
整个程序非常简洁,而且直接通过修改常量n的定义就可解决不同的n值需要。
可见,引入数组之后,程序设计变得十分有效。特别是对于一批数据的排序、查等操作,不使用数组将寸步难行。
第二个:
输入三个整数,由程序计算他们的平均值,并将其中大于平均值的数显示出来,例如输入3、8、7其平均值是6,因此显示8和7。
分析:readln语句从键盘读入三个数,分别存储到a、b、c三个整形变量中;求出a、b、c的平均值,在
存储到变量s中;将a、b、c的值与s的值依次进行比较,将其中大于s的值用writeln语句输出程序:
program lx1;
var a, b, c:integer;
s: real ;
begin
readln(a);
readln(b);
readln(c);
s: =(a+b+c)/3 ;
if a>s then writeln(a);
if b>s then writeln(b);
if c>s then writeln(c );
end.
运行程序,输入3、8、7,输出结果为8、7
现在,我们改变一下题目要求:输入100个整数,将其中大于平
均值的数显示出来。如果仍然采用上述程序的思路,就需要定义100个变量,写100个readln语句、100个if语句和100个writeln 语句。这是很繁琐的。也是不现实的。在计算机的实际应用中,数据量往往远大于100个,例如:一个图书馆的藏书就可能有几十万册。因此,仅通过增加变量个数和语句条数是无法解决问题的。而且,即使能够写出程序,也一定是冗长笨拙的程序。
通过分析程序中各个变量的用途可知,a、b、c用于存储待处理的数,可以归为一组,而s用于存储平均值,不属于这一组。并且,a、b、c数据类型是相同的。在现实问题,还有许多数据像a、b、c这样具有同等意义和相同的数据类型,例如班级名单上的50个姓名,课程表上的30节课,一座楼房里的60个门牌号。在编程,如果能将每组同类型数据用整体的、统一的方式来存储和处理,而不是孤立地、分别地存储和处理,则可以大大简化程序。
在计算机编程中,我们可以用数组(array)来表示象这样具有同等意义和相同数据类型的一组数据。因
此:
数组是同类型的一组数据按一定关系排列成的表。数组中的每一个数据叫做一个数组元素,简称元素。每个数组都有确定的元素数目和下标范围。
Integer、real、char、都是pascal语言表示标准数据类型的,可以直接用来定义变量、形参和函数返回值。数组类型是一种自定义数据类型,需要在程序预先进行定义,规定数组的元素类型和下标范围,然后才可以使用。
一维数组
一维数组是最简单的一类数组。在一维数组中,元素只沿一个方向排列。1、一维数组的定义格式:
type
数组类型名=array[常量1..常量2]of 基类型;
var
数组变量名:数组类型名;
说明:
(1)数组类型名是我们为这个自定义类型所起的名字,它应是一个合法的标识符;
(2)下标必须是有序数据类型,例如整形、字符型、布尔型、枚举型。
(3)常量1叫做数组的下标下界,用于规定下标的最小值;常量2叫做数组的下标上界,用于规定数组下标的最大值。
下界必须小于或等于上界。
(4)基类型就是数组中每个元素的数据类型,它可以是任何数据类型。
(5)var部分定义该类型的数组,数组变量名是我们为这个数组起的名字,它应是一个合法的标识符。
注:数组中的每个元素都相当于一个相应类型的普通变量。但是,数组元素没有单独的变量名,必须通过数组变量名和该元素的下标来确定。因此,数组元素也称为下标变量。数组元素的引用格式为:
数组变量名[下标]
请看例子:
type
t1=array[1..10] of integer
var
x: t1 ;
下标的表示法:
(讲解)
定义数组的另一种方式为:不定义数组类型标识符,直接定义数组变量,其格式如下:
var
变量名:array[下标下界..下标上界]of 基类型;
例如:
var
x: array[1..10] of integer ;
这段程序直接定义了一个名为x的数组,它包含10个元素,元素的下标范围是1到10,每个元素的数据类型都是整形。
需要指出:数组的下标可以是任何一种有序类型,例如整形、字符型、布尔型、枚举型,并且可以从这相类型中的任意一个值开始编排,而不一定从1开始;数组的基类型可以是pascal语言中的任何数据类型,包括自定义数据类型。下面的数组定义都是正确的:
count : array[1..31] of real ;
leou : array[‘a’..’z’] of integer ;
r: array[1991..2000] of Boolean ;
(讲解以上每个数组中有多少个元素及表示法及类型)
以下是一些错误的数组定义:
var
a : array[16..12] of integer ; {下界不能大于上界}
b : array[1.1..1.5] of char ; {下标必须是有序类型}
c : ] of real ; {定义时下标的下界和上界必须是常量}
使用数组时,通常就是把数组元素当作相应类型的变量来使用。数组元素的使用方法与普通变量基本相同。下面的程序用整形变量做对照,演示了整型数组元素的使用方法。
Program lt1;
Type
T1=array[1..10] of integer ;
V ar
a,b,c : integer
x : T1;
begin
a : =3 ; x[1] : =3 ; {赋值操作}
b : =a+5 ; x[2]:=x[1]+5 ;{参加运算}
readln(c) ; readln(x[3]) ; {用输入语句赋值}
writeln(c); writeln(x[3]) ;{输出}
end.
使用数组元素时,下标可以是常量,也可以是变量或表达式。例如:
program lt2 ;
var
a : array[1..10] of integer ;
I : integer ;
Begin
I : =1 ;
a[I] :=3 ;
a[I+1] :=5 ;
a[I+2] :=7 ;
writeln(‘a[1]=’,a[1]) ;
writeln(‘a[2]=’,a[I+1]) ;
writeln(‘a[3]=’,a[I+2] );
end.
程序运行结果为:
a[1]=3
a[2]=5
a[3]=7
数组元素的下标可以是变量或表达式。通过改变变量或表达式的值,我们可以引用数组中不同元素。借助这一特点,我们可以用循环语句对数组中的元素进行成批操作,例如:
for I : =1 to 10 do read(a[I]) ;
运行程序所执行的操作就相当于:(略)这正是数组类型的优越之处。
现在,我们可以很容易地实现开始时100个数的处理了。程序如下:
program lx1;
var
n:array[1..100] of integer ; {定义数组}
s:real ;
I:integer ;
V:integer;
Begin
For I:=1 to 100 do
Readln(n[I]) ; {依次读100个整数,存到n中}
S:=0
For I :=1 to 100 do
S:=s+n[I];
V:=s/100;{求100个数的平均值}
For I:=1 to 100 do
If n[I]>v then
Writeln(n[I]) ; {依次比较,若大于平均值v则输出}
End.
运行程序后,从键盘上输入100个整数,程序将其累加起来,求出平均数,然后依次判断每个数,将大于平均值的数显示出来。由此可见:
使用数组类型和循环结构,可以对一组数据进行成批操作。这样写出的程序更简洁、更合理,而且很容易根据需求的变动进行修改。例如,需处理的数据变为60个,则只需将下标上界和循环终值改为60,而不需改动程序结构,也不需要增删语句。
在计算机的内存中,数组元素是依次存放的。一维数组的各个元素按其下标顺序依次排列。假如有这样一段程序:program lx2;
var
a: array[3..8] of integer ;
begin
a[3] : =8 ;
a[4] : =0 ;
a[5] : =0 ;
a[6] : =6 ;
a[7] : =0 ;
a[8] : =6 ;
end.
则数组a在内存中具有这样的结构:
有12个字节的存储空间。
一维数组的应用实例
例1:借助一维数组,生成菲波那契数列的前20项。
1 1
2
3 5 8 13 21 3
4 5
5 89 144 233 377 610 987 1597 2584 4181 6765
分析:设菲波那契数列的元素为a1、a2、a3、a4…a n,则有
(1)a1=1; (2)a2=1 ; (3) a3=a n-1+a n-2 (当n>=3时)
可分两步实现,先为数组的第一个元素和第二个元素填写1,然后依次计算后续元素。程序如下:
program lt1;
二维数组下标怎么理解var
a : array [1..20] of integer ;
I : integer ;
Begin
a[1] : =1;
a[2] : =1;
for I: =3 to 20 do
a[I ] : =a[I - 1]+a[I-2] ;
for I : =1 to 20 do
write( a[I], ‘‘) ;
end.
例2:数组元素的使用。
Program lt2 ;
V ar
Da: array[‘a’..’z’] of integer
Ch: char ;
I: integer ;
Begin
I : =1 ;
For ch: =’a’ to ‘z’ do
Begin
Da[ch] :=I ;
Writeln(da[ch]) ;
I : =I+1 ;
End;
End.
以上程序定义了一个整型数组data,程序中说明了数组变量da。其中26个元素分别为:a[‘a’]、a[‘b’]…a[‘y’]和a[‘z’],在程序的语句段中通过循环语句为这26个元素进行赋值操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论