第5章-数组-课件_第1页
第5章-数组-课件_第2页
第5章-数组-课件_第3页
第5章-数组-课件_第4页
第5章-数组-课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

第五章数组

第一节一维数组第二节二维数组第三节字符数组和字符串类型第一节一维数组

为什么要使用数组通过前面几章的学习,我们已经可以编写程序来解决各种相当复杂的问题了,但是当需要处理的数据比较多时,仅依靠前面的知识是不够的,即使简单的问题也可能需要比较复杂的程序来处理。请看下面的例子:例题输入50个学生的某门课程的成绩,打印出低于平均分的学生序号与成绩。

【分析】在解决这个问题时,虽然可以通过一个变量来累加读入的50个成绩求出学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数后才能求得平均分,并且要求打印出低于平均分的学生序号和成绩,故必须把50个学生的成绩都保留起来,然后逐个和平均分比较,把低于平均分的成绩打印出来。如果,用简单变量a1,a2,…,a50存储这些数据,要用50个变量保存输入的数据,程序片断如下:

readln(a1,a2…,a10);…readln(a41,a42,…,a50)

注意,如果真正要像上面这样编写程序,则上面的所有省略号必须用完整的语句写出来。可以看出,这样的程序是多么繁琐。如果说处理的数据规模达到成千上万,上面的例子单单读入就会异常复杂,电脑的特点没有得到体现。从以上的讨论可以看出,如果只使用简单变量处理大量数据,就必须使用大量只能单独处理的变量,即使是简单问题也需要编写冗长的程序。选手们可能已经看出,我们需要把一大批具有相同性质的数据组合成一个新类型的变量,可以用简单的程序(比如循环50次)对这个新变量的各个分量进行相同的处理,每个分量仍然保留单个变量的所有性质(在上面的例子中,各分量是整型变量或实型变量的性质)。如果能象数学中使用下标变量ai形式表示这50个数,则问题就容易实现。在Pascal语言中,具有下标性质的数据类型是数组。如果使用数组,上面的问题就变得十分简单、清晰。例如,读入50个学生的成绩,只需写如下语句即可:

fori:=1to50do readln(a[i]);在这里引用了带下标的变量(分量变量称为数组元素)a[i]来代替a1,a2…,a50,方括号中的i称为下标,当循环变量i=1时a[i]就是a[1];当i=2时a[i]就是a[2]……;当i=50时a[i]就是a[50]。输入的时候,让i从1变化到50,循环体内输入语句中的a[i]也就分别代表了a1,a2…,a50这50个带下标的变量。这样上述问题的程序可写为:tot:=0; //tot存储50个学生的总分fori:=1to50do //循环读入每一个学生的成绩,并把它累加到总分中begin

read(a[i]);

tot:=tot+a[i];end;ave:=tot/50; //计算平均分fori:=1to50do

ifa[i]<avethenwriteln('No.',i,'',a[i]);//如果第i个同学成绩小于平均分,则将输出这个学生的序号和成绩。要在程序中使用下标变量,必须先说明这些下标变量的整体―数组,即数组是若干个同名(如上面的下标变量的名字都为a)下标变量的集合,这些变量的类型全部一致。

一维数组

当数组中每个元素只带有一个下标时,我们称这样的数组为一维数组。一维数组的定义

(1)类型定义类型定义一般格式为:

type

<标识符>=<类型>;其中type是Pascal保留字,表示开始一个类型定义段。在其后可以定义若干个自定义的数据类型。<标识符>是为定义的类型取的名字,称它为类型标识符。类型定义后,也就确定了该类型数据取值的范围,以及数据所能执行的运算。和Pascal提供的标准类型如integer、real等没什么区别。

(2)一维数组类型的定义一维数组类型的一般格式:var数组名:array[下标1..下标2]of<基类型>;对于上例:

