《pascal数组》ppt课件

上传人:tian****1990 文档编号:75329140 上传时间:2019-01-30 格式:PPT 页数:49 大小:453.81KB
返回 下载 相关 举报
《pascal数组》ppt课件_第1页
第1页 / 共49页
《pascal数组》ppt课件_第2页
第2页 / 共49页
《pascal数组》ppt课件_第3页
第3页 / 共49页
《pascal数组》ppt课件_第4页
第4页 / 共49页
《pascal数组》ppt课件_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《《pascal数组》ppt课件》由会员分享,可在线阅读,更多相关《《pascal数组》ppt课件(49页珍藏版)》请在金锄头文库上搜索。

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

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

3、有相同性质的数据组合成一个新类型的变量,可以用简单的程序(比如循环50次)对这个新变量的各个分量进行相同的处理,每个分量仍然保留单个变量的所有性质(在上面的例子中,各分量是整型变量或实型变量的性质)。 如果能象数学中使用下标变量ai形式表示这50个数,则问题就容易实现。在Pascal语言中,具有下标性质的数据类型是数组。如果使用数组,上面的问题就变得十分简单、清晰。例如,读入50个学生的成绩,只需写如下语句即可: for i := 1 to 50 do readln(ai);,在这里引用了带下标的变量(分量变量称为数组元素)ai来代替a1,a2,a50,方括号中的i称为下标,当循环变量i=1时

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

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

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

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

8、ger; 以下表示a数组在内存的存储如表所示:,a数组共有10个元素组成,在内存中10个数组元素共占10个连续的存储单元。a数组最小下标为1,最大下标10。按定义a数组所有元素都是整型变量。,一维数组元素的赋值操作,数组元素的引用形式为:数组名下标表达式。 数组一经定义后, 数组元素就具有简单变量一样的性质,使用时必须写出下标。 对于一维数组变量的赋值有两种形式:一是对各数组元素赋值,二是对数组所有元素整体赋值。 例如:设有下列变量定义 var a1, a2 : array120 of integer; i : integer; 执行下列语句: for i := 1 to 20 do a1i

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

10、,只能逐个元素输出 Write(a i); 一般用FOR循环做。如: For i := 1 to 7 do write(ai);,例5.1 输入10个数,要求程序按输入时的逆序把这10个数打印出来。也就是说,按输入相反顺序打印这10个数。 【分析】我们可定义一个数组a用以存放输入的50个数, 然后将数组a中的内容逆序输出。 program ex5_1; type arr=array110of integer; /说明一数组类型arr var a:arr;i:integer; begin writeln(Enter 10 integer:); for i:=1 to 10 do read(ai)

11、; /从键盘上输入10个整数 readln; /读入时起换行作用 for i:=10 downto 1 do /逆序输出这10个数 write(ai:10); end.,例5.2 输入一串字符,以?结束,统计其中每个字母出现的次数。 【分析】 为了简单起见,只考虑每个小写字母出现的次数。为记录每个字母出现的次数,定义一个由26个元素组成的数组,下标类型是字符,元素类型为整型。 如:num : arrayaz of integer; 用numa记录字母a出现的次数,用numb记录字母b出现的次数, 开始应将num的每个元素置成0,其实所有变量的初始值都为0。 当读入的字符不是?时,应判断它是否为

12、字母,若是则应将相应字母计数加1。此时需判断哪个字母,只要将读入的字母作为下标,就可以找出相应的数组元素,将它加1即可。若读入的字符是?则结束循环,最后输出统计结果。,程序如下: Program ex5_2; var num : arrayaz of integer; ch : char; begin for ch := a to z do /等价于fillchar(num,sizeof(num),0); numch := 0; read(ch); while ch? do begin if (ch=a) and (ch0 then wrtieln(ch, ,numch); end.,运行结果

13、 cabc*&8796abcaa? a 4 b 2 c 3,例5.3 将a数组中第一个元素移到最后数组末尾,其余数据依次往前平移一个位置。 【分析】 为完成题目所要求的操作,其算法应该包括以下几个主要步骤: 把第一个元素的值取出放在一个临时单元 temp中; 通过 a2a1, a3a2, a4a3, anan-1,实现其余元素前移 将 temp值送入an. Program ex5_3; const n=10; var a:array1n of integer; i:integer; temp:integer; begin writeln(read,n,datas); for i:=1 to n

14、 do read(ai); temp:=a1; for i:=1 to n-1 do ai:=ai+1; an:=temp; writeln(Result:); for i:=1 to n do write(ai:3); end.,运行结果 : read 10 datas: 1 2 3 4 5 6 7 8 9 10 Result: 2 3 4 5 6 7 8 9 10 1,例5.4 宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”,以后每个服务员都是如此。当第10

15、0个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。) 【分析】此题较简单,只要设置一个表示门是开的还是关的标志数组,只有二种状态采用布尔型更直观。由于有固定的循环次数,用for循环显得简练。 程序如下: Program ex5_4; const n=100; var a : array1nof Boolean; i,j,k : integer; begin for i : =1 to n do ai : =true; /可用fillchar(a,sizeof(a),true)代替 for i : =2 to n do for j : =1 to n do if j mod i =0 then aj : = not(aj); for j : =1 to n do if aj=true then write(j : 5); /可写成: if aj then write(j : 5); readln end. 运行结果: 1 4 9 16 25 36 49 81 100,例5.5 约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;输出依次出圈的人的编号。N,

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号