Delphi 集合 使用资料收集

      集合的使用

     (一)

      delphi中的集合是对数学中集合的概念的简单实现。要求是集合中的元素必须同类型,且必须是序数类型,且集合中可能的元素个数不能大于255。
    定义: type 集合类型名 = set of 元素类型
    例如: type MySet = set of char; //注意 char 的个数本来就不超过255。
               type MyItem = (sun, moon, star); MyItem2 = 1..100;
               type MySet2 = set of MyItme; MySet3 = set of MyItem2;
    ◇我们可以测试给定的元素是否在某个集合中。 var A: MySet; 'a' in A ?
    ◇集合的常量表达法: ['a','x','c']; [1,2,4..10]; [sun, moon]
    ◇空集的表示法: []
    ◇集合间可以直接赋值。 A := []; A := [1,2,6]; A := B;
    ◇集合间可以进行标准的运算: A+B 并集; A-B 差集; A*B 交集
    我们经常使用集合来表达用户对多选控件的选择情况。因为delphi定义了标准的集合运算,就使得我们处理类似:“两个用户公共选择了哪些项?”“从选择中去掉固定的一组选则”这样问题变得十分简单容易。delphi的控件属性中,有很多的是集合类型的例子。比如
      with form1.canvas.font do style := style + [fsItalic] 就是增加了斜体特征。
 
   (二)
    我觉得,集合很实用,以前在程序中总要先从数据库中取出好多元素,然后逐个判断,现在知道集合这个概念,兴奋ing!哈哈啊。
集合是P a s c a l特有的数据类型,在Visual Basic、C或C + +都没有(虽然C++ Builder提供了一种模
板类称为集合,它模仿P a s c a l集合的行为)。集合用一种有效的手段来表示一组有序数、字符和枚
举值。
声明一个集合用关键字set of,并在其后跟上有序类型或一个集合可能值的有限子集。示例如下:
type
TCharSet=set of char; // 可能的值:# 0 - # 2 5 5
TEnum = ( Monday, Tuesday, Wednesday, Thursday, Friday ) ;
TEnumSet=set of TEnum; // 包含了T E n u m值的任何组合
TSubrangeSet=set of 1..10; // 可能的值:1 - 1 0
TAlphaSet=Set of 'A'..'z';      // 可能的值:' A ' - ' z '
注意,一个集合最多只能有2 5 5个元素。另外,只有有序的类型才能跟关键字 set of,因此下列的
代码是非法的:
t y p e
TIntSet=set of Integer; // 非法:太多的元素
TStrSet=set of string;    // 非法:不是有序的类型
集合在内部以位的形式存储它的元素,这使得在速度和内存利用上更有效。集合如果少于 3 2个元
素,它就存储在C P U的寄存器中,这样效率就更高了,为了用集合类型得到更高的效率。记住,集合
的基本类型的元素数目要小于3 2。
1. 使用集合
当使用集合的元素时,使用方括号。下面代码表明如何使用集合类型的变量并给它赋值。
(1)直接在所在过程中var中定义:
var
SubrangeSet:set of 1..10;(可能是1到10中任何数)
begin
SubrangeSet:=[1,2,4..6];
end;
(2)在Type中定义:
type
TCharSet=set of char;
var
CharSet:TCharSet;
begin
CharSet:=['A'..'J','a','m'];
end;
2. 集合操作符
Object Pascal提供了几个用于集合的运算符,用这些运算符可以判断集合和集合之间的关系,对
合增删元素,对集合进行求交集运算。
(1) 关系运算
用in运算符来判断一个给定的元素是否在一个集合中,下面的代码判断在前面所定义的集合
CharSet中是否有字母‘S’:
if 'S' in CharSet then
/ /继续运行
下面的代码判断在EnumSet中是否没有Monday :
if not (Monday in EnumSet) then
/ /继续运行
(2) 增删元素
用+、-运算符或Include( )和Exclude( )过程,能对一个集合变量增删元素:
Include(CharSet, 'a');/ /在集合中增加'a' ;
CharSet : = CharSet+['b'] ;/ /在集合中增加'b' ;
Exclude(CharSet, 'x');/ /在集合中删除'x' ;
CharSet:=CharSet-['y', 'z'];/ /在集合中删除'y'和'z' ;
提示 尽可能地用Include()和Exclude()来增删元素,尽可能地少用+、-运算符。因为Include()和
Exclude()仅需要一条机器指令,而+和-需要13+6n(n是集合的按位的长度)条机器指令。
(3) 交集
用*运算符来计算两个集合的交集,表达式Set1 * Set2的结果是产生的集合的元素在Set1和
Set2集合
都存在,下面的例子用来判断在一个给定的集合中是否有某几个元素:
if {'a', 'b', 'c'}*CharSet={'a', 'b', 'c'} then
/ /继续程序


 (三)

 unit Unit4;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs, StdCtrls;
