《pascal数组》PPT课件.ppt_第1页
《pascal数组》PPT课件.ppt_第2页
《pascal数组》PPT课件.ppt_第3页
《pascal数组》PPT课件.ppt_第4页
《pascal数组》PPT课件.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

第五章数组,第一节一维数组第二节二维数组第三节字符数组和字符串类型,第一节一维数组,为什么要使用数组,通过前面几章的学习,我们已经可以编写程序来解决各种相当复杂的问题了,但是当需要处理的数据比较多时,仅依靠前面的知识是不够的,即使简单的问题也可能需要比较复杂的程序来处理。请看下面的例子:例题输入50个学生的某门课程的成绩,打印出低于平均分的学生序号与成绩。【分析】在解决这个问题时,虽然可以通过一个变量来累加读入的50个成绩求出学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数后才能求得平均分,并且要求打印出低于平均分的学生序号和成绩,故必须把50个学生的成绩都保留起来,然后逐个和平均分比较,把低于平均分的成绩打印出来。如果,用简单变量a1,a2,,a50存储这些数据,要用50个变量保存输入的数据,程序片断如下:readln(a1,a2,a10);readln(a41,a42,a50)注意,如果真正要像上面这样编写程序,则上面的所有省略号必须用完整的语句写出来。可以看出,这样的程序是多么繁琐。如果说处理的数据规模达到成千上万,上面的例子单单读入就会异常复杂,电脑的特点没有得到体现。,从以上的讨论可以看出,如果只使用简单变量处理大量数据,就必须使用大量只能单独处理的变量,即使是简单问题也需要编写冗长的程序。选手们可能已经看出,我们需要把一大批具有相同性质的数据组合成一个新类型的变量,可以用简单的程序(比如循环50次)对这个新变量的各个分量进行相同的处理,每个分量仍然保留单个变量的所有性质(在上面的例子中,各分量是整型变量或实型变量的性质)。如果能象数学中使用下标变量ai形式表示这50个数,则问题就容易实现。在Pascal语言中,具有下标性质的数据类型是数组。如果使用数组,上面的问题就变得十分简单、清晰。例如,读入50个学生的成绩,只需写如下语句即可:fori:=1to50doreadln(ai);,在这里引用了带下标的变量(分量变量称为数组元素)ai来代替a1,a2,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:=1to50doifai=a)and(ch0thenwrtieln(ch,numch);end.,运行结果cabc*constn=10;vara:array1.nofinteger;i:integer;temp:integer;beginwriteln(read,n,datas);fori:=1tondoread(ai);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的倍数的房间作“相反处理”,以后每个服务员都是如此。当第100个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)【分析】此题较简单,只要设置一个表示门是开的还是关的标志数组,只有二种状态采用布尔型更直观。由于有固定的循环次数,用for循环显得简练。程序如下:Programex5_4;constn=100;vara:array1.nofBoolean;i,j,k:integer;beginfori:=1tondoai:=true;/可用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的人出圈;输出依次出圈的人的编号。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;/刚开始所有变量默认值也是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输入十个正整数,把这十个数按由大到小的顺序排列。(选择排序)将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序是一种较简单的方法。【分析】要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,。因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数(最大的泡往上冒)。同理,第二步,将第二个数与其后各个数再依次比较,又可得出次大的数。如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次大的数。于是十个数的顺序排列结束。如对5个进行排序,这个五个数分别为829105。按选择排序方法,过程如下:初始数据:829105第一次排序:829105928105102895102895第二次排序: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个数与其后所有数比较ifaicnamej时,自动将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:=1to10dowriteln(cnamei);end.,字符串的函数和过程,FreePascal提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。,例5.17正确的邮箱地址格式是“用户名服务器名”,输入一个邮箱地址判断它是不是合法的邮箱地址。【分析】此题的题意很简单,在判断邮箱地址合法性上需要考虑:1邮箱地址字符串中是否包括字符“”;2字符不能出现在第一个位置也不能出现字符的末尾。程序如下: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;i:integer;beginreadln(s1);/输入原句readln(s);/输入要查找的内容readln(o);/输入替换的目标内容i:=pos(s,s1);/在s1中查找s,若找不到返回0whilei0dobegindelete(s1,i,length(s);/在s1中从第i位开始删除length(s)个字符insert(o,s1,i);/把o的内容插入s1的第i个位置i:=pos(s,s1);end;writeln(s1);end.,例5.19随机输入一个长度不超过255的字符串,将其倒置后输出。【分析】将字符串读入到字符串变量Letters中,这里用字符串类型来处理,让同学们更好地掌握字符处理的函数和过程。程序如下:Programex5_19;Varletters:string;i,len:integer;ch:char;begi

温馨提示

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

评论

0/150

提交评论