Pascal入门教程(7).doc_第1页
Pascal入门教程(7).doc_第2页
Pascal入门教程(7).doc_第3页
Pascal入门教程(7).doc_第4页
Pascal入门教程(7).doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章 数组类型 内容提要 本章介绍了数组的含义及存储结构,一维,二维数组的输入、输出方法及应用,字符串数组的相关知识。 学习要求在本章里,要求学生熟练掌握一维,二维数组的定义及存储结构,输入、输出方式,关键是能用数组知识解决诸如排序等实际问题。掌握字符串及字符串数组的构成方式,能熟练进行字符串的各种运算。前面我们学习了一种自定义类型:子界型。这一章我们学习另一种很重要的构成类型:数组型。构成类型是用已有的基类型按一定的规则构成的一种新类型。数组类型也是用实型,整型,布尔型,字符型,子界型,枚举型等数据类型构成一的种能让多个数据有序的新类型。在前面我们学习变量时可能就有疑问存在了:如果有多个数据,比如说20个无规律的整数,我们能不能方便地把其中任一个数表达出来?用以前的知识,我们能用20个变量,比如A1,A2,A3,A20,每个变量对应一个整数。如果要用第五个数,则调用A5即可。但是如果要求把20个变量中的数一一相加,又该怎么做呢?那就得写出表达式:S:A1A2A3A4A20。也就是说有20个变量就得写出20个变量相加。如果要求将这20个变量打印出来,则得写:WRITE(A1,A2,A3,A4,A20)。(本书在这里用了“”将中间的项省略了,但读者编程时不能省,有20项则20项都得写出)。20个变量就很不方便了,要是有100个,1000个,10000个变量又怎么办?不至于把10000个变量一一写出来吧?数组类型能解决这个问题。第一节 一维数组11 关于数组我们在表达类似上述的20个整数这类问题时,要用的20个变量我们用另一种方法表示:变量名还是用A,但是加上下标:第一个变量用A1表示, 第二个变量用A2表示, 第三个变量用A3表示,A4, A5, A20。在这里,我们在变量A后加了下标,用中括号把下标括起来。这种表示的变量叫下标变量。下标变量A1和普通变量A1的区别是下标变量中的下标可以是常量,变量,表达式。如AN,AX3,A20 这些表示方式都是正确的。既然中括号中的下标可以变化,那么在表达时就方便多了,可以用循环来进行下标变量的输入输出操作。对于下标变量A1来说,A叫变量名,1叫下标,但此下标必须用中括号将其括起来。对于所有的同变量名的下标变量,我们把它们叫做数组。如:A1,A2,A3A20就叫做变量名为A的数组。一个数组就是由若干个同变量名的下标变量组成。12 一维数组的定义下标变量中下标可以不止一个,如A2,4也是一个下标变量。但是我们把只有一个下标的变量的集合叫做一维数组。如:A1,A2,A3一维数组定义的格式如下:TYPE 数组名ARRAY下标类型 OF 基类型;数组名是用户自已取的名字,ARRAY和OF 是保留字;下标类型是一个有序类型,可以是整型,字符型,布尔型,枚举型,子界型等。基类型是整型,实型,布尔型,字符型,子界型,枚举型等。如:TYPE AAARRAY120 OF INTEGER; VAR A:AA;上面定义了一个一维数组A,它自动生成20个下标变量,分别叫做A1,A2,A3A20。每个下标变量都是整型变量。再看看下面的例子:TYPE COLOR(RED,ORANGE,YELLOLW,GREEN,INDIGO,BLUE,VIOLET); BBARRAY510 OF BOOLENA; CCARRAYAZ OF REAL; DDARRAYCOLOR OF CHAR;VAR B:BB; C:CC; D:DD;经过以上的定义后,有:1 数组B生成了5个下标变量,分别是:B5,B6,B7,B8,B9,B10。每一个下标变量都是布尔型变量。如:B5TRUE;B6FALSE2 数组C生成了26个下标变量,分别是CA,CBCZ。每个下标变量的类型都是实型。如:CA3447,CB20CZ55。3 数组D生成了7个下标变量,分别是:DRED,DORANGE,DYELLOWDVIOLET。每个下标变量为字符型。如:DREDS,DORANGE,DVIOLET8。实际上,我们在定义数组的下标类型时,一般采用整型的子界型。以上的定义我们可以这样来描述: VAR B:ARRAY510 OF BOOLENA;C:ARRAYAZ OF REAL; 这样,便义好了两个数组:A,B。这两个数组和上面定义的功能完全一样。 注意:在定义数组的下标变量中,不能出现变量。如:VAR A:ARRAY1X OF INTEGER;这句定义便错了。因为在定义数组时,系统根据定义数组的下标数据的最大值来给数组预分配空间。比如定义:VAR A:ARRAY110 OF INTEGER; 则系统会给数组预留10个存贮单元以备用。即使用户用不完这些存贮空间,这些空间也不能被其它数据所占用。所以在定义下标时,不能有变量,否则系统不知道该分配多少存贮空间给数组。 但这种定义法是可以的: CONST X10; VAR A:ARRAY1X OF INTEGER; 因为X是先定义好了的常量,在下标中已不属于变量了。 正因为系统会预先分配空间给数组,且这些空间不能被其它数据所占用,所以不能乱设下标变量中的下标。如果设得过大,分配给数组的空间也越多,那么留给系统运行的空间就少了,严重时有可能导致程序无法运行。 13 一维数组的建立与输出 当一维数组定义好后,我们就要考虑怎样给它进行读写操作。 当一维数组的下标变量较少时,可以直接给它赋值。如: VAR A:ARRAY15 OF INTEGERR; BEGIN A1:5; A2:2; 当数组的输入输出的量比较大时,我们要考虑用循环的方法来解决这个问题。因为下标变量中的下标可以用变量及表达式,所以用循环比较方便。例1 任意输入20个字符,然后把它们倒序输出。分析:在前面我们做过类似的题,用递归的方法实现过。如果用数组的方法会更简单。 PROGRAM e1(input,output); VAR c:array1.20 of char; i:integer; BEGIN for i:=1 to 20 do begin writeln(input char); readln(ci); end; for i:=20 downto 1 do write(ci, ); END.在这个程序里,我们建立一个数组C来装20个字符。采用循环的方法读入20个字符,再用循环的方法把20个下标变量中的字符给打印出来。 例2 任意输入10个整数,把第1,第10个数相加,第2,第9个数相加,第3,第8个数相加然后把相加的式子打印出来。 分析:这个问题照样可以用数组的方法解决。从题意分析可知,被选中相加的两变量的下标之和是11,所以可以设循环为1到5,用11减去已知下标便是另一个下标了。 PROGRAM e2(input,putput); VAR n:array1.10 of integer; i:integer; BEGIN for i:=1 to 10 do begin writeln(input number); read(ni); end; for i:=1 to 5 do writeln(ni,+,n11-i,=,ni+n11-i); END. 14 一维数组应用举例 例3 任意输入一串字符,以?结尾。统计其中数字0,1,2,39出现的次数。 分析:我们设一数组A来统计每个数字出现的次数,即A0统计数字0出现的次数,A1统计数字1出现的次数A9统计数字9出现的次数。一旦输入的字符与下标一样,则在该下标变量中加1。最后数组A中的数便是09共10个字符出现的次数。 PROGRAM e2(input,putput); VAR n:array0.9 of integer; s:set of 0.9; i:char; c:char; BEGIN s:=0.9; for i:=0 to 9 do ni:=0; repeat writeln(input a char); read(c); if c in s then nc:=nc +1; until c=?; for i:=0 to 9 do write(i,:,ni, ); END.例4 任意输入N个数,将它们按从大到小的顺序打印出来。分析:排序算法是一个很重要的算法,就排序来说,有多种方法可以实现,但效率有高有低。我们这里介绍一种常用算法:在一个序列中将最值找出来,再在剩下的列中产生下一个最值这样按找出最值的先后顺序排列的数便是有序数。产生最值的方法是这样:(假设产生最大值)用第一个数和后面所有的数进行比较,如后面的数比第一个数大,则两数交换。这样,一轮比较完后,第一个数必是最大数;又在剩下的序列中取第一个数和后面的所有数进行比较,如后面的数比它大,又交换 PROGRAM e4(input,output); VAR s:array1.100 of integer; i,j,n,m:integer; BEGIN writeln(inupt n); readln(n); writeln(input number); for i:=1 to n do read(si); for i:=1 to n do for j:=i+1 to n do if si=m then j:=1 else j:=j+1; s:=s+aj; until s=n; write(j, ); aj:=0; end;END.本题在进行累加时,对已出列的变量(其值已为0)照样进行了一次加运算。这样影响了效率。读者思考一下,怎样做可以使已出列的变量不再参与运算?例6 产生1000个随机小数,统计小数点后第一个数分别是0,1,2,9的数各是多少?分析:TURBO PASCAL中产生随机数的函数是RNADOM,它产生0,1之间的数。如产生100以内的整数,则应是RNADOM(100)。为了保证每次产生的随机数不一样,在前面加上语句RANDOMIZE。 PROGRAM e6(input,output); VAR s:array0.9 of integer; i,n:integer; m:real; BEGIN for i:=0 to 9 do si:=0; randomize; for i:= 1 to 1000 do begin m:=random; n:=round(m*10) mod 10; sn:=sn+1; end; for i:=0 to 9 do writeln(i,: ,si); END.在本程序中,要注意的是产生的随机数M是实数,而要变成整数程序才能执行。我们用了函数ROUND进行实数到整数的转变。第二节 二维数组 前面我们已经知道了一维数组中的数是线性排列,它可以方便地将一个队列中的任何一个数表达出来。但是,要是我们要表达的数不是线性的,而是一个面的排列,那么一维数组就不能表达出来了,这时要借助二维数组。二维数组就是在数组的下标变量中有两个下标的数组。如:A3,6,BA,Z。如果说一维数组表达的是一个数的队列,那么二维数组表达的是一个数的矩阵,变量中的两个下标可以想象成行和列。A3,6表示第三行第六列的一个数。二维数组定义的格式如下:TYPE 数组名ARRAY下标类型1,下标类型2 OF 数组类型。在这里,下标类型和一维数组完全一样,可以为整型的子界型,枚举型,字符型,布尔型等。两个下标类型之间用逗号隔开。后面的数组类型同样为各种基类型,如:整型,实型,布尔型,字符型 例:TYPE AAARRAY14,15 OF INTEGER; BBARRAYAD,AE OF REAL; CCARRAY13,15 OF BOOLEAN; VAR A:AA; B:BB; C:CC;经过以上定义后,我们可以对变量赋值了: A2,3:7,A1,5:6,A2,4:A1,57 BC,A:234,BD,A:70 C3,3:TRUE,C1,5:FALSE其实,以上语句也可以这样定义: VAR A:ARRAY14,15 OF INTEGER; B:ARRAYAD,AE OF REAL; C:ARRAY13,15 OF BOOLEAN;于是,产生了三个数组A,B,C。我们以A为例来进行分析:系统给数组A分配了20个存贮变量、它们分别是: A1,1 A1,2 A1,3 A1,4 A2,1 A2,2 A2,3 A2,4 A3,1 A3,2 A3,3 A3,4 A4,1 A4,2 A4,3 A4,4 A5,1 A5,2 A5,3 A5,4这二十个下标变量都是整型变量,用两个数据作下标则表示的数的排列不再是一条线了,而是一个面。二维数组的输入和输出照样可以用循环实现,而且很方便。例7 有两个五行五列矩阵A,B,现在求出它们的和。分析:矩阵相加要求两矩阵的行,列数一样。相加的原则是:AX,Y只能和BX,Y相加,五行五列矩阵则要加25次。相加的结果仍然是一个五行五列的矩阵。 PROGRAM e8(input,output); VAR a,b:array1.5,1.5 of real; i,j:integer; BEGIN for i:=1 to 5 do for j:=1 to 5 do begin writeln(input a,i,,j,); read(ai,j); end; for i:=1 to 5 do for j:=1 to 5 do begin writeln(input b,i,,j,); read(bi,j); end; for i:=1 to 5 do begin for j:=1 to 5 do write(ai,j+bi,j:4); writeln; end; end.在这个程序中,执行了两个矩阵的输入,一个矩阵的输出操作。例8 输入一五行五列的矩阵,然后:(1) 输出矩阵(2) 将主对角线之外的上三角形的每个元素分别加1,下三角形的每个元素减1,形成新的矩阵打印出来(3) 找出该矩阵中绝对值最大的元素,同时找出其行列值。 PROGRAM e9(input,output); VAR a:array1.5,1.5 of integer; i,j,i1,j1,max:integer; BEGIN 输入矩阵 for i:=1 to 5 do for j:=1 to 5 do begin writeln(input a,i,j,); read(ai,j);end;输出矩阵 for i:=1 to 5 do begin for j:=1 to 5 do write(ai,j:4); writeln; end;writeln;对角线以上的元素加1,以下的元素减1,输出新矩阵 for i:=1 to 5 do begin for j:=1 to 5 do begin if ij then ai,j:=ai,j-1; write(ai,j:4); end; writeln; end;writeln;找出最大元素,并记录下该元素的下标 max:=a1,1; for i:=1 to 5 do for j:=1 to 5 do if maxai,j then begin max:=ai,j; i1:=i;j1:=j; end; writeln(the max unmber is a,i,j,=,max); END. 例9 有1,2,3,4,5,6共六个城市,它们之间的航班线如图所示。现在要求任意输入两城市代码,马上回答它们之间是否有直搭航班。 分析:这幅图给我们的是一个现实生活中的图,怎样把这个信息变成计算机能识别的信息呢?我们可以用二维数组来表示:定义一个六行六列的数组,每个变量的两个下标表示两个城市的代码,变量的值表示它们之间的连接情况,如该下标变量为1,则表求两城市之间有直搭航班,如为0则表示无直搭航班。如A1,21,A1,30 PROGRAM e11(input,output); CONST a:array1.6,1.6 of integer= (1,1,0,1,1,0),(1,1,0,1,0,1), (0,0,1,1,0,1),(1,1,1,1,0,0), (1,0,0,0,1,0),(0,1,1,0,1,0); VAR (图T82) m,n:integer; BEGIN writeln(input the code of city m,n); readln(m,n); if am,n=1 then writeln(true); if am,n=0 then writeln(false); END. 这个程序又给我们提供了一种新的方法来进行数组的输入。当两城市有直搭航班则输出TRUE,无则输出FALSLE。第三节 字符串 31字符串数组 前面我们学习了字符型,字符是单个的符号,而字符串是由若干个字符连接在一起而要构成。 字符串实际上是指一个字符型的数组。如: VAR D:ARRAY1100 OF CHAR; 那么数组D则中则可以存放100个字符了,它就是一个字符串。下面来看一个30个字符的字符串的输入和输出操作的例子:例12 PROGRAM e12(input,output); VAR c:array1.30 of char; i:integer; BEGIN writeln(input a string); for i:=1 to 30 do read(ci); for i:=1 to 30 do write(Ci); END. 32字符串类型 这里我们学习一种新的数据类型:字符串型,它用STRINGN表示。中括号中的N表示该字符串允许的长度为多少。N值一般不超过255。其定义格式如下:TYPE 类型名STRINGN;我们来看一个定义的例子: TYPE CCSTRING20; VAR C,D:CC; 于是,就可以对字符串变量C,D赋值了: C:I AM A STUDENT; D:12345678901234567890 在定义时,我们给变量C,D的长度为20,但是C的长度不够。不够没关系,但不要超出。 字符串类型的输出也很方便,直接用WRITE语句输出即可。 WRITE(C,D) 以上的定义方式也可以这样定义: VAR C,D:STRING20; 在定义字符串时,也可以在STRING后不加N,也就是直接写STRING。其默认的参数是255个字符。 33字符串的运算1 大小比较字符串大小的比较的依据是字符在ASCII码中的大小。我们知道字符有大有小,如AB,Aa,9A那么,字符串比较大小的规则是这样的:首先两字符串的第一个字符相比较,字符大,则字符串大,如果第一个字符相等,则比较第二个字符,字符大者字符串大字符串的大小并不是比长短。如: BABCDEFG EFGFGHIJK abcABC ABCDABC 2 字符串的连接运算连接运算用加号表示,其操作是把两字符串首尾连接。如:ST1:1234;ST2:ABCD;则ST1ST2的结果是:1234ABCD34 字符串的函数和过程 TURBO PASCAL提供了一些字符串的标准函数和过程。1 LENGTH(字符串)这是一个测量括号中字符串的长度的函数,其结果是整型数据。如: LENGTH(ABCD123)7 LENGTH(ASD ASD ASD)112 COPY函数该函数的格式是:COPY(字符串,M,N),它表示的是在字符串中从第M个字符开始取N个字符。如:已知ST:ABCDEFG HIJKL;则: COPY(ST,3,5)CDEFG、 COPY(ST,10,8)IJKL这条命令虽要求取8个字符出来,但从第10个字符开始后面只有4个字符了,也只显示这4个字符。3 CONCAT函数该函数的格式是:CONCAT(字符串1,字符串2,字符串3),其作用是将括号中的字符串首尾连接起来。但是长度超过255则报错。如:CONCAT(ABC,123,ZZZ)ABC123ZZZ4 POS函数其格式为:POS(字符串1,字符串2),其作用在字符串2中查找字符串1第一次出现的位置,如找到了,则返回位置号,如没找到,则返回0。如:POS(EFG,ABCDEFGHI)5;POS( 45,123456)5;POS( 123,ABCDEFG)0;5 DELETE过程该过程的格式为:DELETE(字符串,M,N),作用是在字符串中,从第M个字符开始删除N个字符。如:ST:ABCDEFGH则执行DELETE(ST,3,2)过程后,ST的值变成ABEFGH6 INSERT过程该过程的格式是:INSERT(字符串1,字符串2,M),其作用是把字符串1插入到字符串2中的第M个字符之前。如:ST:ABCDEF;则执行过程INSERT(123,ST,3)后,STR 的值变成AB123CDEG例13 输入一些国家的名称(以END结尾),按字典顺序输出。该题其实是一道比较字符串大小的题。 PROGRAM e13(input,output); CONST m=20;n=30; VAR a:array1.n of stringm; st:stringm; i,j,k,rn:integer; BEGIN write(input the name of the c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论