§6集合与记录类型§6.1集合类型§6.1.1集合类型的定义集合是同类型对象的一个汇集,它是指同类型对象汇集在一起构成的数据结构。集合的每一个对象称为集合的元素。集合元素必须是有序简单数据类型,集合元素的类型称为集合的基类型。集合的一般形式为:TYPE<类型标识符>=setof<基类型>;基类型可以是整型、字符型、布尔型、枚举型、子界型等,但不能是实型或结构类型。例如:TYPEletter=setof‘A’..‘Z’;varch1,ch2:letter;也可以直接写成:varch1,ch2:setof‘A’..‘Z’;在Pascal中集合是用一组括在方括号中的元素来表示,元素之间用逗号分隔。如:[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中相同的元素组成。如:[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]结果为false不等于“<>”——S1<>S2,S1与S2中至少有一个元素不同,如:[0..7]<>[0..4]结果为true[0..4]<>[0..4]结果为false包含“>=”——S1>=S2表示S2是S1的子集。被包含“<=”——S1<=S2表示S1是S2的子集。如:[0..7]>=[0..4]结果为true[0..7]<=[0..4]结果为false[]<=[0..4]结果为true·检查(in)运算:用来检查某一元素是否属于某一集合。如:1in[0..4]结果为true5in[]结果为false‘A’in[‘A’..‘Z’]结果为true§6.1.3集合类型的表达式集合表达式是由集合常数、集合变量、集合构造符和集合运算符组成。如:k:=5;ch2:=[1,2,3,4]+[k];运行之后,ch2中就会有5个元素:1、2、3、4、5。注意:[1..5]与[1,2,3,4,5]两种表达式是等价的。集合运算相当快,在程序中常用集合表达式来描述复杂的测试。例如,条件表达式:(ch=’T’)or(ch=’u’)or(ch=’R’)or(ch=’B’)可用集合表达式表示为:chin[‘T’,‘u’,‘R’,‘B’]又如:if(ch>=20)and(ch<=50)then<语句>可写成:ifchin[20..50]then<语句>§6.1.4注意问题集合类型是一种使用简单,节省内存而又运算速度快的数据类型,在解决某些问题时,它能使程序编写简明清晰,节省内存而又节省运行时间。但是使用集合时必须注意以下几点:①Pascal规定集合的元素个数不超过256个。当实际问题所需的元素个数大于256时,可采用布尔数组代替集合类型。所以vari:setofinteger;的说明是错误的,因为它的元素个数超过256个。②集合类型变量不能进行算术运算,也不允许用读/写语句直接输入/输出集合。所以集合的建立要通过赋值语句实现,或先初始化一个集合,然后通过并(+)运算向集合中逐步加入各个元素;集合的输出也必须间接地转换,如集合中的元素是数字或字母,可通过序数值的转换关系输出对应的字符。③集合的元素是无序的,所以ord,pred和succ函数不能用于集合类型的变量。【例1】用集合方法编程,实现把100以内的全部素数找出来,然后把求得的每十个素数排成一行,形成素数表。算法分析:用筛法求素数。第一步,定义一个集合类型,如sss,它包含99个元素,从2到100;第二步,定义两个集合变量,如筛集合s和素数集合p,它们是sss类型的变量;第三步,按筛法找出全部素数;第四步,间接输出素数表。算法求精如下:①把2到100逐步放入筛中,建立筛集合s;②选定筛中最...