pascal第5章数组.ppt

上传人:s****8 文档编号:67209050 上传时间:2022-12-24 格式:PPT 页数:49 大小:258.50KB
返回 下载 相关 举报
pascal第5章数组.ppt_第1页
第1页 / 共49页
pascal第5章数组.ppt_第2页
第2页 / 共49页
点击查看更多>>
资源描述

《pascal第5章数组.ppt》由会员分享,可在线阅读,更多相关《pascal第5章数组.ppt(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第五章第五章 数组数组第一节第一节 一维数组一维数组第二节第二节 二维数组二维数组第三节第三节 字符数组和字符串类型字符数组和字符串类型第一节第一节 一维数组一维数组为什么要使用数组为什么要使用数组通过前面几章的学习,我们已经可以编写程序来解决各种相当复杂的问题了,但是当需要处理的数据比较多时,仅依靠前面的知识是不够的,即使简单的问题也可能需要比较复杂的程序来处理。请看下面的例子:例题例题 输入50个学生的某门课程的成绩,打印出低于平均分的学生序号与成绩。【分析】在解决这个问题时,虽然可以通过一个变量来累加读入的50个成绩求出学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数后才能求

2、得平均分,并且要求打印出低于平均分的学生序号和成绩,故必须把50个学生的成绩都保留起来,然后逐个和平均分比较,把低于平均分的成绩打印出来。如果,用简单变量a1,a2,,a50存储这些数据,要用50个变量保存输入的数据,程序片断如下:readln(a1,a2,a10);readln(a41,a42,a50)注意,如果真正要像上面这样编写程序,则上面的所有省略号必须用完整的语句写出来。可以看出,这样的程序是多么繁琐。如果说处理的数据规模达到成千上万,上面的例子单单读入就会异常复杂,电脑的特点没有得到体现。从以上的讨论可以看出,如果只使用简单变量处理大量数据,就必须使用大量只能单独处理的变量,即使是

3、简单问题也需要编写冗长的程序。选手们可能已经看出,我们需要把一大批具有相同性质的数据组合成一个新类型的变量,可以用简单的程序(比如循环50次)对这个新变量的各个分量进行相同的处理,每个分量仍然保留单个变量的所有性质(在上面的例子中,各分量是整型变量或实型变量的性质)。如果能象数学中使用下标变量ai形式表示这50个数,则问题就容易实现。在Pascal语言中,具有下标性质的数据类型是数组数组。如果使用数组,上面的问题就变得十分简单、清晰。例如,读入50个学生的成绩,只需写如下语句即可:fori:=1to50doreadln(ai);在这里引用了带下标的变量(分量变量称为数组元素)ai来代替a1,a

4、2,a50,方括号中的i称为下标,当循环变量i=1时ai就是a1;当i=2时ai就是a2;当i=50时ai就是a50。输入的时候,让i从1变化到50,循环体内输入语句中的ai也就分别代表了a1,a2,a50这50个带下标的变量。这样上述问题的程序可写为:tot:=0;/tot存储50个学生的总分fori:=1to50do/循环读入每一个学生的成绩,并把它累加到总分中beginread(ai);tot:=tot+ai;end;ave:=tot/50;/计算平均分fori:=1to50doifaiavethenwriteln(No.,i,ai);/如果第i个同学成绩小于平均分,则将输出这个学生的序

5、号和成绩。要在程序中使用下标变量,必须先说明这些下标变量的整体数组,即数组是若干个同名(如上面的下标变量的名字都为a)下标变量的集合,这些变量的类型全部一致。一维数组一维数组当数组中每个元素只带有一个下标时,我们称这样的数组为一维数组。一维数组的定义一维数组的定义(1)类型定义类型定义一般格式为:type=;其中type是Pascal保留字,表示开始一个类型定义段。在其后可以定义若干个自定义的数据类型。是为定义的类型取的名字,称它为类型标识符。类型定义后,也就确定了该类型数据取值的范围,以及数据所能执行的运算。和Pascal提供的标准类型如integer、real等没什么区别。(2)一维数组类

6、型的定义一维数组类型的一般格式:var数组名:array下标1.下标2of;对于上例:a:array1.50ofinteger;说明:其中array和of是Pascal保留字。下标1和下标2是同一顺序类型,且下标2的序号大于下标1的序号。它给出了数组中每个元素(下标变量)允许使用的下标类型,也决定了数组中元素的个数。基类型是指数组元素的类型,它可以是任何类型,同一个数组中的元素全部具有相同类型。因此我们可以说,数组是由固定数量的相同类型的元素组成的。再次提醒注意:类型和变量是两个不同概念,不能混淆。就数组而言,程序的执行部分使用的不是数组类型而是数组变量。数组的另一种定义形式,先定义数组的类型

7、标识符,再定义数组,如:typearray1=array1.8ofinteger;vara1,a2:array1;其中array1为一个类型标识符,表示一个下标值从1到8,数组元素类型为整型的一维数组;而a1,a2则是这种类型的数组变量,代表二个数组。我们平时更多的是将二者全并起来,直接定义:vara1,a2:array1.8ofinteger;当在说明部分定义了一个数组变量之后,Pascal编译程序为所定义的数组在内存空间开辟一串连续的存储单元。例如:vara:array1.10ofinteger;以下表示a数组在内存的存储如表所示:a1a2a3a4a5a6a7a8a9a10a数组共有10个

8、元素组成,在内存中10个数组元素共占10个连续的存储单元。a数组最小下标为1,最大下标10。按定义a数组所有元素都是整型变量。一维数组元素的赋值操作一维数组元素的赋值操作 数组元素的引用形式为:数组名下标表达式。数组一经定义后,数组元素就具有简单变量一样的性质,使用时必须写出下标。对于一维数组变量的赋值有两种形式:一是对各数组元素赋值,二是对数组所有元素整体赋值。例如:设有下列变量定义vara1,a2:array1.20ofinteger;i:integer;执行下列语句:fori:=1to20doa1i:=1;/数组元素赋值a2:=a1;/两个数组只要结构(元素个数和类型)相同,就可以整体赋

9、值这个程序片段的功能是将一维整型数组变量a1、a2的所有数组元素都初始化赋值为1,前面的循环语句是逐个赋值,最后一个赋值语句是两个一维数组间的整体赋值,其作用相当于把数组a1中每一个数组元素的值分别赋给数组a2中相应的元素,这要求两个数组具有相同类型和一样的下标范围。一维数组的引用一维数组的引用 一维数组元素的输入一维数组元素的输入不能整个数组输入,只能逐个元素赋值ai:=x;一般用FOR循环做。如:Fori:=1to7doread(ai);一维数组元素的输出一维数组元素的输出不能整个数组一起输出,只能逐个元素输出Write(ai);一般用FOR循环做。如:Fori:=1to7dowrite(

10、ai);例例5.1 输入输入10个数个数,要求程序按输入时的逆序把这要求程序按输入时的逆序把这10个个数打印出来。也就是说,按输入相反顺序打印这数打印出来。也就是说,按输入相反顺序打印这10个数。个数。【分析分析】我们可定义一个数组a用以存放输入的50个数,然后将数组a中的内容逆序输出。programex5_1;typearr=array1.10ofinteger;/说明一数组类型arrvara:arr;i:integer;beginwriteln(Enter10integer:);fori:=1to10doread(ai);/从键盘上输入10个整数readln;/读入时起换行作用fori:=

11、10downto1do/逆序输出这10个数write(ai:10);end.例例5.2 输入一串字符,以?结束,统计其中每个字母出现的次数。【分析分析】为了简单起见,只考虑每个小写字母出现的次数。为记录每个字母出现的次数,定义一个由26个元素组成的数组,下标类型是字符,元素类型为整型。如:num:arraya.zofinteger;用numa记录字母a出现的次数,用numb记录字母b出现的次数,开始应将num的每个元素置成0,其实所有变量的初始值都为0。当读入的字符不是?时,应判断它是否为字母,若是则应将相应字母计数加1。此时需判断哪个字母,只要将读入的字母作为下标,就可以找出相应的数组元素,

12、将它加1即可。若读入的字符是?则结束循环,最后输出统计结果。程序如下程序如下:Programex5_2;varnum:arraya.zofinteger;ch:char;beginforch:=atozdo/等价于fillchar(num,sizeof(num),0);numch:=0;read(ch);whilech?dobeginif(ch=a)and(ch=z)then/判断是否为小写字母numch:=numch+1;read(ch);end;readln;/换行和暂停forch:=atozdoifnumch0thenwrtieln(ch,numch);end.运行结果cabc*&879

13、6abcaa?a4b2c3例例5.3 将将a数组中第一个元素移到最后数组末尾数组中第一个元素移到最后数组末尾,其余数据依次往前其余数据依次往前平移一个位置。平移一个位置。【分析分析】为完成题目所要求的操作,其算法应该包括以下几个主要步骤:把第一个元素的值取出放在一个临时单元temp中;通过a2a1,a3a2,a4a3,anan-1,实现其余元素前移将temp值送入an.Programex5_3;constn=10;vara:array1.nofinteger;i:integer;temp:integer;beginwriteln(read,n,datas);fori:=1tondoread(a

14、i);temp:=a1;fori:=1ton-1doai:=ai+1;an:=temp;writeln(Result:);fori:=1tondowrite(ai:3);end.运行结果:read10datas:12345678910Result:23456789101例例5.4 宾馆里有一百个房间,从宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是开了,第二个服务员把所有编号是2的倍数的房间的倍数的房间“相反处理相反处理”,第三个服务员把,第三个服务员把所有编号是所有编号是3的倍数的房间作的倍数的房间作

15、“相反处理相反处理”,以后每个服务员都是如此。当第,以后每个服务员都是如此。当第100个服务员来过后,哪几扇门是打开的。(所谓个服务员来过后,哪几扇门是打开的。(所谓“相反处理相反处理”是:原来开着的是:原来开着的门关上,原来关上的门打开。)门关上,原来关上的门打开。)【分析分析】此题较简单,只要设置一个表示门是开的还是关的标志数组,只有二种状态采用布尔型更直观。由于有固定的循环次数,用for循环显得简练。程序如下:程序如下:Programex5_4;constn=100;vara:array1.nofBoolean;i,j,k:integer;beginfori:=1tondoai:=tru

16、e;/可用fillchar(a,sizeof(a),true)代替fori:=2tondoforj:=1tondoifjmodi=0thenaj:=not(aj);forj:=1tondoifaj=truethenwrite(j:5);/可写成:ifajthenwrite(j:5);readlnend.运行结果:1491625364981100例例5.5 约瑟夫问题:约瑟夫问题:N个人围成一圈,从第一个人开个人围成一圈,从第一个人开始报数,数到始报数,数到M的人出圈;再由下一个人开始报数,的人出圈;再由下一个人开始报数,数到数到M的人出圈;的人出圈;输出依次出圈的人的编号。输出依次出圈的人的编

17、号。N,M由键盘输入。由键盘输入。【分析分析】(1)由于对于每个人只有出圈和没有圈两种状态,因此可以用布尔型标志数组存储游戏过程中每个人的状态。不妨用TRUE表示出圈,FALSE表示没有圈。(2)开始的时候,给标志数组赋初值为FALSE,即全部在圈内。(3)模拟报数游戏的过程,直到所有的人出圈为止。程序如下:程序如下:Programex5_5;varn,m,s,f,t:integer;a:array1.100ofboolean;/根据题意开出数组大小beginreadln(n,m);/共n人,报到m出圈fort:=1tondoat:=false;f:=0;t:=0;s:=0;/刚开始所有变量默

18、认值也是0repeatt:=t+1;/逐个枚举圈中的所有位置ift=n+1thent:=1;/数组模拟环状,最后一个与第一个相连ifat=falsethens:=s+1;/第t个位置上有人则报数ifs=mthen/当前报的数是mbegins:=0;/计数器清零write(t,);/输出出圈人的编号at:=true;/此处的人已出圈,设置为空f:=f+1;/出圈的人数增加一个end;untilf=n;/直到所有的人都出圈为止end.运行结果:输入:85输出:52871463例例5.6 输入十个正整数输入十个正整数,把这十个数按由大到小的顺序排列。(把这十个数按由大到小的顺序排列。(选选择排序择排

19、序)将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序是一种较简单的方法。【分析分析】要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,。因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数(最大的泡往上冒)。同理,第二步,将第二个数与其后各个数再依次比较,又可得出次大的数。如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次大的数。于是十个数的顺序排列结束。如对5个进行排序,这个五个数分别为829105。按选择排序方法,过程如下:初始数据:829105第一次排序:82910592810510

20、2895102895第二次排序:108295109285109285第三次排序:109825109825第四次排序:109852对于十个数,则排序要进行9次。程序如下:程序如下:programex5_6;vara:array1.10ofinteger;i,j,t:integer;beginwriteln(Input10integers:);fori:=1to10doread(ai);/读入10个初始数据readln;fori:=1to9do/进行9次排序beginforj:=i+1to10do/将第i个数与其后所有数比较ifaiajthen/若有比ai大,则与之交换begint:=ai;ai:

21、=aj;aj:=t;endend;fori:=1to10dowrite(ai:5);end.运行结果:输入:867521897455892341输出:589234152546774189例例5.7 编程输入十个正整数,然后自动按从大到小的顺序输出。编程输入十个正整数,然后自动按从大到小的顺序输出。(冒泡排序)(冒泡排序)【分析分析】用循环把十个数输入到A数组中;从A1到A10,相邻的两个数两两相比较,即:A1与A2比,A2与A3比,A9与A10比。只需知道两个数中的前面那元素的标号,就能进行与后一个序号元素(相邻数)比较,可写成通用形式Ai与Ai+1比较,那么,比较的次数又可用1(n-i)循环

22、进行控制(即循环次数与两两相比较时前面那个元素序号有关);在每次的比较中,若较大的数在后面,就把前后两个对换,把较大的数调到前面,否则不需调换位置。下面例举5个数来说明两两相比较和交换位置的具体情形:564375和6比较,交换位置,排成下行的顺序;654375和4比较,不交换,维持同样的顺序;654374和3比较,不交换,顺序不变654373和7比较,交换位置,排成下行的顺序;65473经过(1(5-1)次比较后,将3调到了末尾。经过第一轮的1(N-1)次比较,就能把十个数中的最小数调到最末尾位置,第二轮比较1(N-2)次进行同样处理,又把这一轮所比较的“最小数”调到所比较范围的“最末尾”位置

23、;每进行一轮两两比较后,其下一轮的比较范围就减少一个。最后一轮仅有一次比较。在比较过程中,每次都有一个“最小数”往下“掉”,用这种方法排列顺序,常被称之为“冒泡法”排序。程序如下程序如下:Programex5_7;constN=10;vara:array1.Nofinteger;/定义数组i,j,t:integer;beginfori:=1toNdoReadln(ai)/输入十个数forj:=1toN-1do/冒泡法排序fori:=1toN-jdo/两两相比较ifaiTrunc(sqrt(N)为止;打印输出a数组中留下来、未被筛掉的各元素值,并按每行五个数显示。用筛法求素数的过程示意如下(图中

24、用下划线作删去标志):234567891011121314159899100/置数234567891011121314159899100/筛去被2整除的数234567891011121314159899100/筛去被3整除的数234567891011121314159899100/筛去被整除的数程序如下:程序如下:Programex5_8;constN=100;Vara:array1.nofboolean;i,j:integer;BeginFillchar(a,sizeof(a),true);a1:=False;fori:=2toTrunc(sqrt(N)doifaIthenforj:=2to

25、NdivIdoai*j:=False;t:=0;fori:=2toNdoifaithenBeginwrite(i:5);inc(t);iftmod5=0thenwritelnend;End.【上机练习上机练习5.1】1、输入十个正整数,然后把这十个数按由小到大的顺序输出。(选择排序)2、输入十个正整数,然后把这十个数按由小到大的顺序输出。(冒泡排序)3、国际象棋盘中,第1格放1粒米,第2格放2粒米,第3格放4粒米,第4格放8粒米,第5格放16粒米,问:16个格子总共可以放多少粒米?【分析分析】第i个格子可放多少粒米:2i14、输出斐波列契数列的前N项(5个1行)011235813215、读入n

26、个数,打印其中的最大数及其位置号。6、输入N个整数,找出最大数所在位置,并将它与第一个数对调位置。7、将一个数组中的所有元素倒序存放。【分析分析】A1ANA2AN-1AIAJI从1开始,每交换1次,I加1;直到I=NDIV28、有52张朴克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律依此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,并打印出它们的位置。9、围绕着山顶有10个洞,一只狐狸和一只兔子各住

27、一个洞。狐狸总想吃掉兔子。一天兔子对狐狸说:“你想吃我有一个条件,先把洞从110编上号,你从10号洞出发,先到1号洞找我;第二次隔1个洞找我,第三次隔2个洞找我,以后依此类推,次数不限。若能找到我,你就可以饱餐一顿。不过在没有找到我以前不能停下来。”狐狸满口答应就开始找了,它从早到晚找了1000次洞,累得昏了过去也没有找到兔子。请问,免子躲在几号洞里?【答案】2,4,7,9第二节第二节 二维数组二维数组二维数组的定义二维数组的定义 当一维数组元素的类型也是一维数组时,便构成了“数组的数组”,即二维数组。二维数组定义的一般格式:我们一般这样定义二维数组:数组名:array下标类型1,下标类型2o

28、f元素类型;说明:其中两个下标类型与一维数组定义一样,可以看成下界1.上界1和下界2.上界2,给出二维数组中每个元素(双下标变量)可以使用下标值的范围。of后面的元素类型就是基类型。如:a:array1.4,1.10ofinteger;可以这样理解:a:array1.4ofarr;(arr=array1.10ofinteger;)a数组实质上是一个有4行、10列的表格,表格中可储存40个元素。第1行第1列对应a数组的a1,1,第n行第m列对应数组元素an,m。二维数组元素的引用二维数组元素的引用二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元素的引用必须给出二个下标。引用的格式

29、为:下标1,下标2说明:显然,每个下标表达式的类型应与对应的下标类型一致,且取值不超出下标类型所指定的范围,否则会导致致命的越界错误。例如,设有定义:a:array1.3,1.5ofinteger;则表示a是二维数组(相当于一个3*5的表格),共有3*5=15个元素,它们是:a1,1a1,2a1,3a1,4a1,5a2,1a2,2a2,3a2,4a2,5a3,1a3,2a3,3a3,4a3,5因此可以看成一个矩阵(表格),a3,4即表示第3行、第4列的元素。对于整个二维数组的元素引用时,采用二重循环来实现。如:给如上定义二维数组a都赋值为1,表达如下:fori:=1to3doforj:=1to

30、5doai,j:=1;对二维数组的输入与输出也同样可用二重循环来实现:fori:=1to3doforj:=1to5doread(ai,j);fori:=1to3dobeginforj:=1to5dowrite(ai,j:5);writeln;end;说明:说明:当定义的数组下标有多个时,我们称为多维数组,下标的个数并不局限在一个或二个,可以任意多个,如定义一个三维数组a和四维数组b:a:array1.100,1.3,1.5ofinteger;b:array1.100,1.100,1.3,1.5ofinteger;多维的数组引用赋值等操作与二维数组类似。二维数组程序设计二维数组程序设计例例5.9

31、 设有一程序设有一程序programex5_9;constn=3;vara:array1.n,1.nofinteger;i,j:1.n;beginfori:=1tondobeginforj:=1tondoread(ai,j);readln;end;fori:=1tondobeginforj:=1tondowrite(aj,i:5);writeln;end;end.且运行程序时的输入为:213331121则程序的输出应是:231132311例例5.10 已知一个已知一个6*6的矩阵(方阵),把矩阵二条对角线上的的矩阵(方阵),把矩阵二条对角线上的元素值加上元素值加上10,然后输出这个新矩阵。,然

32、后输出这个新矩阵。【分析分析】矩阵即表格,是一个二维数组,有6行6列共36个元素,每个矩阵都有二条对角线,本题难点在于对角线的元素怎么确定。Programex5_10;vara:array1.6,1.6ofinteger;i,j:integer;beginfori:=1to6do/输入矩阵元素forj:=1to6doread(ai,j);fori:=1to6do/更改对角线上元素的值forj:=1to6doif(i=j)or(i+j=7)thenai,j:=ai,j+10;/寻找对角线的特征fori:=1to6do/输出6行6列的矩阵元素beginforj:=1to6dowrite(ai,j:

33、5);writeln;end;end.例例5.11 大部分元素是大部分元素是0的矩阵称为稀疏矩阵,假设有的矩阵称为稀疏矩阵,假设有k个非元素,则可把稀疏个非元素,则可把稀疏矩阵用矩阵用K*3的矩阵简记之,其中第一列是行号,第二列是列号,第三列是该行、的矩阵简记之,其中第一列是行号,第二列是列号,第三列是该行、该列下的非元素的值。如:该列下的非元素的值。如:0 0 0 5 写简记成:写简记成:1 4 5 /第第1行第行第4列有个数是列有个数是50 2 0 0 2 2 2 /第第2行第行第2列有个数是列有个数是20 1 0 0 3 2 1 /第第3行第行第2列有个数是列有个数是1试编程读入一稀疏矩

34、阵,转换成简记形式,并输出。试编程读入一稀疏矩阵,转换成简记形式,并输出。【分析分析】本题中需要解决的主要问题是查找非零元素并记忆位置。将原始矩阵存于数组a。转换后的矩阵存于数组b,当然b数组的行数可以控制在一个小范围内。programex5_11;constn=3;m=5;vara:array1.n,1.mofinteger;b:array1.100,1.3ofinteger;i,j,k:integer;beginfori:=1tondo/矩阵初始forj:=1tomdoread(ai,j);k:=0;fori:=1tondoforj:=1tomdoifai,j0then/找到非零值,存储b

35、egink:=k+1;bk,1:=i;bk,2:=j;bk,3:=ai,j;end;fori:=1tokdo/输出beginforj:=1to3dowrite(bi,j:3);writeln;end;end.例例5.12 打印杨辉三角形的前10行。杨辉三角形如下图:111111121121133113311464114641图6-3图6-4【分析分析】观察图6-3,大家不容易找到规律,但是如果将它转化为图6-4,不难发现杨辉三角形其实就是一个二维表的小三角形部分,假设通过二维数组yh存储,每行首尾元素为1,且其中任意一个非首位元素yhi,j的值其实就是yhi-1,j-1与yhi-1,j的和,另

36、外每一行的元素个数刚好等于行数。有了数组元素的值,要打印杨辉三角形,只需要控制好输出其始位置就行了。程序如下:程序如下:program ex5_12;var a:array1.10,1.10 of integer;i,j:integer;begin a1,1:=1;/设定第一行的值设定第一行的值 for i:=2 to 10 do /从第二行开始推从第二行开始推 begin ai,1:=1;ai,i:=1;/设定每一行的首尾值为设定每一行的首尾值为1 for j:=2 to i-1 do /当前行非首尾的数当前行非首尾的数 ai,j:=ai-1,j-1+ai-1,j;/每个数等于上一行的二个数

37、之和每个数等于上一行的二个数之和 end;for i:=1 to 10 do begin if i10 then write(:30-3*i);/控制每行的起始位置,即空格数量控制每行的起始位置,即空格数量 for j:=1 to i do write(ai,j:6);writeln;end;end.例例5.13 输入一串字符输入一串字符,字符个数不超过字符个数不超过100,且以且以“.”结束。结束。判断判断它们是否构成回文。它们是否构成回文。【分析分析】所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。先读入要判断的一串字符(放入数组letter中),并记

38、住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。程序如下:程序如下:programex5_13;varletter:array1.100ofchar;i,j:0.100;ch:char;begin/读入一个字符串以.号结束write(Inputastring:);i:=0;read(ch);whilech.dobegini:=i+1;letteri:=ch;read(ch)end;j:=1;/判断它是否是回文while(j=ithenwriteln(Yes.)elsewriteln(No.);end.【上机练习上机练习5.2】1、输入一个33二维数组,找出其中最小

39、的数,输出它的值以及所在行号和列号。2、输入4行4列数组,将第2行与第3行元素对调。3、输入44方阵,分别求两条对角线上元素之和。4、矩阵的转置:A:B:123转置为1471045625811789369121011125、给一维数组输入M个整数,假设M=6,数组元素分别为748915,要求建立一个如下数组(矩阵):7489154891578915749157481574895748916、建立如下矩阵:2345345645675678注意:一般情况下,给二维数组赋初值,都是找AI,J与I和J的函数关系,对于任意的AI,J=I+J。7、设数组a是有n个元素的整数数组,从中找出最大和子序列。8、

40、打印杨辉三角形的前10行。第三节第三节 字符数组和字符串类型字符数组和字符串类型无论数组的下标有几个,类型如何,但数组中全体元素的类型必须相同。数组元素的类型可以是任何类型,当它是字符型时,我们称它为字符数组。由于字符数组与字符串类型的应用是计算机非数值处理的重要方面之一,所以我们把它们两个放在一起进行讨论。下面我们举例说明字符数组的应用。字符类型字符类型字符类型为由一个字符组成的字符常量或字符变量。字符常量定义:const字符常量=字符字符变量定义:Var字符变量:char;字符类型是一个有序类型,字符的大小顺序按其ASC代码的大小而定。函数succ、pred、ord适用于字符类型。例如:后

41、继函数:succ(a)=b前继函数:pred(B)=A序号函数:ord(A)=65例例5.14 按字母表顺序和逆序每隔一个字母打印。即打按字母表顺序和逆序每隔一个字母打印。即打印出印出:a c e g I k m o q s u w yz x r v t p n l j h f d b【分析分析】程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型变量作为循环变量,使程序处理起来比较直观。程序如下程序如下:programex5_14;varletter:char;beginforletter:=atozdoif(ord(letter)-ord(a)mod2=0thenwrite(let

42、ter:3);writeln;forletter:=zdowntoadoif(ord(letter)-ord(z)mod2=0thenwrite(letter:3);writeln;end.字符串类型字符串类型 字符串是由字符组成的有穷序列,pascal提供string和ansistring二种字符串类型,二者只是在字符串的长度上有区别,string类型长度在255以内,超出255长度的部分被忽略,而ansistring类型没有长度限制(其实可存储2G的内容,所以看作长度无限制)。字符串类型定义:var字符串变量:stringn;其中:n是定义的字符串长度,必须是0255之间的自然整数,第0号

43、单元中存放串的实际长度,程序运行时由系统自动提供,第1n号单元中存放串的字符。若将stringn写成string,则默认n值为255。例如:VARname:string8;screenline:string;FreePascal中,一个字符串中的字符可以通过其对应的下标灵活使用。例如:varname:string;beginreadln(name);fori:=1toord(name0)dowriteln(namei);/输出name串中的第i个字符end.语句writeln(namei)输出name串中第i个字符。例例5.15 求输入英文句子单词的平均长度。求输入英文句子单词的平均长度。【分

44、析分析】程序中,变量s用于存句子中英文字母的总数,变量count用于存放句子中单词的个数,chj表示ch串中的第j个位置上的字符,ord(ch0)为ch串的串长度。程序充分利用FreePascal允许直接通过字符串下标得到串中的字符这一特点,使程序比较简捷。programex5_15;varch:string;/定义ch为字符串类s,count,j:integer;beginwrite(Thesentenceis:);readln(ch);/读入整行内容s:=0;count:=0j:=0;repeatinc(j);ifnot(chjin:,;,!,?,.,)theninc(s);/这是集合的表

45、式ifchjin,.,!,?theninc(count);until(j=ord(ch0)or(chjin.,!,?);ifchj.thenwriteln(Itisnotasentence.)elsewriteln(Averagelengthis,s/count:10:4);/结果保留二位小数end.字符串的操作字符串的操作由字符串的常量、变量和运算符组成的表达式称为字符串表达式。字符串运算符包括:1+:连接运算符:连接运算符例如:Free+PASCAL的结果是FreePASCAL。若连接的结果字符串长度超过255,则被截成255个字符。若连接后的字符串存放在定义的字符串变量中,当其长度超过定

46、义的字符串长度时,超过部份字符串被截断。例如:varstr1,str2,str3:string8;beginstr1:=Free;str2:=PASCAL;str3:=str1+str2;end则str3的值为:FreePA。2=、=、=:关系运算符:关系运算符两个字符串的比较规则为,从左到右按照ASC码值逐个比较,遇到ASC码不等时,规定ASC码值大的字符所在的字符串为大。例如:ABAC结果为真;122结果为真;PASCAL=PASCAL结果为假;例例5.16 对给定的对给定的10个国家名,按其字母的顺序输出。个国家名,按其字母的顺序输出。【分析分析】程序中,当执行到ifcnamekcnam

47、ej时,自动将cnamek串与cnamej串中的每一个字符逐个比较,直至遇到不等而决定其大小。这种比较方式是计算机中字符串比较的一般方式。程序如下:程序如下:proramex5_16;vari,j,k:integer;t:string20;cname:array1.10ofstring20;beginfori:=1to10doreadln(cnamei);fori:=1to9do/选择排序begink:=i;forj:=i+1to10doifcnamekcnamejthenk:=j;t:=cnamei;cnamei:=cnamek;cnamek:=t;end;fori:=1to10dowrit

48、eln(cnamei);end.字符串的函数和过程字符串的函数和过程FreePascal提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。函数和过程名功 能 说 明copy(s,m,n)取s中第m个字符开始的n个字符若m大于s的长度,则返回空串;否则,若m+n大于s的长度,则截断 length(s)求s的动态的长度返回值为整数pos(sub,s)在s中找子串sub返回值为sub在s中的位置,为byte型insert(sour,s,m)在s的第m个字符位置处插入子串sour若返回串超过255,则截断delete(s,m,n)删除s中第m个字符开

49、始的n个字符串若m大于s的长度,则不删除;否则,若m+n大于s的长度,则删除到结尾str(x:w:d,s)将整数或实数x转换成字符串sw 和 d是整型表达式,意义同带字宽的write语句val(s,x,code)将字符串S 转换成整数或实数x 若S中有非法字符,则code存放非法字符在S中的下标;否则,code为零。code为整型upcase(ch)将字母ch转换成大写字母若ch不为小写字母,则不转换例例5.17正确的邮箱地址格式是“用户名服务器名”,输入一个邮箱地址判断它是不是合法的邮箱地址。【分析】此题的题意很简单,在判断邮箱地址合法性上需要考虑:1邮箱地址字符串中是否包括字符“”;2字符

50、不能出现在第一个位置也不能出现字符的末尾。程序如下:程序如下:Programex5_17;varp:integer;s:string;beginreadln(s);p:=pos(,s);if(p1)and(plength(s)thenwriteln(ok)elsewriteln(error);end.例例5.18 对输入的一句子实现查找且置换的功能。对输入的一句子实现查找且置换的功能。【分析分析】程序中,输入要查找的字符串及要置换的字符串,充分用上了字符串处理的标准过程delete、insert及标准函数pos。程序如下:程序如下:Programex5_18;vars1,s,o:string;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