a:array[1..50]ofinteger;说明:其中array和of是Pascal保留字。下标1和下标2是同一顺序类型,且下标2的序号大于下标1的序号。它给出了数组中每个元素(下标变量)允许使用的下标类型,也决定了数组中元素的个数。基类型是指数组元素的类型,它可以是任何类型,同一个数组中的元素全部具有相同类型。因此我们可以说,数组是由固定数量的相同类型的元素组成的。

再次提醒注意:类型和变量是两个不同概念,不能混淆。就数组而言,程序的执行部分使用的不是数组类型而是数组变量。数组的另一种定义形式,先定义数组的类型标识符,再定义数组,如:

typearray1=array[1..8]ofinteger;

vara1,a2:array1;其中array1为一个类型标识符,表示一个下标值从1到8,数组元素类型为整型的一维数组;而a1,a2则是这种类型的数组变量,代表二个数组。我们平时更多的是将二者全并起来,直接定义:

vara1,a2:array[1..8]ofinteger;当在说明部分定义了一个数组变量之后,Pascal编译程序为所定义的数组在内存空间开辟一串连续的存储单元。例如:vara:array[1..10]ofinteger;以下表示a数组在内存的存储如表所示:a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[10]

a数组共有10个元素组成,在内存中10个数组元素共占10个连续的存储单元。a数组最小下标为1,最大下标10。按定义a数组所有元素都是整型变量。一维数组元素的赋值操作

数组元素的引用形式为:数组名[下标表达式]。数组一经定义后,数组元素就具有简单变量一样的性质,使用时必须写出下标。对于一维数组变量的赋值有两种形式:一是对各数组元素赋值,二是对数组所有元素整体赋值。例如:设有下列变量定义

var a1,a2:array[1..20]ofinteger; i:integer;执行下列语句:

fori:=1to20do a1[i]:=1; //数组元素赋值

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

a[i]:=x;一般用FOR循环做。如:

Fori:=1to7doread(a[i]);一维数组元素的输出不能整个数组一起输出,只能逐个元素输出

Write(a[i]);一般用FOR循环做。如:

Fori:=1to7dowrite(a[i]);例5.1

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

readln;//读入时起换行作用

fori:=10downto1do//逆序输出这10个数

write(a[i]:10);end.例5.2

输入一串字符,以'?'结束,统计其中每个字母出现的次数。【分析】

为了简单起见,只考虑每个小写字母出现的次数。为记录每个字母出现的次数,定义一个由26个元素组成的数组,下标类型是字符,元素类型为整型。如:num:array['a'..'z']ofinteger;

用num['a']记录字母a出现的次数,用num['b']记录字母b出现的次数,……

开始应将num的每个元素置成0,其实所有变量的初始值都为0。当读入的字符不是'?'时,应判断它是否为字母,若是则应将相应字母计数加1。此时需判断哪个字母,只要将读入的字母作为下标,就可以找出相应的数组元素,将它加1即可。若读入的字符是'?'则结束循环,最后输出统计结果。程序如下:Programex5_2;varnum:array['a'..'z']ofinteger;ch:char;beginforch:='a'to'z'do //等价于fillchar(num,sizeof(num),0);num[ch]:=0; read(ch);whilech<>'?'dobeginif(ch>='a')and(ch<='z')then//判断是否为小写字母

num[ch]:=num[ch]+1;read(ch);end;readln; //换行和暂停

forch:='a'to'z'doifnum[ch]<>0thenwrtieln(ch,'',num[ch]);end.运行结果cabc*&^8796abcaa?a 4b 2c 3例5.3

将a数组中第一个元素移到最后数组末尾,其余数据依次往前平移一个位置。【分析】为完成题目所要求的操作,其算法应该包括以下几个主要步骤:①把第一个元素的值取出放在一个临时单元temp中;②通过a[2]→a[1],a[3]→a[2],a[4]→a[3],……,a[n]→a[n-1],实现其余元素前移③将temp值送入a[n].Programex5_3;constn=10;vara:array[1..n]ofinteger;i:integer;temp:integer;beginwriteln(‘read',n,'datas');fori:=1tondoread(a[i]);temp:=a[1];fori:=1ton-1doa[i]:=a[i+1];a[n]:=temp;writeln(‘Result:');fori:=1tondowrite(a[i]:3);end.运行结果:read10datas:•

