《2022年高中信息技术 竞赛班第二阶段培训 第六课 集合与记录类型的综合应用教案》由会员分享,可在线阅读,更多相关《2022年高中信息技术 竞赛班第二阶段培训 第六课 集合与记录类型的综合应用教案(11页珍藏版)》请在金锄头文库上搜索。
1、2022年高中信息技术 竞赛班第二阶段培训 第六课 集合与记录类型的综合应用教案6.1.1 集合类型的定义集合是同类型对象的一个汇集,它是指同类型对象汇集在一起构成的数据结构。集合的每一个对象称为集合的元素。集合元素必须是有序简单数据类型,集合元素的类型称为集合的基类型。集合的一般形式为:TYPE = set of ;基类型可以是整型、字符型、布尔型、枚举型、子界型等,但不能是实型或结构类型。例如: TYPE letter = set of A. Z;var ch1, ch2 : letter;也可以直接写成: var ch1, ch2 : set of A. Z;在Pascal中集合是用一组
2、括在方括号中的元素来表示,元素之间用逗号分隔。如:A, B , C , D 是四个枚举量的集合 1 . 20 表示1到20的所有整数的集合 0 是单元素集 表示空集一个集合类型变量的取值,可以是基类型中所有元素按不同的组合而构成的子集。例如,上面说明变量ch1的类型是letter,它可以是下列的组合:A . Z 全集A, B, Q 任一子集A . C , X .Z A 单元素集 空集空集与所有的集合类型都兼容。6.1.2 集合类型的运算ch1:= A . C;是合法的集合赋值。对集合除可以进行赋值运算外,还可以进行以下运算:交(*)运算:两集合之交 S1*S2 为一集合,所得元素由S1、S2中
3、相同的元素组成。 如: 0.7 * 0.4 = 0.4 并(+)运算:两集合之并 S1+S2 为一集合,所得元素由S1、S2中所有相同的元素组成。如: 0.7 + 0.4 = 0.7 0 , 1 + 1 , 4 , 6 = 0 , 1 , 4 , 6 差(-)运算:两集合之差 S1-S2 为一集合,所得元素由只存在于S1而不在S2的那些元素组成。如: 0.7 - 0.4 = 5.7 比较运算: 集合可进行“=”、“=”、“=”、“”等比较运算: 等于“=” S1=S2,若S1与S2中所有元素均相同,结果为true,否则为false。 如: 0.4 = 0.4 结果为true 0.7 = 0.4
4、 结果为false 不等于“”S1S2,S1与S2中至少有一个元素不同,如: 0.7 0.4 结果为true 0.4 0.4 结果为false 包含“=”S1=S2 表示S2是S1的子集。 被包含“=”S1= 0.4 结果为true 0.7 = 0.4 结果为false =20) and (ch=50) then 可写成: if ch in 20.50 then 6.1.4 注意问题集合类型是一种使用简单,节省内存而又运算速度快的数据类型,在解决某些问题时,它能使程序编写简明清晰,节省内存而又节省运行时间。但是使用集合时必须注意以下几点: Pascal规定集合的元素个数不超过256个。当实际问
5、题所需的元素个数大于256时,可采用布尔数组代替集合类型。所以 var i : set of integer; 的说明是错误的,因为它的元素个数超过256个。集合类型变量不能进行算术运算,也不允许用读/写语句直接输入/输出集合。所以集合的建立要通过赋值语句实现,或先初始化一个集合,然后通过并(+)运算向集合中逐步加入各个元素;集合的输出也必须间接地转换,如集合中的元素是数字或字母,可通过序数值的转换关系输出对应的字符。集合的元素是无序的,所以 ord , pred 和succ 函数不能用于集合类型的变量。【例1】用集合方法编程,实现把100以内的全部素数找出来,然后把求得的每十个素数排成一行,
6、形成素数表。算法分析:用筛法求素数。第一步,定义一个集合类型,如sss,它包含99个元素,从2到100;第二步,定义两个集合变量,如筛集合 s 和素数集合 p,它们是sss类型的变量;第三步,按筛法找出全部素数;第四步,间接输出素数表。算法求精如下: 把2到100逐步放入筛中,建立筛集合s; 选定筛中最小的素数2; 把选定的素数放入素数集合P中; 检查筛集合s,从中删去选定素数和它的所有倍数; 重复步骤2、3、4,直到筛集合s变成空集,素数集合P完全建立; 间接输出集合P中的元素,且每10个一行。程序清单:program erato; const n=100; type sss=set of
7、2.n; var s, p : sss;next , j : integer;Begin s:=2.n; 初始准备 p:= ; next:=2; repeat 建立素数表while not (next in s) do next:=next+1;p:=p+next;j:=next;while j=n do begin 去掉选定素数的倍数 s:=s-j; j:=j+next;end; while until s= ; j:=0; for next:=2 to n do 输出素数集合元素if next in p then begin write(next : 5); j:=j+1; if j=10
8、 then 每10个素数为一行 begin writeln; j:=0; end; end; ifEnd.6.2 记录类型记录类型数据是由固定数量,具有不同类型的成份组成。这种数据在实际问题中常遇到,如描述学生姓名、性别、年龄、班级和各科成绩的档案登记表。这种数据用数组类型是非常烦琐的,可以利用Pascal提供的记录类型。6.2.1 记录类型的数据记录是由固定数量的字段(又称域)的元素所组成的一种结构,各个字段可以具有各种不同的数据类型,每个字段都有一个名称即字段标识符。记录类型定义的一般形式:TYPE = RECORD : ; : ;END;记录中描述对象的字段表,包括了记录的固定部分和变体
9、部分;记录的固定部分由字段名和类型说明部分,记录的变体部分在本节的最后介绍。下面介绍如何描述记录的数据,例如: type date = record year : 1900 . 2500; month : (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC);day : 1.31; end; var date1, date2 : date;对记录类型变量的访问,不同于数组那样通过下标来访问其成份,而是通过记录变量名,句号(.),字段名 来访问记录中的成份,称为记录的点记法,其形式为:. := ;例如: date1.year :
10、= 1937; date1.month := JUL; date1.day:=7;如果记录的某个字段是字符型数组,如student.name字段是一个由20字符组成的字符型数组,则可用循环语句读入字符:for i:=1 to 20 do read (student.name i ); 记录类型与数组类型相似,允许在同类型的两个记录之间进行整体赋值。如: date2 := date1; 记录可以嵌套,即记录中的字段的类型也可以是记录,嵌套的记录类型是有层次的数据类型。在同一层的标识符不能同名,但不同层的字段名可以同名。例如: var r : integer;s : record r : real; s : record r : char; s : boolean; end; end;对于层次记录的引用必须采用自顶向下的完全路径,如: var worker = record age : 15.70; birth : record year : 1900.2200; month : 1.12;