
§2. Множества
2.1. Понятие множества в языке Паскаль
В математике множество ‑ это любая совокупность объектов, выбранная из универсального множества. Универсальным считается множество, содержащее сразу все рассматриваемые элементы. Например, про множество чисел от 1 до 10 можно было бы сказать так: оно выбрано из универсального множества "все числа от 1 до 100". В математике такое множество можно записать так: {1,2,...,9,10}. Другой пример: множество "все ученики одного класса и их оценки по информатике" выбрано из универсального множества "все ученики вообще и все полученные ими оценки по всем предметам".
Из сказанного следует, что объекты математического множества могут быть любой природы, они не являются упорядоченными, не повторяются и их количество неограниченно.
В Паскале множество - это структура данных, сохраняющая некоторые (не все) черты математических множеств. Как и в математике, повторяющиеся элементы множества игнорируются; не имеет значения и порядок их следования. Если в математике множество может содержать неограниченное число элементов, то в Паскале число элементов множества ограничено (не превышает 256). Кроме того, особенностью множеств в языке Паскаль является то, что все элементы должны быть одного и того же базового типа, т.е. в Паскале не является допустимым множество, состоящее из учеников и их оценок.
Базовый тип, в некотором смысле, играет роль универсального множества: он определяет перечень всех элементов, которые вообще могут содержаться в данном множестве. В качестве базового типа может выступать любой простой порядковый тип, такой, как char, перечисляемый, ограниченный, boolean, byte.
Таким образом, элементами множеств в Паскале не могут быть ни вещественные числа (Real не относится к порядковому типу), ни стринги (это не простой тип, и тем более не порядковый).
2.2. Объявление и конструирование множеств
Множества в программе могут быть объявлены в разделе описания типов или непосредственно в разделе описания переменных с помощью служебного слова set.
Первый способ объявления переменной типа множества (с использованием раздела типов Type ):
Type <имя типа> = set of <базовый тип>;
Var <имя множества> : <имя типа>;
Второй способ объявления переменной типа множества (в разделе переменных Var):
Var <имя множества> : set of <базовый тип>;
Например,
Первый способ |
Второй способ |
type MN1 = set of char; MN2 = set of byte; MN3 = set of 0..9; MN4 = set of '0'..'9'; MN5 = set of 'K'..'R'; MN6 = set of boolean; MN7 = set of (red, white, black); var s1:MN1; s2:MN2; s3:MN3; s4:MN4; s5:MN5; s6, s66 :MN6; s7, s77 : MN7;
|
. var s1 : set of char; s2 : set of byte; s3 : set of 0..9; s4 : set of '0'..'9'; s5 : set of 'K'..'R'; s6, s66 : set of boolean; s7, s77 : set of (red, white, black);
|
Объявление множества описывает полную совокупность принципиально возможных элементов, но при этом никаких значений в самой set- переменной (s1, ..., s77) не создает.
Значения множеств задаются в разделе операторов с помощью оператора присваивания. В левой части этого оператора стоит set-переменная, в правой - конструктор. Конструктор представляет собой список элементов базового типа, заключенный в квадратные скобки.
Пример 2. Конструируем множества, используя объявления их в примере 1.
s1 := ['*', 'a', '<', ' ', '2', '$']; s2 := [2..3, 5, 7, 100..120];
s3 := [5, 7..9, 3]; s4 := ['7', '9', '0'..'2'];
s5 := ['L','K', 'O'..'R']; s6 := [true..false];
s66:= [false, true]; s7 := [white.. black];
s77:= [black, red, white];
Замечание 1. Порядок следования элементов внутри скобок не имеет значения, также как не имеет значения число их повторений. Например, многократное включение элемента во множество эквивалентно однократному его упоминанию, т.е. на Паскале множество [2, 2, 6, 4, 6] эквивалентно множеству [4, 6, 2].
Замечание 2. Если во множестве нет ни одного элемента, то оно называется пустым и обозначается [] (открытая и закрытая квадратные скобки без пробела).
Конструируя множество, в качестве элементов мы можем использовать не только константы (как во всех предыдущих примерах), но и простые (скалярные) переменные, а также выражения, при условии, что их текущие значения попадают в допустимое множество значений базового типа. Например:
...........
var p1, p2, p3 : set of 0..9;
i,j: integer;
begin
i:= 3; j:= 5;
p1 := [i+3, j div 2, j..sqr(i) - 3];
p2 := [2*i..j];
p3 := [2*i, j]
..........
В результате выполнения оператора присваивания получим множества: p1={2, 5, 6}, p2 - пустое множество, p3={5, 6}.
Замечание 3. Необходимо различать конструктор множества [X..Y] и отрезковый тип X..Y. Если X>Y, то в первом случае речь идет о пустом множестве, во втором же случае компилятор зафиксирует ошибку. Например,
......... var s: set of (red, white, black); .......... begin s:= [black..red]; {множество s пустое} ..........
|
....... type MN = (red, white, black); var s: black..red; {вызовет ошибку компиляции} .......
|