type
  TEnum = (One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten);
  TSetEnum = set of TEnum;
  TForm4 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    GroupBox2: TGroupBox;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    SetEnum, SetEnum1, SetEnum2: TSetEnum ;
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var
  s1, s2: string;
begin
  s1 := 'aaa';
  s2 := s1;
  s2 := 'bbb';
  ShowMessage('字符串S1的值:  ' + s1 + ' ; 字符串S2的值: ' + S2);
end;
procedure TForm4.Button2Click(Sender: TObject);
var
  A1, A2: array of string;
begin
  SetLength(A1, 1);
  A1[0] := 'aaa';
  A2 := A1;
  A2[0] := 'bbb';
  ShowMessage('数组A1的值:' + A1[0]+ ' ;数组A2的值:' + A2[0]);
end;
//初始化
procedure TForm4.Button3Click(Sender: TObject);
begin
  SetEnum  :=  [one, Two];
  SetEnum1 := [Three, Nine, Ten]
end;
//集合减少
procedure TForm4.Button5Click(Sender: TObject);
begin
  SetEnum := SetEnum - [Two];
end;
//集合增加
procedure TForm4.Button6Click(Sender: TObject);
begin
  SetEnum := SetEnum + [Three];
end;
//集合减少
procedure TForm4.Button7Click(Sender: TObject);
begin
  Exclude(SetEnum, One);
end;
//集合增加
procedure TForm4.Button4Click(Sender: TObject);
begin
  Include(SetEnum, Four);
  Include(SetEnum, Ten);
end;
//执行校验
procedure TForm4.Button8Click(Sender: TObject);
begin
  if One in SetEnum then
  begin
    ShowMessage('Exclude函数执行失败');
  end
  else if Two in SetEnum then
  begin
    ShowMessage('SetEnum - [Two]执行失败');
  end
  else if not (Three in SetEnum) then
  begin
    ShowMessage('SetEnum + [Three]执行失败');
  end
  else if not (Four in SetEnum) then
  begin
    ShowMessage('Include函数执行失败');
  end
  else if not (ten in SetEnum) then
  begin
    ShowMessage('Include函数执行失败');
  end
  else
  begin
    ShowMessage('执行成功!');
  end;
end;
//取得集合的交集
procedure TForm4.Button9Click(Sender: TObject);
begin
  SetEnum2 := SetEnum1 * SetEnum;
  if Three in SetEnum2 then
  begin
    ShowMessage('交集成功执行成功');
  end;
end;
end.

   (四)
    集合(Set)是由具有某些共同特征的元素构成的一个整体,这些元素必须是有序类型
,如,整型、布尔型、字符型、枚举型和子界型。
    1.集合类型的定义
    集合类型变量定义的语法格式为:
    type
    <类型标识符>=set of<基类型>
其中,基类型是指集合中的元素必须是同一有序数据类型。Pascal语言规定集合的元素个
数最多不得超过256个;因此基类型的序数值必须在O~255之间,例如:
    type
    Name=set of char;
    Boolset=set of boolean;
    Weekday=(Sun,Mon,Tue,Wed,Thu,Fri,Sat);
    Week:set of weekday;
    2.集合变量的定义    ’
    集合类型定义的语法格式为:
    (1)已定义集合类型
    var<变量名>:<集合类型标识符>;
    (2)与类型定义结合在一起  .
    var<变量名>:set of<基类型>;
    傻f如:    var si:set oi-O..25 5;
    sn:Name;
    si是整数类型的集合变量,sn是Name集合类型的变量。
    3.集合变量的赋值
    程序中可以对集合变量赋集合常量值,例如:
    si:=[1..6,9];
    sn:=  [’A’..’Z’,’a’..’z’,’O’..’9’];
    集合类型变量的取值范围为包含空集在内的集合的所有子集,但是集合中的元素不能
重复出现o
  4.集合类型的运算
  集合类型能够进行比较运算和集合运算。
  集合的比较运算有“<=”、“>=”和“in",分别表示包含于、包含和属于运算。此外
