delphi 集合类型探究

摘要:
集合是由具有某些共同特征的元素组成的整体。在pascal中,集合由一组具有相同有序类型的数据元素组成,称为集合的基类型。相当于∈ 在集合论中。它们是二进制运算,前四个运算符的操作数是一致的集合类型。

集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。
 
一、集合类型的定义和变量的说明
  集合类型的一般形式为:
    set of 基类型;
  基类型可以是任意顺序类型, 而不能是实型或其它构造类型。同时,基类型的数据的序号不得超过255。例如下列说明是合法的:

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、在集合中可以没有任何元素,这样的集合称为空集。[] 空集
  3、在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:  
  [1,2,3,4,5, 10,15] 可以表示成: [1..5,10,15]
  4、集合的值与方括号内元素出现的次序无关。例如[1,5,8 ]和[5,1,8]的值相等。
  5、在集合中同一元素的重复出现对集合的值没有影响。例如,[1,8,5,1,8]与[1,5,8]的值相等。
  6、每个元素可用基类型所允许的表达式来表示。如 [1,1+2,4]、[succ(ch)]。 
 

三、集合的运算

    集合类型变量不能进行算术运算,集合是无序的,不能使用ord、pred、succ等函数。

  1、赋值运算
  只能通过赋值语句给集合变量赋值,不能通过读语句赋值,也不能通过写语句直接输出集合变量的值。如:

     集合变量赋值:     c:=['2'];  i:=[5];  w:=[];
     集合变量赋子界值: c:=['a'..'z'];  i:=[1..7];
     集合变量赋枚举值: c:=['a','b','d','m'];  i:=[2,4,6,8,10];  

     函数赋值操作:添加一个集合元素 Include(s, 1);

                        删除一个集合元素 Exclude(s, 1);
   2、集合的并、交、差运算
  可以对集合进行并(+)、交(*)、差 (-)三种运算,每种运算只有一个运算符、两个运算对象,运算结果仍为集合。注意它们与算术运算的区别。

     ① 并运算 (关系代数运算符∪)

         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 )
      A)空集        B){1}       C){3,5}     D){1,5}      E){1,3,5}

以上内容自转载: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: setof1..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: setof1..60 ,则在内存中占8个字节,分别取出来,原理也是一样的。

免责声明:文章转载自《delphi 集合类型探究》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CESIUM内置shader变量和函数[转]ABP 自动映射 AutoMapper下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

win8(x64)下,重新安装delphi 2007时出现“Invalid Serial Number”,如何解决?

1)在添加删除程序里卸载delphi 2007 2)删除C:ProgramDataCodeGear 3)删除C:Program Files (x86)CodeGear 4)删除d:Program Files (x86)CodeGear   (我一般选择d盘安装程序) 5)删除注册表下codegear    ...

redis 常用操作

/*1.Connection*/$redis = newRedis(); $redis->connect('127.0.0.1',6379,1);//短链接,本地host,端口为6379,超过1秒放弃链接 $redis->open('127.0.0.1',6379,1);//短链接(同上) $redis->pconnect('127.0....

Delphi 使窗体Showmodal后可以操作其他窗体

对话框ShowModal之后不能操作其它窗口,实际上是因为Windows Disable了其它窗口。所以当你需要在模态对话框中访问其它已经可见的窗口时,需要用EnableWindow API来激活对应的窗口。 例如: form2.showmodal; 在form2的OnShow事件中: enablewindow(form1.handle,true)...

Delphi中正常窗口的实现

转自http://blog.csdn.net/cathyeagle1 引言用Delphi所提供的VCL类库编写的Windows应用程序,有一个明显不同于标准Windows窗口的特点--主窗口的系统菜单与任务栏上的系统菜单不相同。一般情况下,主窗口的系统菜单有六个菜单项而任务栏系统菜单只有三个菜单项。实际使用中我们发现用VCL开发的程序有以下几个方面的尴尬:...

delphi 操作xml示例(DelphiBBS)

自:http://www.delphibbs.com/keylife/iblog_show.asp?xid=20713 ================================================================ 2005-9-23 21:05:34xml基础操作实例,因为刚开始学,如果有不对的地方,请批评指正,代码...

DELPHI 中的Delay函数,利用GetTickCount和Application.ProcessMessages构建

  作者 关劲松           delphi 开发中有些时候需要停留片刻,等待界面输入,或异步操作完成,如果使用sleep函数的话,整个程序都会停顿,界面还会出现冻结的情况。因此需要自行编写一个delay函数,以毫秒为单位控制等待时间。         函数功能:GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapse...