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