Pascal的自定义数据类型.doc

上传人:rrsccc 文档编号:9533437 上传时间:2021-03-03 格式:DOC 页数:32 大小:201.50KB
返回 下载 相关 举报
Pascal的自定义数据类型.doc_第1页
第1页 / 共32页
Pascal的自定义数据类型.doc_第2页
第2页 / 共32页
Pascal的自定义数据类型.doc_第3页
第3页 / 共32页
Pascal的自定义数据类型.doc_第4页
第4页 / 共32页
Pascal的自定义数据类型.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《Pascal的自定义数据类型.doc》由会员分享,可在线阅读,更多相关《Pascal的自定义数据类型.doc(32页珍藏版)》请在三一文库上搜索。

1、第五章Pascal的自定义数据类型Pascal系统允许用户自定义的数据类型有:数组类型、子界类型、枚举类型、集合类型、记录类型、文件类型、指针类型。第一节数组与子界类型例5.1总务室在商店购买了八种文具用品,其数量及单价如下表:序号12345678品名圆珠笔铅笔笔记本订书机计算器三角板圆规文件夹件数24110601626323242单价1.180.451.88.878.503.284.202.16编程计算各物品计价及总计价。解:表中有两组数据,设表示物品件数的一组为a,表示物品单价的一组为b。a,b两组数据以序号为关联,具有相应的顺序关系。按如下方法处理:定义s,a,b三个数组,按相应顺序关系

2、,给a,b赋值(件数和对应单价) ;每读入一对数据(件数和对应单价),以同一序号的件数和对应单价计算出同一物品的计价: s i =a i * b i ; 用s i 记入第i种物品的计价 t = t + s i 用简单变量累加总计价 循环做步骤,做完后输出s数组所记入的各物品计价及总计价t。Pascal程序:Program Exam51;Var a: array1.8 of integer; a数组为整数型 s,b: array1.8 of real; s和b数组为实数型 t: real; i: integer;Begin t:=0; for i:=1 to 8 do 输入并计算八种物品 beg

3、in write(a, i, =) ; Readln(a i ) ; 输入单价 write(b, i, =) ; readln(b i ); 输入件数 s i :=a i * b i ; t:=t+s i end; write(i:2, :2); for i:=1 to 8 do 打印物品序号 write(i:8); 输出项宽度为8 writeln; write(a:2, :2); 输出项宽度为2 for i:=1 to 8 do 打印物品件数a数组 write(a i :8); 输出项宽度为8 writeln; 换行 write(b:2, :2); for i:=1 to 8 do 打印物品

4、件数b数组 write(b i :8:2); 输出项宽度为8,小数2位 writeln; 换行 write(s:2, :2); for i:=1 to 8 do 打印物品计价s数组 write(s i :8:2); 输出项宽度为8,小数2位 writeln; 换行 writeln(Totol=, t:8:2); 打印总价t Readlnend.输出语句为 write(实数:n:m) 的形式时,则输出该实数的总宽度为n,其中小数m位,此时的实数不以科学计数形式显示。程序中用来表示如物品件数和物品单价等属性相同的有序数据,Pascal语言把它归为数组。数组成员(分量)称为数组元素。数组必须在说明部

5、分进行定义:确定数组名,数组分量(元素)的个数及类型。一般格式有:Var 数组名:array下标类型 of 数组元素类型 ;本程序中a数组和b数组中8个元素的数据都是已知数据,可当作常量,用常量说明语句给数组元素赋初值,所以上面的程序Exam51可改为如下形式:Program Exam51_1;const a: array1.8 of integer =(24,110,60,16,26,32,32,42); 给a数组赋初值 b:array1.8 of real =(1.18,0.45,1.80,8.8,78.50,3.28,4.20,2.16); 给b数组赋初值Var s: array1.8

6、of real; t: real; i: integer;Begin t:=0; for i:=1 to 8 do begin s i :=a i * b i ; t:=t+s i end; write(i:2, :2); for i:=1 to 8 do write(i:8); writeln; write(a:2, :2); for i:=1 to 8 do write(a i :8:); writeln; write(b:2, :2); for i:=1 to 8 do write(b i :8:2); writeln; write(s:2, :2); for i:=1 to 8 do

7、write(s i :8:2); writeln; writeln(Totol=, t:8:2); Readlnend.数组常量说明格式为:Const 数组名:array下标类型of 数组元素类型=(常量表);程序中对数组的输入、输出处理,常用循环语句控制下标,进行有序地直接操作每个数组元素。例5.2编程输入十个正整数,然后自动按从大到小的顺序输出。解:用循环把十个数输入到A数组中; 从A1到A10,相邻的两个数两两相比较,即: A1与A2比,A2与A3比,A9与A10比。只需知道两个数中的前面那元素的标号,就能进行与后一个序号元素(相邻数)比较,可写成通用形式A i 与A i +1比较,那么