还有
“=”、“<>"表示集合相等和集合不等,例如:[1,2]<=[1..3]的结果是true;1 in
[O..6]的结果是true。
    集合运算有并(+)、交(木)、差(一)运算,它们的结果还是一个集合。例如:
    集合A:[1,2,6,7]
    集合B:[2,3,5,6,7,9]
    集合A+B:[1,2,3,5,6,7,9](由属于集合A或属于集合B的所有元素组成)
    集合A术B:[2,6,7](由属于集合A又属于集合B的所有元素组成)
    集合A-B:[1](由属于集合A而不属于集合B的所有元素组成)
      Caption = '集合初始化'
      TabOrder = 0
      OnClick = Button3Click
    end
    object Button4: TButton
      Left = 216
      Top = 68
      Width = 80
      Height = 25
      Caption = '集合增加2'
      TabOrder = 1
      OnClick = Button4Click
    end
    object Button5: TButton
      Left = 112
      Top = 28
      Width = 80
      Height = 25
      Caption = '集合减少1'
      TabOrder = 2
      OnClick = Button5Click
    end
    object Button6: TButton
      Left = 216
      Top = 28
      Width = 80
      Height = 25
      Caption = '集合增加1'
      TabOrder = 3
      OnClick = Button6Click
    end
    object Button7: TButton
      Left = 112
      Top = 68
      Width = 80
      Height = 25
      Caption = '集合减少2'
      TabOrder = 4
      OnClick = Button7Click
    end
    object Button8: TButton
      Left = 24
      Top = 72
      Width = 81
      Height = 25
      Caption = '检测集合值'
      TabOrder = 5
      OnClick = Button8Click
    end
    object Button9: TButton
      Left = 120
      Top = 104
      Width = 81
      Height = 25
      Caption = '集合的交集'
      TabOrder = 6
      OnClick = Button9Click
    end
  end

end

  (五)

  集合是由具有某些共同特征的元素构成的一个整体。在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];  
  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]* 为 [] 
③差运算   (关系代数运算符-) 
A,B为两个集合,由集合A中的元素除去集合B中与A相同的元素组成的集合,称为集合A和B的差。即AB,如: 
[X,Y,Z]-[X] 为 [Y,Z ]      { 在集合A中又不在集合B中的所有元素 } 
[X,Y,Z]- 为 [X,Y,Z]  
3、集合的关系运算: 运算结果为布尔值
关系运算符: = 相等、<> 不相等、 
>= 包含,表示前者蕴含后者,相当于集合论中的 FORMULAS>[img]mk:@MSITStore:C:\Documents%20and%20Settings\Administrator\桌面\pascal入门.CHM::/setof.1.gif[/img]。 
<= 包含于,表示前者蕴含于后者,相当于集合论中的 [img]mk:@MSITStore:C:\Documents%20and%20Settings\Administrator\桌面\pascal入门.CHM::/setof.2.gif[/img]。 
例如:[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}
  
例2、输入一系列字符,对其中的数字字符、字母字符和其它字符分别计数。输入'?'后结束。 
var ch:char;
    letter:set of char;
    digit:set of '0'..'9'; 
i,j,k:integer;
  begin
   letter:=['a'..'z','A'..'Z']; digit:=['0'..'9'];
   i:=0; j:=0; k:=0;
   repeat
    read(ch);
    if ch in letter 
then i:=i+1
      else if ch in digit then j:=j+1 else k:=k+1;
   until ch='?';
    writeln('letter:',i,'digit:',j,'other:',k) 
end.
例3、求出2~n之间的素数。 
由希腊数学家Eratosthense提出“筛法”,步骤如下:(以2到20为例) 
①将所有的候选数放入筛子集合中;[1,2,3,4,…,20], 素数集合为 []。 
②找筛中最小数(必为素数)next,放入素数集合中; 
③将next的所有倍数从筛中筛去; 
④重复②~③,直到筛空。素数集合中即所求。每次循环如下: 
筛子集合                        素数集合 
[3,5,7,9,11,13,15,17,19]        [2] 
[5,7,11,13,17,19]               [2,3] 
[7,11,13,17,19]                 [2,3,5] 
……                             …… 
[]                              [2,3,5,7,11,13,17,19] 
const n=200; 
var sieve,primes:set of 2..n; 
j,next:integer; 
begin 
sieve:=[2..n]; primes:=[];       { 将所有的候选数放入筛中,素数集合置空 } 
next:=2; 
repeat 
while not(next in sieve) do       
       next:=succ(next);             { 找筛中最小数next } 
primes:= primes+[next];          { 将筛中最小数next,放入素数集合中 } 
j:=next;    
    while j<=n do 
begin sieve:= sieve-[j]; j:=j+next end  { 将next的倍数从筛中筛去 } 
until sieve=[];                               
for next:=2 to n do 
if next in primes then write(next:5);      { 输出素数集合中的所有元素} 
writeln 
end.


-------说明--------

以上资料来自于网友的论坛或者博客收集,感谢他们的分享!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值