12345678910Result:•

23456789101例5.4

宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第100个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)【分析】此题较简单,只要设置一个表示门是开的还是关的标志数组,只有二种状态采用布尔型更直观。由于有固定的循环次数,用for循环显得简练。程序如下:Programex5_4;constn=100;vara:array[1..n]ofBoolean;i,j,k:integer;beginfori:=1tondoa[i]:=true; //可用fillchar(a,sizeof(a),true)代替

fori:=2tondoforj:=1tondoifjmodi=0thena[j]:=not(a[j]);forj:=1tondoifa[j]=truethenwrite(j:5); //可写成:ifa[j]thenwrite(j:5);readlnend.运行结果:1

491625364981100例5.5

约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。N,M由键盘输入。【分析】

(1)由于对于每个人只有出圈和没有圈两种状态,因此可以用布尔型标志数组存储游戏过程中每个人的状态。不妨用TRUE表示出圈,FALSE表示没有圈。(2)开始的时候,给标志数组赋初值为FALSE,即全部在圈内。(3)模拟报数游戏的过程,直到所有的人出圈为止。程序如下:Programex5_5;varn,m,s,f,t:integer;a:array[1..100]ofboolean; //根据题意开出数组大小begin

readln(n,m); //共n人,报到m出圈

fort:=1tondo

a[t]:=false;f:=0;t:=0;s:=0; //刚开始所有变量默认值也是0repeatt:=t+1; //逐个枚举圈中的所有位置

ift=n+1thent:=1; //数组模拟环状,最后一个与第一个相连

ifa[t]=falsethens:=s+1; //第t个位置上有人则报数

ifs=mthen //当前报的数是mbegins:=0; //计数器清零

write(t,′′); //输出出圈人的编号

a[t]:=true; //此处的人已出圈,设置为空

f:=f+1; //出圈的人数增加一个

end;untilf=n; //直到所有的人都出圈为止end.运行结果:输入:85

输出:52871463例5.6

输入十个正整数,把这十个数按由大到小的顺序排列。(选择排序)将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序是一种较简单的方法。【分析】

要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,……。因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数(最大的泡往上冒)。同理,第二步,将第二个数与其后各个数再依次比较,又可得出次大的数。如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次大的数。于是十个数的顺序排列结束。如对5个进行排序,这个五个数分别为8

2

9

10

5。按选择排序方法,过程如下:初始数据:8

2

9

10

5第一次排序:8

2

9

10

5

9

2

8

10

5

10

2

8

9

5

10

2

8

9

5第二次排序:10

8

2

9

5

10

9

2

8

5

10

9

2

8

5第三次排序:10

9

8

2

5

10

9

8

2

5第四次排序:10

9

8

5

2对于十个数,则排序要进行9次。程序如下:programex5_6;vara:array[1..10]ofinteger;

i,j,t:integer;begin

writeln('Input10integers:');fori:=1to10doread(a[i]);//读入10个初始数据

readln;fori:=1to9do//进行9次排序

beginforj:=i+1to10do//将第i个数与其后所有数比较

ifa[i]<a[j]then//若有比a[i]大,则与之交换

begint:=a[i];a[i]:=a[j];a[j]:=t;endend;fori:=1to10dowrite(a[i]:5);end.运行结果:输入:867521897455892341输出:589234152546774189例5.7

编程输入十个正整数,然后自动按从大到小的顺序输出。(冒泡排序)【分析】①用循环把十个数输入到A数组中;②从A[1]到A[10],相邻的两个数两两相比较,即:

