i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

数组

Posted on 2016-12-13 13:55  shnoip  阅读(639)  评论(0编辑  收藏  举报

数组是程序中经常使用的结构数据类型,用来描述由固定数目的同一类型的元素组成的数据结构。数组的每个元素与下标相关联,根据下标指示数组的元素;数组的存贮方式为按行存贮,在编译阶段,计算机根据数组的类型说明,确定其存贮空间的大小。

一、一维数组

一维数组是最简单的一类数组,在一维数组中,元素只沿一个方向排列。

一维数组的定义格式:
type
  数组类型名=array[常量1..常量2] of 基类型;

说明:
1、数组类型名是我们为这个自定义类型所起的名字,它应是一个合法的标识符
2、下标必须是有序数据类型,例如整型、字符型、布尔型、枚举型
3、常量1叫做数据的下标下界,用于规定数组下标的最小值;常量2叫做数组的下标上界,用于规定数组下标的最大值;下界必须小于或等于上界
4、基类型就是数组中每个元素的数据类型,它可以是任何数据类型

在type部分定义了数组类型之后,就可以在var部分定义该类型的数组了:
var
  数组变量名:数组类型名;

数组变量名是我们为这个数组起的名字,它应该是一个合法的标识符。

数组中的每个元素都相当于一个相应类型的普通变量。但是,数组元素没有单独的变量名,必须通过数组变量名和该元素的下标来确定。因此,数组元素也称为下标变量。数组元素的引用格式为:数组变量名[下标]

例如:
type
  t1=array[1..10] of integer;
var
  x:t1;
在type部分,我们定义了一个名为t1的数组类型,它的特征是:数组包含10个元素,元素的下标范围是1到10,每个元素的数据类型都是整型。
在var部分,我们定义了一个名为x的数组,它是t1类型的数组,具有t1类型所定义的特征。因此,数组x包含10个元素,分别是x[1]、x[2]、x[3]、……x[10],每个元素的数据类型都是整型。

定义数组的另一种方式为:不定义数组类型标识符,直接定义数据变量,其格式如下:
var
  变量名:array[下标下界..下标上界] of 基类型;

例如:
var
  x:array[1..10] of integer;

注意:数组的下标可以是任何一种有序类型,例如整型、字符型、布尔型、枚举型等,并且可以从这个类型中的任意一个值开始编排,而不一定从1开始;数组的基类型可以是Pascal语言中的任何数据类型,包括自定义类型。

例1:下面数组定义哪些是正确的,有多少个元素;哪些是错误的,错在哪里?
var
  count:array[1..31] of real;
  a:array[16..12] of integer;
  leou:array['a'..'z'] of integer;
  b:array[1.1..1.5] of char;
  r:array[1991..2000] of boolean;
  n:integer;
  c:array[1..n] of real;

例2:借助一维数组,生成菲波那契数列的前20项:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

分析:设菲波那契数列的元素为a1、a2、a3、…、an,则有:a1=1;a2=1;a3=a1+a2=2;a4=a2+a3=3……
可分两步实现,先为数组的第一个元素和第二个元素填写1,然后依次计算后续元素。

var
  a:array[1..20] of integer;
  i:byte;
begin
  a[1]:=1;
  a[2]:=2;
  for i:=3 to 20 do a[i]:=a[i-1]+a[i-2];
  for i:=1 to 20 do write(a[i],' ');
end.

例3:输入一串字符,以“!”作为结束,不分大小写,统计其中每种英文字符出现的次数并输出。
var
  ch:array['A'..'Z'] of byte;
  c:char;
begin
  for c:='A' to 'Z' do ch[c]:=0;
  read(c);
  while c<>'!' do begin
    c:=upcase(c);
    if (c>='A') and (c<='Z') then ch[c]:=ch[c]+1;
    read(c);
  end;
  for c:='A' to 'Z' do
    if ch[c]>0 then writeln(c,' ',ch[c]);
end.

例4:有N盏灯放在一排,从1到N依次顺序编号。有N个人也从1到N依次编号,1号将灯全部关闭,2号将凡是2的倍数的灯打开;3号将凡是3的倍数的灯作相反处理(该灯如为打开的,则将它关闭;如关闭的,则将它打开)。以后的人都和3号一样,将凡是自己编号倍数的灯作相反处理,经过N个人的操作后,输出每盏灯的情况(1表示灯打开,0表示灯关闭)
var
  k,n,i,j:byte;
  a:array[1..100] of 0..1;
begin
  write('N=');
  readln(n);
  for i:=1 to n do a[i]:=0;
  for i:=2 to n do begin
    j:=i;
    while j<=n do begin
      a[j]:=1-a[j];
      j:=j+i;
    end;
  end;
  for i:=1 to n do write(a[i],' ');
end.

例5:繁殖问题:有一家生化所,一月份引入一对新生的小白鼠,这种小白鼠生长两个月后在第三、第四、第五个月各繁殖一对小白鼠,在第六个月停止繁殖,在第七个月则死亡。新生的小白鼠也如此繁殖,问N个月后(N<50),活的小白鼠有多少对?
var
  a:array[1..50] of longint;
  n,i,j:shortint;
  sum:longint;
begin
  repeat
    write('Input n: ');
    readln(n);
  until n in [3..50];
  for i:=2 to n do a[i]:=0;
  a[1]:=1;a[3]:=1;a[4]:=1;
  for i:=5 to n do a[i]:=a[i-4]+a[i-3]+a[i-2];
  sum:=0;
  for i:=n-4 to n do
    if i>0 then sum:=sum+a[i];
  writeln(sum);
end.

二、二维数组

在现实世界中,有许多数据是按二维关系组织的,例如课程表中的课程

 与这种数据结构相对应的数组是二维数组,二维数组由行和列组成,二维数组中的元素沿行和列两个方向排列。要在二维数组中确定一个元素,必须同时指出它所在的行和所在的列,因此二维数组需要使用两个下标,即行下标和列下标。

二维数组的类型定义格式:
type
  数组类型名=array[行下标下界..行下标上界,列下标下界..列下标上界] of 基类型;

例如:
type
  t1=array[1..3,1..4] of real;
var
  a:t1;

这样定义的变量a就是一个二维数组,它包含3行4列,共12个元素,即:
a[1,1],a[1,2],a[1,3],a[1,4]
a[2,1],a[2,2],a[2,3],a[2,4]
a[3,1],a[3,2],a[3,3],a[3,4]
也可以直接定义二维数组变量:

var
  数组变量名:array[行下标下界..行下标上界,列下标下界..列下标上界] of 基类型;

二维数组的使用方法与一维数组类似,只是需要指定两个下标。其引用格式为:数组变量名[行下标,列下标]
例如:a[1,1]:=3.5;

操作二维数组时,常使用二重循环。例如,可以这样为数组a中的每个元素读入数据:
for i:=1 to 3 do
  for j:=1 to 4 do read(a[i,j]);

例6:输入正整数N(N<12),打印杨辉三角形的前N行。杨辉三角形如下:
N=5
    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1
其特点是二个腰上的数都为1,其它位置上的数是它的上一行相邻二个数之和。用二维数组很容易记下三角矩阵,然后再输出。

var
  a:array[1..12,1..12] of byte;
  i,j,n:byte;
begin
  repeat
    readln(n);
  until n<13;
  for i:=1 to n do begin
    a[i,1]:=1;a[i,i]:=1;
  end;
  for i:=3 to n do begin
    for j:=2 to n-1 do a[i,j]:=a[i-1,j]+a[i-1,j-1];
  end;
  for i:=1 to n do begin
    write(a[i,1]:30-2*i);
    for j:=2 to i do write(a[i,j]:4);   
    writeln;
  end;
end.


作业:
1、zerojudge:
一维数组:b130、a845、b138、b078、b139、b101、b098、a011、d213、d562、d237
二维数组:a015、d671、c012

2、从键盘读入10个正整数,将其中的奇数和偶数分别显示出来。例如:
输入:
12 8 19 5 4 6 7 2 11 3
输出:
19 5 7 11 3
12 8 4 6 2

3、输入一串字符,最后以“?”结束,分别统计其中的字母q、u、i、s出现的次数并输出。

4、输入一串英文,以“!”结束,单词之间用空格分隔,假设英文字符个数在200以内,输出单词的个数。