• 集合(Sets)


    集合是Pascal特有的一种数据类型。集合用一种有效的手段来表示一组有序数、字符和枚举值,它们包含的值没有内在的顺序,且一个值在集合中包含两次并没有实际意义。
    一个集合类型的取值范围,是构成它的有序类型(称为基础类型)的幂,也就是说,集合可能的值是基础类型的所有子集,也包含空集。基础类型可能的值不要超过256 个,并且它们的序数必须在 0 到255之间。任何像下面的形式: 
    set of baseType
    声明一个集合类型,这里,baseType 是一个合适的有序类型。
    因为基础类型的值是有限的,因此,集合类型通常使用子界类型来定义。

    在Object Inspector中,Form窗体的Font属性中的Style样式就属于集合类型,包括了fsBold,fsItalic,fsUnderline和fsStrikeOut四个样式类型,如下图:

    0046

    下面我们来写一个完整的例子,来说明如何声明集合类型,定义集合变量及如何操作它们:

    1、新建一个Console Application

    2、详细代码如下,请仔细阅读注释。

    program Project1;
    {$APPTYPE CONSOLE}
    uses
      SysUtils, Graphics;  { Graphics单元包含了TFontStyles集合}
    type
      TIntSet = set of 1..250;
    //等同于下面的语句
    //TSomeInts = 1..250; { 子界类型}
    //TIntSet = set   of TSomeInts;  { 以子界类型为基类的集合}
      TCharSet = set of Char;   { 可能的值#0~#255}
      TByteSet = set of Byte;   { 可能的值0~255}
      TEnum = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
      TEnumSet = set of TEnum;  { 包含了TEnum值的任意组合}
    var
      MySet: set of 'a'..'z';  { 也可以直接使用set of …构造直接声明变量}
      Set1, Set2: TIntSet;     { TIntSet集合的变量}
      Style: TFontStyles;
      EnumSet: TEnumSet;
    begin
      MySet := ['a','b','c'];  { 利用方括号来使用集合变量并给它赋值}
      Set1 := [1, 3, 5, 7, 9];
      Set2 := [2, 4, 6, 8, 10];
      EnumSet := [];           { 空集合,无元素}
      Style := [fsBold, fsItalic];
      { 利用in运算符来判断一个给定元素是否在一个集合中}
      if 'a' in MySet then
        Writeln('''a'' 元素在MySet集合中')   { 'a'在MySet中,此句得到执行}
      else
        Writeln('''a'' 元素不在MySet集合中');
      { 用+、-运算符或者Include()、Exclude()过程,能对一个集合变量增删元素}
      Include(MySet, 'd');  { MySet中增加一个'd'}
      if 'd' in MySet then Writeln('''d'' 已经增加到MySet集合, Include()');
      Exclude(MySet, 'd');
      if not ('d' in MySet) then Writeln('''d'' 已经从MySet集合中删除, Exclude()');
      MySet := MySet + ['e'];
      if 'e' in MySet then Writeln('''e'' 已经增加到MySet集合, +');
      MySet := MySet - ['e'];
      if not ('e' in MySet) then Writeln('''e'' 已经从MySet集合中删除, -');
      { 交集 Set1*Set2,可以判断在一个给定的集合中是否有某几个元素}
      if [1, 3, 5] * Set1 = [1, 3, 5] then
        Writeln('Set1集合中包含了[1, 3, 5]这三个元素')
      else
        Writeln('Set1集合中不包含[1, 3, 5]这三个元素');
      Readln;
    end.

    3、F9运行,查看结果以验证我们上面的代码,结果如下:

    0050

    4、结果和我们在代码中的逻辑完全符合。

    Tip

    尽可能使用Include()和Exclude()来增删元素,尽可能少使用+、-运算符。因为Include()和Exclude()仅仅需要一条机器指令,而+、-则需要13+6n(n是集合的按位的长度)条机器指令。

    以上代码均在Delphi7中测试通过,示例代码下载:20111227集合(Sets).rar

  • 相关阅读:
    数据库常用术语
    灾备模式的基本体系架构
    linux下的c++开发
    视图矩阵的推导-opengl应用
    抓包实例
    以软件推动工业进步 -嵌入式学习网站
    web 前端 转盘界面
    web 汇率
    xml
    高性能网站架构设计之缓存篇(4)- 主从复制
  • 原文地址:https://www.cnblogs.com/pchmonster/p/2303134.html
Copyright © 2020-2023  润新知