在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。 type numbers =set of 0..9; ch=set of char; day=(sun,mon,tue,wed,thu,fri,sat); var s: numbers; c:ch; weekday:day; 可以将类型说明与变量说明合并在一起,如: var s:set of 0..9; { 子界型 } c:set of char; weekday: (sun,mon,tue,wed,thu,fri,sat); { 枚举型 } 注意:集合的元素个数不超过256个,因此 var s:set of integer; 是错误的。 1、集合的值放在一对方括号中,中间各元素之间用逗号隔开。如:[1,2,5] 和 ['a','e','i'] 都是集合。 2、在集合中可以没有任何元素,这样的集合称为空集。[] 空集 三、集合的运算 集合类型变量不能进行算术运算,集合是无序的,不能使用ord、pred、succ等函数。 1、赋值运算 集合变量赋值: c:=['2']; i:=[5]; w:=[]; 函数赋值操作:添加一个集合元素 Include(s, 1); 删除一个集合元素 Exclude(s, 1); ① 并运算 (关系代数运算符∪) A,B为两个集合,由集合A中的元素加上集合B中的与A不重复的所有元素组成的集合,称为集合A和B的并。即A+B,如: [X,Y,Z]+[X] 为 [X,Y,Z] { 两个集合中不重复的所有元素 } [1]+[4] 为[1,4] ② 交运算 (关系代数运算符∩) A,B为两个集合,由既属于集合A中的元素又属于集合B中的所有元素组成的集合,称为集合A和B的交。即A*B,如: [X,Y,Z]*[X] 为 [X] { 两个集合中的相同元素 } [X,Y,Z]*[M] 为 [] ③差运算 (关系代数运算符-) A,B为两个集合,由集合A中的元素除去集合B中与A相同的元素组成的集合,称为集合A和B的差。即AB,如: [X,Y,Z]-[X] 为 [Y,Z ] { 在集合A中又不在集合B中的所有元素 } [X,Y,Z]-[M] 为 [X,Y,Z] 3、集合的关系运算: 运算结果为布尔值 关系运算符:= 相等、 <> 不相等 >= 包含,表示前者蕴含后者,相当于集合论中的 <V:FORMULAS>FORMULAS>。 <= 包含于,表示前者蕴含于后者,相当于集合论中的 。 例如:[a,b,c]=[b,c,a] 为true,元素个数相同,内容相同,不管排列顺序如何。 [a,b,c]>=[a] 为true; [a,b]<=[a,b,c] 为true。 in运算:in的右边为集合,左边为与集合基类型相同的表达式,为布尔值。in测试一个元素是否在集合中。相当于集合论中的∈。它们都是二目运算,且前4个运算符的运算对象都是相容 的集合类型。例如:a in[b,c] 为false。 设集合a:=[1..10]; x 为integer,如x在集合a中即删除a中的元素x,否则把元素x添加到集合a中。程序段如下: if x in a then a:=a-[x] else a:=a+[x] 例1、设全集E={1,2,3,4,5},集合A={1,4},B={1,2,5},C={2,4},则集合 (A∩B)∪~C 为( )。 ( NOIP2003单选8 ) 以上内容自转载:delphi语法基础--集合类型 http://www.xuedelphi.cn/wenzhang/pascal/2007/12/200712302017_2.htm 以下内容为探究的内容: 首先我们来看一个问题, var sd: set of 1..9; t: set of 1..60; begin sd := []; // sd = [] sd := [1,2]; // sd = [1,2] sd := sd + [15]; // sd = [1,2,15] 按照定义,sd应该为1到9的值, // 15应该不能加进来,但实际能加进去,使用 Include(sd, 15)也是一样 sd := sd + [16]; // sd = [1,2,15] 发现大于16的数字无法添加进集合内 sd := sd + [25]; // sd = [1,2,15] sd := []; showmessage(inttostr(sizeof(sd))); // 输出 2 showmessage(inttostr(sizeof(t))); // 输出 8 end; 出现这种现象,我们从集合类型的在内存中存储结构来解析,集合的元素在内存中是按位来存储的,并以整数字节为存储单元, 比如 sd: set of 1..9 它在内存中需要9位来存储,超过一个字节8位,所以内存中是分配给2个字节存储空间。 我们可以通过 showmessage(inttostr(PWord(@sd)^))
来显示他在内存中的值。 比如 sd = [1,3,5,6]时,按照前面说的,对应二进制数为:1101010,就是第1位、第3位、第5位、第6位为1,对应十进制为106。 位是从第0位开始的,所以第零位也表示一个值。按照此原理,反过来,如果利用下面语句:
PWord(@sd)^ := 106;
得到的是sd也是[1,3,5,6],如果sd: set of 1..60 ,则在内存中占8个字节,分别取出来,原理也是一样的。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论