Шаг 38.
Структурированные типы. Тип "множество"

    На этом шаге мы рассмотрим описание типа "множество".

    Термин "множество" в программировании используется аналогично его математическому пониманию. Отличие состоит в том, что в Object Pascal множества могут включать элементы только порядковых типов. Элементы какого-либо конкретного множества (переменной или типизированной константы) должны принадлежать одному типу, который называется базовым типом. Максимальное количество значений базового типа множества называется его мощностью. В Object Pascal в качестве базовых могут использоваться порядковые типы, мощность которых не превышает 256-ти значений. Кроме того, порядковые значения верхней и нижней границы базового типа не должны выходить за пределы диапазона от 0..255. Поэтому, в качестве базовых типов множеств не могут использоваться Integer, Word и некоторые другие.

    Приведем таблицу с графическим пояснением операций, допустимых для множеств.

Таблица 1. Операции над множествами
Математическое обозначение Обозначение в Borland Pascal Действие Пример
* Пересечение
+ Объединение
- Разность
in Принадлежность (элемента множеству)
<=
>=
Является подмножеством
Включает подмножество

    Множества представляют собой гибкий и наглядный механизм решения многих задач. В частности, их удобно использовать при обработке строк и текстов. В качестве примера рассмотрим следующую задачу.


    Задача. Подсчитать в текстовом файле отдельно число цифр и латинских букв.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
type
  CharSet = set of Char;
const
  Digits : CharSet = ['0'..'9'];
  Letters: CharSet = ['a'..'z','A'..'Z'];
var
  CountDig,
  CountLet : Word;
  Finp     : System.Text;
  Ch       : Char;
  S : String;
begin
  System.AssignFile (Finp, 'TESTSETS.DAT');
  System.Reset (Finp);
  CountDig := 0;
  CountLet := 0;
  while not eof (Finp) do
  begin
    Read ( Finp, Ch );
    if Ch in Digits then CountDig := CountDig + 1;
    if Ch in Letters then CountLet := CountLet + 1;
  end;
  Str (CountLet:5,S);
  Edit1.Text := S;
  Str (CountDig:5, S);
  Edit2.Text := S;
end;

end.
Текст этого примера можно взять здесь.

    Для исходного файла:

  a 0 b 6 fgrtrw4556 
  dgfg 567 #$%^%^ fhhf655 
  56456##$
будет получен такой результат:


Рис.1. Результат работы приложения

    Используемое в программе множество Letters при необходимости может быть получено из двух других множеств

    SmallLetters = ['а'..'z']; 
    BigLetters = ['A'..'Z'];
операцией сложения (объединения):
    Letters := SmallLetters + BigLetters;

    Возможно также и обратное действие: из множества Letters получить SmallLetters и BigLetters с помощью операции разности множеств.

    SmallLetters := Letters - ['A'..'Z']; 
    BigLetters := Letters - ['a'..'z'];

    На следующем шаге мы рассмотрим тип "запись".




Предыдущий шаг Содержание Следующий шаг