A[1]与A[2]比,A[2]与A[3]比,……A[9]与A[10]比。只需知道两个数中的前面那元素的标号,就能进行与后一个序号元素(相邻数)比较,可写成通用形式A[i]与A[i+1]比较,那么,比较的次数又可用1~(n-i)循环进行控制(即循环次数与两两相比较时前面那个元素序号有关);③在每次的比较中,若较大的数在后面,就把前后两个对换,把较大的数调到前面,否则不需调换位置。下面例举5个数来说明两两相比较和交换位置的具体情形:

564375和6比较,交换位置,排成下行的顺序;

654375和4比较,不交换,维持同样的顺序;

654374和3比较,不交换,顺序不变

654373和7比较,交换位置,排成下行的顺序;

65473经过(1~(5-1))次比较后,将3调到了末尾。经过第一轮的1~(N-1)次比较,就能把十个数中的最小数调到最末尾位置,第二轮比较1~(N-2)次进行同样处理,又把这一轮所比较的“最小数”调到所比较范围的“最末尾”位置;……;每进行一轮两两比较后,其下一轮的比较范围就减少一个。最后一轮仅有一次比较。在比较过程中,每次都有一个“最小数”往下“掉”,用这种方法排列顺序,常被称之为“冒泡法”排序。程序如下:Programex5_7;constN=10;vara:array[1..N]ofinteger;//定义数组

i,j,t:integer;beginfori:=1toNdoReadln(a[i])//输入十个数

forj:=1toN-1do//冒泡法排序

fori:=1toN-jdo //两两相比较

ifa[i]<a[i+1]then//比较与交换

begint:=a[i];a[i]:=a[i+1];a[i+1]:=t;end;fori:=1toNdo//输出排序后的十个数

write(a[i]:6);readlnend.运行结果: 输入:2586123465221655

输出:2568121622345565例5.8

用筛法求出100以内的全部素数,并按每行五个数显示。【分析】⑴把2到100的自然数放入a[2]到a[100]中(所放入的数与下标号相同);⑵在数组元素中,以下标为序,按顺序找到未曾找过的最小素数minp,和它的位置p(即下标号);⑶从p+1开始,把凡是能被minp整除的各元素值从a数组中划去(筛掉),也就是给该元素值置0;⑷让p=p+1,重复执行第②、③步骤,直到minp>Trunc(sqrt(N))为止;⑸打印输出a数组中留下来、未被筛掉的各元素值,并按每行五个数显示。用筛法求素数的过程示意如下(图中用下划线作删去标志):①23456789101112131415…9899100//置数②23456789101112131415…9899100//筛去被2整除的数③2345678

9

1011121314

15…98

99

100//筛去被3整除的数

……2345678

9

1011121314

15…98

99

100//筛去被整除的数程序如下:Programex5_8;constN=100;Vara:array[1..n]ofboolean;i,j:integer;Begin

Fillchar(a,sizeof(a),true);a[1]:=False;fori:=2toTrunc(sqrt(N))doifa[I]thenforj:=2toNdivIdo

a[i*j]:=False;t:=0;fori:=2toNdoifa[i]thenBeginwrite(i:5);

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

01123581321..........5、读入n个数,打印其中的最大数及其位置号。6、输入N个整数,找出最大数所在位置,并将它与第一个数对调位置。7、将一个数组中的所有元素倒序存放。【分析】A[1]←→A[N]A[2]←→A[N-1]……A[I]←→A[J]I从1开始,每交换1次,I加1;直到I=NDIV28、有52张朴克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律依此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,并打印出它们的位置。9、围绕着山顶有10个洞,一只狐狸和一只兔子各住一个洞。狐狸总想吃掉兔子。一天兔子对狐狸说:“你想吃我有一个条件,先把洞从1~10编上号,你从10号洞出发,先到1号洞找我;第二次隔1个洞找我,第三次隔2个洞找我,以后依此类推,次数不限。若能找到我,你就可以饱餐一顿。不过在没有找到我以前不能停下来。”狐狸满口答应就开始找了,它从早到晚找了1000次洞,累得昏了过去也没有找到兔子。请问,免子躲在几号洞里?【答案】2,4,7,9第二节二维数组二维数组的定义当一维数组元素的类型也是一维数组时,便构成了“数组的数组”,即二维数组。二维数组定义的一般格式:我们一般这样定义二维数组:数组名:array[下标类型1,下标类型2]of元素类型;说明:其中两个下标类型与一维数组定义一样,可以看成"下界1..上界1"和"下界2..上界2",给出二维数组中每个元素(双下标变量)可以使用下标值的范围。of后面的元素类型就是基类型。如:a:array[1..4,1..10]ofinteger;

