Описание языка PascalABC.NET | страница 34



type Person = record

name: string;

age: integer;

end;

var p1,p2: Person;

begin

p1.age := 20;

p2.age := 20;

p1.name := 'Ivanov';

p2.name := 'Ivanov';

writeln(p1=p2); // True

end.

Замечание

В отличие от Delphi Object Pascal, в PascalABC.NET отсутствуют записи с вариантами.

Множества

Множество представляет собой набор элементов одного типа. Элементы множества считаются неупорядоченными; каждый элемент может входить во множество не более одного раза. Тип множества описывается следующим образом:

set of базовый тип

В качестве базового может быть любой тип, в том числе строковый и классовый.

Например:

type

ByteSet = setof byte;

StringSet = setof string;

Digits = setof '0'..'9';

SeasonSet = setof (Winter,Spring,Summer,Autumn);

PersonSet = set of Person;

Элементы базового типа сравниваются на равенство следующим образом: у простых типов, строк и указателей сравниваются значения, у структурированных и у классов - значения всех элементов или полей. Однако, если поля относятся к ссылочному типу, то сравниваются только их адреса (неглубокое сравнение).

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

[список значений]

где в списке могут перечисляться через запятую либо выражения базового типа, либо (для порядковых типов) их диапазоны в виде a..b, где a и b - выражения базового типа. Например:

var

bs: ByteSet := [1,3,5,20..25];

fios: StringSet := ['Иванов','Петров','Сидорова'];

Значения в списке могут отсутствовать, тогда множество является пустым:

bs:=[];

Пустое множество совместимо по присваиванию с множеством любого типа.

Для множеств имеет место структурная эквивалентность типов.

Множества целых и множества на базе типа и его диапазонного подтипа или на базе двух диапазонных типов одного базового типа неявно преобразуются друг к другу. Если при присваивании s := s1 во множестве s1 содержатся элементы, которые не входят в диапазон значений базового типа для множества s, то они отсекаются.

Например:

var st: setof 3..9;

...

st := [1..5,8,10,12]; // в st попадут значения [3..5,8]

Операция in проверяет принадлежность элемента множеству:

if Wed in bestdays then ...

Для множеств определены операции + (объединение), - (разность), * (пересечение), = (равенство), <> (неравенство), <= (нестрогое вложение), < (строгое вложение), >= (нестрого содержит) и > (строго содержит).

Процедура write при выводе множества выводит все его элементы. Например,