《pascal数组》PPT课件.ppt

上传人:w****2 文档编号:15564422 上传时间:2020-08-21 格式:PPT 页数:49 大小:258.50KB
返回 下载 相关 举报
《pascal数组》PPT课件.ppt_第1页
第1页 / 共49页
《pascal数组》PPT课件.ppt_第2页
第2页 / 共49页
《pascal数组》PPT课件.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
第五章 数组,第一节 一维数组 第二节 二维数组 第三节 字符数组和字符串类型,第一节 一维数组,为什么要使用数组,通过前面几章的学习,我们已经可以编写程序来解决各种相当复杂的问题了,但是当需要处理的数据比较多时,仅依靠前面的知识是不够的,即使简单的问题也可能需要比较复杂的程序来处理。请看下面的例子: 例题 输入50个学生的某门课程的成绩,打印出低于平均分的学生序号与成绩。 【分析】 在解决这个问题时,虽然可以通过一个变量来累加读入的50个成绩求出学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数后才能求得平均分,并且要求打印出低于平均分的学生序号和成绩,故必须把50个学生的成绩都保留起来, 然后逐个和平均分比较,把低于平均分的成绩打印出来。如果,用简单变量a1,a2,,a50存储这些数据,要用50个变量保存输入的数据,程序片断如下: readln(a1,a2,a10); readln(a41,a42,a50) 注意,如果真正要像上面这样编写程序,则上面的所有省略号必须用完整的语句写出来。可以看出,这样的程序是多么繁琐。如果说处理的数据规模达到成千上万,上面的例子单单读入就会异常复杂,电脑的特点没有得到体现。,从以上的讨论可以看出,如果只使用简单变量处理大量数据,就必须使用大量只能单独处理的变量,即使是简单问题也需要编写冗长的程序。 选手们可能已经看出,我们需要把一大批具有相同性质的数据组合成一个新类型的变量,可以用简单的程序(比如循环50次)对这个新变量的各个分量进行相同的处理,每个分量仍然保留单个变量的所有性质(在上面的例子中,各分量是整型变量或实型变量的性质)。 如果能象数学中使用下标变量ai形式表示这50个数,则问题就容易实现。在Pascal语言中,具有下标性质的数据类型是数组。如果使用数组,上面的问题就变得十分简单、清晰。例如,读入50个学生的成绩,只需写如下语句即可: for i := 1 to 50 do readln(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个学生的总分 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个同学成绩小于平均分,则将输出这个学生的序号和成绩。 要在程序中使用下标变量,必须先说明这些下标变量的整体数组,即数组是若干个同名(如上面的下标变量的名字都为a)下标变量的集合,这些变量的类型全部一致。,一维数组,当数组中每个元素只带有一个下标时,我们称这样的数组为一维数组。,一维数组的定义,(1)类型定义 类型定义一般格式为: type =; 其中type是Pascal保留字,表示开始一个类型定义段。在其后可以定义若干个自定义的数据类型。是为定义的类型取的名字, 称它为类型标识符。 类型定义后,也就确定了该类型数据取值的范围,以及数据所能执行的运算。和Pascal提供的标准类型如integer、real等没什么区别。,(2)一维数组类型的定义 一维数组类型的一般格式: var 数组名:array下标1.下标2 of ; 对于上例: a : array 1.50 of integer;,说明:其中array和of是Pascal保留字。下标1和下标2 是同一顺序类型,且下标2的序号大于下标1的序号。它给出了数组中每个元素(下标变量) 允许使用的下标类型,也决定了数组中元素的个数。基类型是指数组元素的类型,它可以是任何类型,同一个数组中的元素全部具有相同类型。因此我们可以说,数组是由固定数量的相同类型的元素组成的。 再次提醒注意:类型和变量是两个不同概念,不能混淆。就数组而言,程序的执行部分使用的不是数组类型而是数组变量。 数组的另一种定义形式,先定义数组的类型标识符,再定义数组,如: type array1 = array1.8of integer; var a1,a2 : array1; 其中array1为一个类型标识符,表示一个下标值从1到 8,数组元素类型为整型的一维数组;而a1,a2则是这种类型的数组变量,代表二个数组。 我们平时更多的是将二者全并起来,直接定义: var a1,a2 : array1.8of integer;,当在说明部分定义了一个数组变量之后,Pascal 编译程序为所定义的数组在内存空间开辟一串连续的存储单元。例如: var a : array 1.10 of integer; 以下表示a数组在内存的存储如表所示:,a数组共有10个元素组成,在内存中10个数组元素共占10个连续的存储单元。a数组最小下标为1,最大下标10。按定义a数组所有元素都是整型变量。,一维数组元素的赋值操作,数组元素的引用形式为:数组名下标表达式。 数组一经定义后, 数组元素就具有简单变量一样的性质,使用时必须写出下标。 对于一维数组变量的赋值有两种形式:一是对各数组元素赋值,二是对数组所有元素整体赋值。 例如:设有下列变量定义 var a1, a2 : array1.20 of integer; i : integer; 执行下列语句: for i := 1 to 20 do a1i := 1; /数组元素赋值 a2 := a1;/两个数组只要结构 (元素个数和类型) 相 同,就可以整体赋值 这个程序片段的功能是将一维整型数组变量a1、a2的所有数组元素都初始化赋值为1,前面的循环语句是逐个赋值,最后一个赋值语句是两个一维数组间的整体赋值,其作用相当于把数组a1中每一个数组元素的值分别赋给数组a2中相应的元素,这要求两个数组具有相同类型和一样的下标范围。,一维数组的引用,一维数组元素的输入 不能整个数组输入,只能逐个元素赋值 ai := x ; 一般用FOR循环做。如: For i := 1 to 7 do read(a i ); 一维数组元素的输出 不能整个数组一起输出,只能逐个元素输出 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=array1.10of integer; /说明一数组类型arr var a:arr;i:integer; begin writeln(Enter 10 integer:); for i:=1 to 10 do read(ai); /从键盘上输入10个整数 readln; /读入时起换行作用 for i:=10 downto 1 do /逆序输出这10个数 write(ai:10); end.,例5.2 输入一串字符,以?结束,统计其中每个字母出现的次数。 【分析】 为了简单起见,只考虑每个小写字母出现的次数。为记录每个字母出现的次数,定义一个由26个元素组成的数组,下标类型是字符,元素类型为整型。 如:num : arraya.z of integer; 用numa记录字母a出现的次数,用numb记录字母b出现的次数, 开始应将num的每个元素置成0,其实所有变量的初始值都为0。 当读入的字符不是?时,应判断它是否为字母,若是则应将相应字母计数加1。此时需判断哪个字母,只要将读入的字母作为下标,就可以找出相应的数组元素,将它加1即可。若读入的字符是?则结束循环,最后输出统计结果。,程序如下: Program ex5_2; var num : arraya.z 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.,运行结果 cabc* const n=10; var a:array1.n of integer; i:integer; temp:integer; begin writeln(read,n,datas); for i:=1 to n 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的倍数的房间作“相反处理”,以后每个服务员都是如此。当第100个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。) 【分析】此题较简单,只要设置一个表示门是开的还是关的标志数组,只有二种状态采用布尔型更直观。由于有固定的循环次数,用for循环显得简练。 程序如下: Program ex5_4; const n=100; var a : array1.nof 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. 运行结果: 14 9 16 25 36 49 81 100,例5.5 约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;输出依次出圈的人的编号。N,M由键盘输入。 【分析】 (1)由于对于每个人只有出圈和没有圈两种状态,因此可以用布尔型标志数组存储游戏过程中每个人的状态。不妨用TRUE表示出圈,FALSE表示没有圈。 (2)开始的时候,给标志数组赋初值为FALSE,即全部在圈内。 (3)模拟报数游戏的过程,直到所有的人出圈为止。,程序如下: Program ex5_5; var n,m,s,f,t : integer; a : array1.100 of boolean; /根据题意开出数组大小 begin readln(n,m);/共n人,报到m出圈 for t := 1 to n do at := false; f := 0; t := 0; s := 0;/刚开始所有变量默认值也是0 repeat t := t+1;/逐个枚举圈中的所有位置 if t=n+1 then t := 1;/数组模拟环状,最后一个与第一个相连 if at=false then s := s+1;/第t个位置上有人则报数 if s=m then/当前报的数是m begin s := 0;/计数器清零 write(t,);/输出出圈人的编号 at := true;/此处的人已出圈,设置为空 f := f+1;/出圈的人数增加一个 end; until f=n;/直到所有的人都出圈为止 end.,运行结果: 输入: 8 5 输出: 5 2 8 7 1 4 6 3,例5.6 输入十个正整数,把这十个数按由大到小的顺序排列。(选择排序 ) 将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序是一种较简单的方法。 【分析】 要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,。因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数(最大的泡往上冒)。同理,第二步,将第二个数与其后各个数再依次比较,又可得出次大的数。如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次大的数。于是十个数的顺序排列结束。 如对5个进行排序,这个五个数分别为829105。按选择排序方法,过程如下: 初始数据:829105 第一次排序:829105 928105 102895 102895 第二次排序:108295 109285 109285 第三次排序:109825 109825 第四次排序:109852 对于十个数,则排序要进行9次。,程序如下: program ex5_6; var a:array1.10of integer; i,j,t:integer; begin writeln(Input 10 integers:); for i:=1 to 10 do read(ai); /读入10个初始数据 readln; for i:=1 to 9 do /进行9次排序 begin for j:=i+1 to 10 do /将第i个数与其后所有数比较 if aiaj then /若有比ai大,则与之交换 begin t:=ai;ai:=aj;aj:=t; end end; for i:=1 to 10 do write(ai:5); end. 运行结果: 输入: 8 67 52 189 74 5 58 9 23 41 输出: 5 8 9 23 41 52 54 67 74 189,例5.7 编程输入十个正整数,然后自动按从大到小的顺序输出。(冒泡排序) 【分析】 用循环把十个数输入到A数组中; 从A1到A10,相邻的两个数两两相比较,即: A1与A2比,A2与A3比,A9与A10比。 只需知道两个数中的前面那元素的标号,就能进行与后一个序号元素(相邻数)比较,可写成通用形式A i 与A i +1比较,那么,比较的次数又可用1( n - i )循环进行控制 (即循环次数与两两相比较时前面那个元素序号有关) ; 在每次的比较中,若较大的数在后面,就把前后两个对换,把较大的数调到前面,否则不需调换位置。 下面例举5个数来说明两两相比较和交换位置的具体情形: 5 6 4 3 7 5和6比较,交换位置,排成下行的顺序; 6 5 4 3 7 5和4比较,不交换,维持同样的顺序; 6 5 4 3 7 4和3比较,不交换,顺序不变 6 5 4 3 7 3和7比较,交换位置,排成下行的顺序; 6 5 4 7 3 经过(1(5-1)次比较后,将3调到了末尾。 经过第一轮的1 (N-1)次比较,就能把十个数中的最小数调到最末尾位置,第二轮比较1 (N-2)次进行同样处理,又把这一轮所比较的“最小数”调到所比较范围的“最末尾”位置;每进行一轮两两比较后,其下一轮的比较范围就减少一个。最后一轮仅有一次比较。在比较过程中,每次都有一个“最小数”往下“掉”,用这种方法排列顺序,常被称之为“冒泡法”排序。,程序如下: Program ex5_7; const N=10; var a: array1.N of integer; /定义数组 i,j,t: integer; begin for i:=1 to N do Readln(a i ) /输入十个数 for j:=1 to N-1 do /冒泡法排序 for i:=1 to N-j do /两两相比较 if a i ai+1 then /比较与交换 begin t:=ai; ai:= ai+1; ai+1:=t; end; for i:=1 to N do /输出排序后的十个数 write(a i :6); readln end. 运行结果: 输入: 2 5 8 6 12 34 65 22 16 55 输出: 2 5 6 8 12 16 22 34 55 65,例5.8 用筛法求出100以内的全部素数,并按每行五个数显示。 【分析】 把2到100的自然数放入a2到a100中(所放入的数与下标号相同); 在数组元素中,以下标为序,按顺序找到未曾找过的最小素数minp,和它的位置p(即下标号); 从p+1开始,把凡是能被minp整除的各元素值从a数组中划去(筛掉),也就是给该元素值置 0; 让p=p+1,重复执行第、步骤,直到minpTrunc(sqrt(N) 为止; 打印输出a数组中留下来、未被筛掉的各元素值,并按每行五个数显示。 用筛法求素数的过程示意如下(图中用下划线作删去标志): 2 3 4 5 6 7 8 9 10 11 12 13 14 1598 99 100 /置数 2 3 4 5 6 7 8 9 10 11 12 13 14 1598 99 100 /筛去被2整除的数 2 3 4 5 6 7 8 9 10 11 12 13 14 1598 99 100 /筛去被3整除的数 2 3 4 5 6 7 8 9 10 11 12 13 14 1598 99 100 /筛去被整除的数,程序如下: Program ex5_8; const N=100; Var a: array1.n of boolean; i,j: integer; Begin Fillchar(a,sizeof(a),true); a1 := False; for i:=2 to Trunc(sqrt(N) do if aI then for j := 2 to N div I do ai*j:= False; t:=0; for i:=2 to N do if ai then Begin write(i:5); inc(t); if t mod 5=0 then writeln end; End.,【上机练习5.1】,1、输入十个正整数,然后把这十个数按由小到大的顺序输出。(选择排序) 2、输入十个正整数,然后把这十个数按由小到大的顺序输出。(冒泡排序) 3、国际象棋盘中,第1格放1粒米,第2格放2粒米,第3格放4粒米,第4格放8粒米,第5格放16粒米,问:16个格子总共可以放多少粒米? 【分析】第i个格子可放多少粒米:2i1 4、输出斐波列契数列的前N项(5个1行) 0 1 1 2 3 5 8 13 21 5、读入n个数,打印其中的最大数及其位置号。 6、输入N个整数,找出最大数所在位置,并将它与第一个数对调位置。 7、将一个数组中的所有元素倒序存放 。 【分析】A1AN A2 AN-1 AI AJ I 从1开始,每交换1次,I 加1;直到 I = N DIV 2 8、有52张朴克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律依此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,并打印出它们的位置。 9、围绕着山顶有10个洞,一只狐狸和一只兔子各住一个洞。狐狸总想吃掉兔子。一天兔子对狐狸说:“你想吃我有一个条件,先把洞从110编上号,你从10号洞出发,先到1号洞找我;第二次隔1个洞找我,第三次隔2个洞找我,以后依此类推,次数不限。若能找到我,你就可以饱餐一顿。不过在没有找到我以前不能停下来。”狐狸满口答应就开始找了,它从早到晚找了1000次洞,累得昏了过去也没有找到兔子。请问,免子躲在几号洞里?【答案】2,4,7,9,第二节 二维数组,二维数组的定义,当一维数组元素的类型也是一维数组时,便构成了“数组的数组”,即二维数组。二维数组定义的一般格式:我们一般这样定义二维数组: 数组名:array下标类型1,下标类型2 of 元素类型; 说明:其中两个下标类型与一维数组定义一样,可以看成下界1.上界1和下界2.上界2,给出二维数组中每个元素( 双下标变量)可以使用下标值的范围。of后面的元素类型就是基类型。 如:a : array1.4,1.10 of integer; 可以这样理解:a : array1.4 of arr; (arr=array1.10 of integer;) a数组实质上是一个有4行、10列的表格,表格中可储存40个元素。第1行第1列对应a数组的a1,1,第n行第m列对应数组元素an,m。,二维数组元素的引用,二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元素的引用必须给出二个下标。 引用的格式为: 下标1,下标2 说明:显然,每个下标表达式的类型应与对应的下标类型一致,且取值不超出下标类型所指定的范围,否则会导致致命的越界错误。 例如,设有定义:a : array1.3,1.5of integer; 则表示a是二维数组(相当于一个3*5的表格),共有3*5=15个元素,它们是: a1,1a1,2a1,3a1,4 a1,5 a2,1a2,2a2,3a2,4 a2,5 a3,1a3,2a3,3a3,4 a3,5 因此可以看成一个矩阵(表格),a3,4即表示第3行、第4列的元素。 对于整个二维数组的元素引用时,采用二重循环来实现。如:给如上定义二维数组a都赋值为1,表达如下: for i := 1 to 3 do for j := 1 to 5 do ai,j := 1;,对二维数组的输入与输出也同样可用二重循环来实现 : for i := 1 to 3 do for j := 1 to 5 do read(ai,j); for i := 1 to 3 do begin for j := 1 to 5 do write(ai,j :5); writeln; end; 说明:当定义的数组下标有多个时,我们称为多维数组,下标的个数并不局限在一个或二个,可以任意多个,如定义一个三维数组a和四维数组b: a : array1.100,1.3,1.5 of integer; b : array1.100,1.100,1.3,1.5 of integer; 多维的数组引用赋值等操作与二维数组类似。,二维数组程序设计,例5.9 设有一程序 program ex5_9; const n=3; var a: array1.n,1.nof integer; i,j:1.n; begin for i:=1 to n do begin for j:=1 to n do read(ai,j); readln; end; for i:=1 to n do begin for j:=1 to n do write(aj,i:5); writeln; end; end.,且运行程序时的输入为: 213 331 121 则程序的输出应是: 231 132 311,例5.10 已知一个6*6的矩阵(方阵),把矩阵二条对角线上的元素值加上10,然后输出这个新矩阵。 【分析】 矩阵即表格,是一个二维数组,有6行6列共36个元素,每个矩阵都有二条对角线,本题难点在于对角线的元素怎么确定。 Program ex5_10; var a : array1.6,1.6of integer; i,j : integer; begin for i := 1 to 6 do /输入矩阵元素 for j := 1 to 6 do read(ai,j); for i := 1 to 6 do /更改对角线上元素的值 for j := 1 to 6 do if (i = j) or (i+j = 7) then ai,j := ai,j+10; /寻找对角线的特征 for i := 1 to 6 do /输出6行6列的矩阵元素 begin for j := 1 to 6 do write(ai,j :5); writeln; end; end.,例5.11 大部分元素是0的矩阵称为稀疏矩阵,假设有k个非元素,则可把稀疏矩阵用K*3的矩阵简记之,其中第一列是行号,第二列是列号,第三列是该行、该列下的非元素的值。如: 0 0 0 5 写简记成: 1 4 5 /第1行第4列有个数是5 0 2 0 0 2 2 2 /第2行第2列有个数是2 0 1 0 0 3 2 1 /第3行第2列有个数是1 试编程读入一稀疏矩阵,转换成简记形式,并输出。 【分析】 本题中需要解决的主要问题是查找非零元素并记忆位置。将原始矩阵存于数组a。转换后的矩阵存于数组b,当然b数组的行数可以控制在一个小范围内。 program ex5_11; const n=3; m=5; var a:array1.n,1.m of integer; b:array1.100,1.3 of integer; i,j,k:integer; begin for i:=1 to n do /矩阵初始 for j:=1 to m do read(ai,j); k:=0; for i:=1 to n do for j:=1 to m do,if ai,j0 then /找到非零值,存储 begin k:=k+1; bk,1:=i; bk,2:=j; bk,3:=ai,j; end; for i:=1 to k do /输出 begin for j:=1 to 3 do write(bi,j:3); writeln; end; end.,例5.12 打印杨辉三角形的前10行。杨辉三角形如下图: 1 1 1 1 1 1 1 2 1 1 2 1 1 3 3 1 1 3 3 1 1 4 6 4 1 1 4 6 4 1 图6-3 图6-4 【分析】 观察图6-3,大家不容易找到规律,但是如果将它转化为图6-4,不难发现杨辉三角形其实就是一个二维表的小三角形部分,假设通过二维数组yh存储,每行首尾元素为1,且其中任意一个非首位元素yhi,j的值其实就是yhi-1,j-1与yhi-1,j的和,另外每一行的元素个数刚好等于行数。有了数组元素的值,要打印杨辉三角形,只需要控制好输出其始位置就行了。,程序如下: 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; /每个数等于上一行的二个数之和 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中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。 程序如下: program ex5_13; var letter:array1.100of char; i,j:0.100; ch:char; begin /读入一个字符串以.号结束 write(Input a string:); i:=0;read(ch); while ch. do begin i:=i+1; letteri:=ch; read(ch) end;,j:=1; /判断它是否是回文 while (j=ithen writeln(Yes.) else writeln(No.); end.,【上机练习5.2】,1、输入一个33二维数组,找出其中最小的数,输出它的值以及所在行号和列号。 2、输入4行4列数组,将第2行与第3行元素对调。 3、输入44方阵,分别求两条对角线上元素之和。 4、矩阵的转置: A: B: 1 2 3 转置为 1 4 7 10 4 5 6 2 5 8 11 7 8 9 3 6 9 12 10 11 12 5、给一维数组输入M个整数,假设M=6,数组元素分别为 7 4 8 9 1 5 , 要求建立一个如下数组(矩阵): 7 4 8 9 1 5 4 8 9 1 5 7 8 9 1 5 7 4 9 1 5 7 4 8 1 5 7 4 8 9 5 7 4 8 9 1,6、建立如下矩阵: 2 3 4 5 3 4 5 6 4 5 6 7 5 6 7 8 注意:一般情况下,给二维数组赋初值,都是找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 按字母表顺序和逆序每隔一个字母打印。即打印出: a c e g I k m o q s u w y z x r v t p n l j h f d b 【分析】程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型变量作为循环变量,使程序处理起来比较直观。 程序如下: program ex5_14; var letter:char; begin for letter:=a to z do if (ord(letter)-ord(a)mod 2=0 then write(letter:3); writeln; for letter:=z downto a do if (ord(letter)-ord(z)mod 2 =0 then write(letter:3); writeln; end.,字符串类型,字符串是由字符组成的有穷序列,pascal提供string和ansistring二种字符串类型,二者只是在字符串的长度上有区别,string类型长度在255以内,超出255长度的部分被忽略,而ansistring类型没有长度限制(其实可存储2G的内容,所以看作长度无限制)。 字符串类型定义: var 字符串变量: stringn; 其中:n是定义的字符串长度,必须是0255之间的自然整数,第0号单元中存放串的实际长度,程序运行时由系统自动提供,第1n号单元中存放串的字符。若将stringn写成string,则默认n值为255。 例如:VAR name:string8; screenline:string;,Free Pascal中,一个字符串中的字符可以通过其对应的下标灵活使用。 例如: var name:string; begin readln(name); for i:=1 to ord(name0)do writeln(namei); /输出name串中的第i个字符 end. 语句writeln(namei)输出name串中第i个字符。,例5.15 求输入英文句子单词的平均长度。 【分析】程序中,变量s用于存句子中英文字母的总数,变量count用于存放句子中单词的个数,chj表示ch串中的第j个位置上的字符,ord(ch0)为ch串的串长度。程序充分利用Free Pascal允许直接通过字符串下标得到串中的字符这一特点,使程序比较简捷。 program ex5_15; var ch:string; /定义ch为字符串类 s,count,j:integer; begin write(The sentence is :); readln(ch); /读入整行内容 s:=0; count:=0 j:=0; repeat inc(j); if not (chj in :,;,!,?,., ) then inc(s); /这是集合的表式 if chj in ,.,!,? then inc(count); until (j=ord(ch0) or (chj in .,!,?); if chj. then writeln(It is not a sentence.) else writeln(Average length is ,s/count:10:4); /结果保留二位小数 end.,字符串的操作,由字符串的常量、变量和运算符组成的表达式称为字符串表达式。 字符串运算符包括: 1+:连接运算符 例如:Free +PASCAL的结果是Free PASCAL。 若连接的结果字符串长度超过255,则被截成255个字符。若连接后 的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度 时,超过部份字符串被截断。 例如:var str1,str2,str3:string8; begin str1:=Free ; str2:=PASCAL; str3:=str1+str2; end 则str3的值为:Free PA。 2=、=、=:关系运算符 两个字符串的比较规则为,从左到右按照ASC码值逐个比较,遇 到ASC码不等时,规定ASC码值大的字符所在的字符串为大。 例如:ABAC 结果为真; 122 结果为真; PASCAL =PASCAL 结果为假;,例5.16 对给定的10个国家名,按其字母的顺序输出。 【分析】程序中,当执行到if cnamekcnamej时,自动将cnamek串与cnamej串中的每一个字符逐个比较,直至遇到不等而决定其大小。这种比较方式是计算机中字符串比较的一般方式。 程序如下: proram ex5_16; var i,j,k:integer; t:string20; cname:array1.10 of string20; begin for i:=1 to 10 do readln(cnamei); for i:=1 to 9 do /选择排序 begin k:=i; for j:=i+1 to 10 do if cnamekcnamej then k:=j; t:=cnamei;cnamei:=cnamek;cnamek:=t; end; for i:=1 to 10 do writeln(cnamei); end.,字符串的函数和过程,Free Pascal提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。,例5.17 正确的邮箱地址格式是“用户名服务器名”,输入一个邮箱地址判断它是不是合法的邮箱地址。 【分析】此题的题意很简单,在判断邮箱地址合法性上需要考虑: 1邮箱地址字符串中是否包括字符“”; 2字符不能出现在第一个位置也不能出现字符的末尾。 程序如下: Program ex5_17; var p : integer; s : string; begin readln(s); p := pos(,s); if (p1) and (plength(s) then writeln(ok) else writeln(error); end.,例5.18 对输入的一句子实现查找且置换的功能。 【分析】程序中,输入要查找的字符串及要置换的字符串,充分用上了字符串处理的标准过程delete、insert及标准函数pos。 程序如下: Program ex5_18; var s1,s,o : string; i : integer; begin readln(s1);/输入原句 readln(s);/输入要查找的内容 readln(o);/输入替换的目标内容 i : =pos(s,s1);/在s1中查找s,若找不到返回0 while i0 do begin delete(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中,这里用字符串类型来处理,让同学们更好地掌握字符处理的函数和过程。 程序如下: Program ex5_19; Var letters : string; i,len : integer; ch : char; begin readln(letters); len : =length(letters); for i=1 to len do begin ch : =copy(letters,len,1); delete(letters,len 1); insert(ch,letters,i); end writeln(letters); end.,运行结果 : 输入:ABCDEF 输出:FEDCBA,请维护编者版权,请勿将课件在网络上传播。,福建省长乐一中 董永建 浙江省温州中学 舒春平 2009年9月,
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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