可以这样理解:a:array[1..4]ofarr;(arr=array[1..10]ofinteger;) a数组实质上是一个有4行、10列的表格,表格中可储存40个元素。第1行第1列对应a数组的a[1,1],第n行第m列对应数组元素a[n,m]。二维数组元素的引用

二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元素的引用必须给出二个下标。引用的格式为:

<数组名>[下标1,下标2]说明:显然,每个下标表达式的类型应与对应的下标类型一致,且取值不超出下标类型所指定的范围,否则会导致致命的越界错误。例如,设有定义:a:array[1..3,1..5]ofinteger;则表示a是二维数组(相当于一个3*5的表格),共有3*5=15个元素,它们是:

a[1,1]a[1,2]a[1,3]a[1,4]a[1,5]

a[2,1]a[2,2]a[2,3]a[2,4]a[2,5]

a[3,1]a[3,2]a[3,3]a[3,4]a[3,5]因此可以看成一个矩阵(表格),a[3,4]即表示第3行、第4列的元素。对于整个二维数组的元素引用时,采用二重循环来实现。如:给如上定义二维数组a都赋值为1,表达如下:

fori:=1to3do

forj:=1to5do

a[i,j]:=1;对二维数组的输入与输出也同样可用二重循环来实现:

fori:=1to3do

forj:=1to5do

read(a[i,j]);

fori:=1to3do

begin

forj:=1to5do

write(a[i,j]:5);

writeln;

end;说明:当定义的数组下标有多个时,我们称为多维数组,下标的个数并不局限在一个或二个,可以任意多个,如定义一个三维数组a和四维数组b:

a:array[1..100,1..3,1..5]ofinteger; b:array[1..100,1..100,1..3,1..5]ofinteger;

多维的数组引用赋值等操作与二维数组类似。二维数组程序设计

例5.9

设有一程序programex5_9;constn=3;vara:array[1..n,1..n]ofinteger;i,j:1..n;beginfori:=1tondobeginforj:=1tondoread(a[i,j]);readln;end;fori:=1tondobeginforj:=1tondowrite(a[j,i]:5);writeln;end;end.且运行程序时的输入为:2□1□3←┘3□3□1←┘1□2□1←┘则程序的输出应是:2□3□11□3□23□1□1例5.10

已知一个6*6的矩阵(方阵),把矩阵二条对角线上的元素值加上10,然后输出这个新矩阵。【分析】

矩阵即表格,是一个二维数组,有6行6列共36个元素,每个矩阵都有二条对角线,本题难点在于对角线的元素怎么确定。Programex5_10;vara:array[1..6,1..6]ofinteger;i,j:integer;beginfori:=1to6do //输入矩阵元素

forj:=1to6do

read(a[i,j]);fori:=1to6do //更改对角线上元素的值

forj:=1to6doif(i=j)or(i+j=7)thena[i,j]:=a[i,j]+10;//寻找对角线的特征

fori:=1to6do //输出6行6列的矩阵元素

beginforj:=1to6do

write(a[i,j]:5);writeln;end;end.例5.11

大部分元素是0的矩阵称为稀疏矩阵,假设有k个非元素,则可把稀疏矩阵用K*3的矩阵简记之,其中第一列是行号,第二列是列号,第三列是该行、该列下的非元素的值。如:0005写简记成:145//第1行第4列有个数是50200222//第2行第2列有个数是20100321//第3行第2列有个数是1试编程读入一稀疏矩阵,转换成简记形式,并输出。【分析】

