pascal第5章数组.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《pascal第5章数组.ppt》由会员分享,可在线阅读,更多相关《pascal第5章数组.ppt(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pascal第5章 数组 pascal
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内