8、,比较的次数又可用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)次比较,就能把十个数中的最小数调

9、到最末尾位置,第二轮比较1 (N-2)次进行同样处理,又把这一轮所比较的“最小数”调到所比较范围的“最末尾”位置;每进行一轮两两比较后,其下一轮的比较范围就减少一个。最后一轮仅有一次比较。在比较过程中,每次都有一个“最小数”往下“掉”,用这种方法排列顺序,常被称之为“冒泡法”排序。Pascal程序:Program Exam52;const N=10;Var a: array1.N of integer; 定义数组 i,j: integer;procedure Swap(Var x,y: integer); 交换两数位置的过程Var t:integer;begin t:=x; x:=y; y:=

10、t end;Begin for i:=1 to N do 输入十个数 begin write(i, :); Readln(a i ) end; for j:=1 to N-1 do 冒泡法排序 for i:=1 to N-j do 两两相比较 if a i Trunc(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 筛去被

11、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 筛去被整除的数 Pascal程序:Program Exam53;const N=100;type xx=1 . N; 自定义子界类型xx(类型名)Var a: arrayxx of boolean; i,j: integer;Begin Fillchar(a,sizeof(a),true); a1 := False; for i:=2 to Trunc(sqrt(N) doif aI then

12、for j := 2 to N div I doaI*j:= False; t:=0; for i:=2 to N do if ai then Begin write(a i :5); inc(t); if t mod 5=0 then writeln end; readlnEnd.程序中自定义的子界类型,在用法上与标准类型(如integer)相同,只是值域上界、下界在说明中作了规定,而标准类型的值域由系统内部规定,其上界、下界定义是隐含的,可直接使用。例如:Type integer= -32768 . 32768; Pascal系统已作了标准类型处理,不必再作定义。例5.4在一次宴会上,有来

13、自八个不同国家的宾客被安排在同一张圆桌就坐。A是中国人,会讲英语;B是意大利人,他能讲西班牙语;C是英国人,会讲法语;D是日本人,能讲汉语;E是法国人,会讲德语;F是俄国人,懂意大利语;G是西班牙人,能讲日语;最后一个是德国人,懂俄语。编程序安排他们的座位,使他们在各自的座位上能方便地跟两旁的客人交谈。解:根据题目提供条件与数据,建立如下关系代码表:国家名中国意大利英国日本法国俄国西班牙德国宾客代码ABCDEFGH语言代号12345678懂外语代号37518246总代码A13B27C35D41E58F62G74H86表中总代码实际上是前三项代码的归纳:第一个字母表示哪国人;第二个数字表示本国语

14、代号;第三个数字表示懂哪国外语。如A13,A表示中国人,1表示汉语(本国语),3表示会说英语。所以每个宾客的情况均用总代码(三个数据组成的字符串)表示;定义由8个元素组成的数组(NAME),元素类型为字符串类型(String);元素的下标号影响各人座位关系,必须满足后一个元素的下标号应与前一个元素字符串中的第三个数据相同。例如:若第一个位置总代码为A13,则第二个位置应根据A13中最后的3,安排C35。即A与C可以交谈。以此类推。用字符串处理函数COPY,截取字符串的第一个字母作为宾客代码打印,再取第三个字符,用VAL将其转换成数字,将这个数字作为下标号,把这个下标号的元素安排在旁边(相邻);

15、重复步骤的方法,安排其后的元素,直到八个数据全部处理完为止。Pascal程序:Program Exam54;const name : array1.8of string 定义字串类型数组并赋常量 =(A13,B27,C35,D41,E58,F62,G74,H86);Var i, code: integer; 整数类型 x: 1.8; 子界类型 s : string; 字符串类型Begin s:=copy(name1,1,1); 截取第一个元素字串的第一个字符 write(s:4); 确定第一个位置 s:=copy(name1,3,1); 截取元素字串的第三个字符作为相邻Val(s,x,code

16、); 将字串s的值转换成数字存入 xfor i:=1 to 7 do 确定后面7个位置 Begin s:=copy(namex,1,1); 找到相邻者的代码 write(s:4); 打印相邻者代码 s:=copy(namex,3,1); 确定下一个相邻元素 Val(s,x,code); end; readlnEnd.Pascal常用的字符串处理标准函数有7个:设变量s,str,str1,str2均为字符串类型(string)多个字符;ch为字符类型(char)单个字符;(1)copy(str,n,m)从字符串str的左边第n个开始截取m个字符; 如:copy( Pascal ,3,2)的结果为

17、sc ;(2)concat(str1,str2)将两个字串连接成为一个新的字串; 如:s:=str1+str2;同等于两串字符相加(3)Length(str)求字串str的长度(字符个数);(4)chr(x) 求x(x为1255整数)的ASII代码对应的字符; 如:chr(65)结果为 A。(5)ord(ch)求字符ch对应的ASCII代码值;如 ord ( A )结果为65;(6)pos(str1,str2)求字串str1在字串中开始的位置; 如: pos(sca,pascal)结果为3;(7)upcase(ch)将字符ch转为大写字母,如 upcase( a )结果为A ;Pascal常用

18、的字符串处理标准过程有4个:(1)Val(str,x,code)将数字型字串转为数字并存入变量x中; 如:Val(768,x,code),x值为768,code为检测错误代码,若code=0表示没有错误;(2)str(n,s)将数字n转化为字串存入s中,如str(768,s)s的结果为 768 ;(3)insert(str1,str2,n)把字串str1插入在字串str2的第n个字符之前,结果在str2中;此过程中的str2为变量形参,具有传入传出的功能;(4)delete(str,n,m)从字串str的第n个开始,删除m个字符,把剩余的字符存在str中,此过程中的str为变量形参,具有传入传

19、出的功能;例5.5一个两位以上的自然数,如果左右数字对称,就称为回文数,编程找出所有不超过6位数字的回文数,同时又是完全平方数的数。如121是回文数,又是11的平方,所以是完全平方数。解:不超过6位数的完全平方数用循环在10999范围产生(for i:=10 to 999) ; 将完全平方数 (i*i)转成字串类型存入s中; 逐个取s的左右字符,检查是否相同(对称),检查对数不超过总长度的一半; 如果是回文数,就调用打印过程(Print)。Program Exam55;Var n, k, j ,t : integer; s : string; 字符串类型 i: longint; 长整数类型 P

20、rocedure Print; 打印过程(无形参)begin write(s : 10); inc(t); 打印s, 用t 计数 if t mod 6=0 then writeln 打印6个换行 end;Begin t:=0; for i:=10 to 999 do begin str(i*i,s); 将完全平方数转换成字串 k:=length(s); 计算字串长度 n:=k div 2; 计算字串长度的一半 j:=1; while j = n do 取左右字符检查是否对称 if copy(s,j,1) copy(s,k+1-j,1) then j:=1000 else inc( j ) ;

21、若不对称让j=1000,退出循环 if j 1000 then Print j 1000即是回文数,调打印 end; writeln; writeln(Total=:8, t); 打印总个数 readlnEnd.习题5.11.裴波那契数列:数列1、1、2、3、5、8、13、21称为裴波那契数列,它的特点是:数列的第一项是1,第二项也是1,从第三项起,每项等于前两项之和。编程输入一个正整数N,求出数列的第N项是多少?(N不超过30)。2.下面的竖式是乘法运算,式中P表示为一位的素数,编程输出此乘法竖式的所有可能方案。 3.节目主持人准备从N名学生中挑选一名幸运观众,因为大家都想争当幸运观众,老师

22、只好采取这样的办法:全体同学排成一列,由前面往后面依顺序报数1,2,1,2,报单数的同学退出队伍,余下的同学向前靠拢后再重新由前往后1,2,1,2,报数,报单数者退出队伍,如此下去最后剩下一人为幸运观众。编程找出幸运观众在原队列中站在什么位置上?(N由键盘输入,N 255)。4. 1267*1267=1605289,表明等式右边是一个七位的完全平方数,而这七个数字互不相同。编程求出所有这样的七位数。5. 校女子100米短跑决赛成绩如下表,请编程打印前八名运动员的名次、运动员号和成绩。(从第一名至第八名按名次排列)运动员号0171680881050581231420551131360200320

23、89010成绩(秒)12.312.613.011.812.113.112.011.911.612.412.913.212.211.46. 求数字的乘积根。正整数的数字乘积这样规定:这个正整数中非零数字的乘积。例如整数999的数字乘积为9*9*9,得到729;729的数字乘积为7*2*9,得到126;126的数字乘积为1*2*6,得到12;12从数字乘积为1*2,得到2。如此反复取数字的乘积,直至得到一位数字为止。999的数字乘积根是2。编程输入一个长度不超过100位数字的正整数,打印出计算数字乘积根的每一步结果。输出格式如下:(N=3486784401) 3486784401 516096 1

24、620 12 27. 有一组13个齿轮互相啮合,各齿轮啮合的齿数依次分别为6,8,9,10,12,14,15,16,18, 20,21,22,24, 问在转动过程中同时啮合的各齿到下次再同时啮合时,各齿轮分别转过了多少圈?8. 集合M的元素的定义如下: (1) 数1属于M; (2) 若X属于M, 则A=2X+1, B=3X+1, C=5X+1, 也属于M; (3) 再没有别的数属于M。(M=1,3,4,6,7,9,10,13,15,16.,如果M中的元素是按递增次序排列的,求出其中的第201,202和203个元素。9. 一个素数,去掉最高位,剩下的数仍是素数;再去掉剩下的数的最高位,余留下来的

25、数还是素数,这样的素数叫纯粹素数。求所有三位数的纯粹素数。10. 自然数4,9,16,25等叫做完全平方数,因为22 =4, 32 =9, 42 =16,52 =25, 当某一对自然数相加和相减, 有时可各得出一个完全平方数。 例如: 8与17这对自然数: 17+8=25 178= 9试编程,找出所有小于100的自然数对,当加和减该数对时,可各得出一个完全平方数。第二节二维数组与枚举类型例5.6假设四个商店一周内销售自行车的情况如下面表一所示,自行车牌号永久牌飞达牌五羊牌第一商店354055第二商店205064第三商店103218第四商店383628表一几种牌号自行车的单价如表二所示。求各店本

26、周出售自行车的总营业额。 单价 元 永久牌395 飞达牌398 五羊牌384表二解:把表一看成是由行(每个店占一行)与列(每种牌号占一列)共同构成的数据组,按表格排列的位置顺序,用A数组表一各数据表示如下:A1,1=35 A1,2=40 A1,3=55 第一行共三个数据A2,1=20 A2,2=50 A2,3=64 第二行共三个数据A3,1=10 A3,2=32 A3,3=18 第三行共三个数据A4,1=38 A4,2=36 A4,3=28 第四行共三个数据A数组有4行3列,每个数组元素由两个下标号表示,这样的数组称为二维数组。表二的数据按排列顺序用B数组表示如下: B1=395 B2=398

27、 B3=384B数组有3个数据,用一维数组表示,下标号与表一中列的序号有对应关系。计算各店营业额并用T数组表示:T1=A1,1*B1+A1,2*B2+A1,3*B3 计算第一商店的营业额T2=A2,1*B1+A2,2*B2+A2,3*B3 计算第二商店的营业额T3=A3,1*B1+A3,2*B2+A3,3*B3 计算第三商店的营业额T4=A4,1*B1+A4,2*B2+A4,3*B3 计算第四商店的营业额T数组共有4个数据,为一维数组,下标号与商店号有对应关系。输出T数组各元素的值。Pascal程序:Program Exam56;Var A: array1.4,1.3 of integer;

28、定义二维数组,整数类型 B: array1.3 of integer; 一维数组,3个元素 T: array1.4 of integer; 一维数组,4个元素 i,j: integer;Beginfor i:=1 to 4 do 输入表一的数据 Begin Write(A,i,: ); 提示输入哪一行 for j:=1 to 3 do Read(ai,j); 每行3个数据 Readln; 输完每行按回车键 end; for i:=1 to 3 do 输入表二的数据 Begin Write(B, I ,:); 提示第几行 Readln(B i ); 输入一个数据按回车 end; for i:=1

29、 to 4 do 计算并输出 Begin T i :=0; Write( :5,I:4); for j:=1 to 3 do Begin Write(Ai , j:6); T i =T i +Ai , j*Bj; end; Write(T i :8); end; Readln; end.程序中定义二维组方式与一维数组形式相同。二维数组的元素由两个下标确定。二维数组元素的格式如下: 数组名 下标1,下标2 常用下标1代表数据在二维表格中的行序号,下标2代表所在表格中列的序号。例5.7输入学号从1101 至1104的4名学生考试语文、数学、化学、英语、计算机六门课的成绩,编程求出每名学生的平均分,

30、按每名学生数据占一行的格式输出。NameChinMathPhysChemEnglCompAve1101879178856778110269847995918911038669798990881104888992878881解:根据题目所给数据及要求,定义如下数据类型:学生成绩:在数据表格中每人的成绩占一行,每行6列(每科占一列);定义二维数组s,各元素为实型;个人平均分:定义一维数组av,各元素为实型;个人总分:是临时统计,为计算机平均分服务,用简单实型变量t;处理步骤为:用双重循环按行i按列j输入第i个人第j科成绩存入s i, j;每读入一科成绩分,就累计到个人总分t中;输完第i个人的各科成

31、绩,就计算出第i个人平均分并存入数组av(i)中;重复上述步骤,直到全部学生的成绩处理完毕;用双重循环按行列形式输出完整的成绩表。Pascal程序:Program Exam57;const NB=1101; NE=1104;Var s: arrayNB.NE,1.6 of real; 定义二维数组(学生成绩) av: arrayNB.NE of real; 定义一维数组(平均成绩) i: NB.NE; i为子界类型(学号范围) j: 1.6; j为子界类型(课程范围) t: eal; t为实数类型(计总成绩)Begin for i:=NB to NE do 用i控制处理一位学生成绩 begin t:=0; write(i, : ); for j:=1 to 6 do 输入并计算每人的门成绩 begin

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1