本题中需要解决的主要问题是查找非零元素并记忆位置。将原始矩阵存于数组a。转换后的矩阵存于数组b,当然b数组的行数可以控制在一个小范围内。programex5_11;constn=3;m=5;vara:array[1..n,1..m]ofinteger;b:array[1..100,1..3]ofinteger;i,j,k:integer;beginfori:=1tondo//矩阵初始

forj:=1tomdoread(a[i,j]);k:=0;fori:=1tondoforj:=1tomdo

ifa[i,j]<>0then//找到非零值,存储

begink:=k+1;b[k,1]:=i;b[k,2]:=j;b[k,3]:=a[i,j];end;fori:=1tokdo//输出

beginforj:=1to3dowrite(b[i,j]:3);writeln;end;end.例5.12

打印杨辉三角形的前10行。杨辉三角形如下图:

111111121121133113311464114641

[图6-3]

[图6-4]【分析】

观察图6-3,大家不容易找到规律,但是如果将它转化为图6-4,不难发现杨辉三角形其实就是一个二维表的小三角形部分,假设通过二维数组yh存储,每行首尾元素为1,且其中任意一个非首位元素yh[i,j]的值其实就是yh[i-1,j-1]与yh[i-1,j]的和,另外每一行的元素个数刚好等于行数。有了数组元素的值,要打印杨辉三角形,只需要控制好输出其始位置就行了。程序如下:programex5_12;vara:array[1..10,1..10]ofinteger;i,j:integer;begina[1,1]:=1; //设定第一行的值

fori:=2to10do //从第二行开始推

begina[i,1]:=1;a[i,i]:=1; //设定每一行的首尾值为1forj:=2toi-1do //当前行非首尾的数

a[i,j]:=a[i-1,j-1]+a[i-1,j]; //每个数等于上一行的二个数之和

end;fori:=1to10dobeginifi<>10thenwrite('':30-3*i);//控制每行的起始位置,即空格数量

forj:=1toidowrite(a[i,j]:6);writeln;end;end.例5.13

输入一串字符,字符个数不超过100,且以“.”结束。判断它们是否构成回文。【分析】所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。程序如下:programex5_13;varletter:array[1..100]ofchar;i,j:0..100;ch:char;begin//读入一个字符串以'.'号结束

write('Inputastring:');i:=0;read(ch);whilech<>'.'dobegini:=i+1;letter[i]:=ch;read(ch)end;

j:=1;//判断它是否是回文

while(j<i)and(letter[j]=letter[i])dobegini:=i-1;j:=j+1;end;ifj>=i

thenwriteln('Yes.')elsewriteln('No.');end.【上机练习5.2】1、输入一个3×3二维数组,找出其中最小的数,输出它的值以及所在行号和列号。2、输入4行4列数组,将第2行与第3行元素对调。3、输入4×4方阵,分别求两条对角线上元素之和。4、矩阵的转置:

A:B:123转置为1471045625811789369121011125、给一维数组输入M个整数,假设M=6,数组元素分别为748915,要求建立一个如下数组(矩阵):748915 489157 891574 915748 157489 5748916、建立如下矩阵:2345 3456 4567 5678

注意:一般情况下,给二维数组赋初值,都是找A[I,J]

与I和J的函数关系,对于任意的A[I,J]=I+J。7、设数组a是有n个元素的整数数组,从中找出最大和子序列。8、打印杨辉三角形的前10行。第三节字符数组和字符串类型无论数组的下标有几个,类型如何,但数组中全体元素的类型必须相同。数组元素的类型可以是任何类型,当它是字符型时,我们称它为字符数组。由于字符数组与字符串类型的应用是计算机非数值处理的重要方面之一,所以我们把它们两个放在一起进行讨论。下面我们举例说明字符数组的应用。字符类型

字符类型为由一个字符组成的字符常量或字符变量。字符常量定义:const

字符常量=‘字符’字符变量定义:Var

字符变量:char;字符类型是一个有序类型,字符的大小顺序按其ASCⅡ代码的大小而定。函数succ、pred、ord适用于字符类型。例如:后继函数:succ(‘a’)=‘b’前继函数:pred(‘B’)=‘A’序号函数:ord(‘A’)=65例5.14

按字母表顺序和逆序每隔一个字母打印。即打印出:acegIkmoqsuwyzxrvtpnljhfdb【分析】程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型变量作为循环变量,使程序处理起来比较直观。程序如下:programex5_14;varletter:char;beginforletter:='a'to'z'doif(ord(letter)-ord('a'))mod2=0thenwrite(letter:3);writeln;forletter:='z'downto'a'doif(ord(letter)-ord('z'))mod2=0thenwrite(letter:3);writeln;end.字符串类型字符串是由字符组成的有穷序列,pascal提供string和ansistring二种字符串类型,二者只是在字符串的长度上有区别,string类型长度在255以内,超出255长度的部分被忽略,而ansistring类型没有长度限制(其实可存储2G的内容,所以看作长度无限制)。字符串类型定义:

var

字符串变量:string[n];

其中:n是定义的字符串长度,必须是0~255之间的自然整数,第0号单元中存放串的实际长度,程序运行时由系统自动提供,第1~n号单元中存放串的字符。若将string[n]写成string,则默认n值为255。例如:VARname:string[8];

screenline:string;FreePascal中,一个字符串中的字符可以通过其对应的下标灵活使用。例如:varname:string;

beginreadln(name);

fori:=1toord(name[0])dowriteln(name[i]);

//输出name串中的第i个字符

end.语句writeln(name[i])输出name串中第i个字符。例5.15

求输入英文句子单词的平均长度。【分析】程序中,变量s用于存句子中英文字母的总数,变量count用于存放句子中单词的个数,ch[j]表示ch串中的第j个位置上的字符,ord(ch[0])为ch串的串长度。程序充分利用FreePascal允许直接通过字符串下标得到串中的字符这一特点,使程序比较简捷。programex5_15;varch:string;//定义ch为字符串类

s,count,j:integer;beginwrite('Thesentenceis:');readln(ch);//读入整行内容

s:=0;count:=0j:=0;repeatinc(j);ifnot(ch[j]in[':',',',';','''','!','?','.',''])theninc(s);//[…]这是集合的表式

ifch[j]in['','.','!','?']theninc(count);until(j=ord(ch[0]))or(ch[j]in['.','!','?']);ifch[j]<>'.'thenwriteln('Itisnotasentence.')elsewriteln('Averagelengthis',s/count:10:4);//结果保留二位小数end.字符串的操作

由字符串的常量、变量和运算符组成的表达式称为字符串表达式。字符串运算符包括:1.+:连接运算符例如:‘Free’+‘PASCAL’的结果是‘FreePASCAL’。若连接的结果字符串长度超过255,则被截成255个字符。若连接后的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。例如:varstr1,str2,str3:string[8];

beginstr1:=‘Free’;

str2:=‘PASCAL’;

str3:=str1+str2;

end.则str3的值为:‘FreePA’。2.=、〈〉、〈、〈=、〉、〉=:关系运算符两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。例如:‘AB’〈‘AC’结果为真;‘12’〈‘2’结果为真;‘PASCAL’=‘PASCAL’结果为假;例5.16

对给定的10个国家名,按其字母的顺序输出。【分析】程序中,当执行到ifcname[k]>cname[j]时,自动将cname[k]串与cname[j]串中的每一个字符逐个比较,直至遇到不等而决定其大小。这种比较方式是计算机中字符串比较的一般方式。程序如下:proramex5_16;

温馨提示

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

评论

0/150

提交评论