Множества в языке Паскаль: описание, хранение, операции, вывод, использование
Когда мы произносим слово множество, подразумеваем большое количество объектов:
- множество целых чисел,
- множество латинских букв,
- множество слов.
В этой публикации расскажем, как использовать множества в языке Паскаль.
Множество — это набор уникальных неупорядоченных значений одного типа.
Описание (объявление) множества
var m:set of базовый тип;
Примеры
Целые числа
[’ Mazda ’,’ BMW ’,’ Audi ’]
Описание
в блоке var
m : set of integer ;
s : set of string ;
Хранение данных в множестве
m:=[3,4,6,8,9]; элементы множества заключаются в квадратные скобки и перечисляются через запятую
m:=[0..9]; диапазон значений через две точки
Операции над множествами
- пересечение
- объединение
- вычитание
Применение операций над множествами
Уроки на языке Pascal. Урок 20 (часть 2). Множества ( Set ).
m2:=m*m1; пересечение [3,4,9]
m2:=m+m1; объединение [3,4,6,8,9,15,20]
m2:=m1-m; разность [15,20]
Пустое множество
Как добавить значение в множество
m:=m+[x]; значение переменной x добавили в множество m
Операция вхождения in
Обратиться к элементу множества непосредственно нельзя. Но можно использовать операцию вхождения in.
Вывод множества на экран
for k:=10 to 24 do
if k in m then write(k); //если значение k принадлежит множеству m, то вывести k
В версии PascalABC.NET 3.8.2 множество можно вывести целиком:
Результат будет таким:
Использование множеств в задачах
Задача 1. Дано натуральное число. Сформировать множество его цифр (найти различные цифры числа)
В цикле while будем разбивать число на цифры и добавлять цифру в множество.
Исходные данные: n – натуральное число (тип integer)
Промежуточные данные: d – цифра числа (тип integer)
Выходные данные: m – множество цифр числа
Программа решения на языке Паскаль
var m:set of integer;
m:=[]; //пустое множество
writeln(‘Введите натуральное число’);
writeln(‘Множество цифр числа’);
Результат выполнения программы
Задача 2. Дан алфавит строчных русских букв, получить множество согласных букв вычитанием множества гласных букв.
Воспользуемся тем, что char является порядковым типом данных, в качестве букв алфавита возьмем множество b:=[‘а’..’я’] .
Множество гласных букв получим перечислением: g:=[‘у’,’е’,’ы’,’а’,’о’,’э’,’я’,’и’,’ю’]
Множество согласных букв получим вычитанием s:=b-g;
b – множество строчных русских букв
g – множество строчных гласных букв
Выходные данные: s – множество строчных согласных букв
Программа решения на языке Паскаль
var b,g,s:set of char;k:char;
if k in s then write(k,’ ‘);
Задача 3. Дана строка символов. Сколько в этой строке символов цифр?
Будем проверять принадлежность символа строки множеству символов цифр [‘0’..’9′] и копить счетчик.
Уроки на языке Pascal. Урок 20 (часть 1). Множества ( Set ).
Программа решения на языке Паскаль
for k:=1 to length(s) do
if s[k] in m then t:=t+1;
writeln(‘Символов цифр в строке: ‘,t);
Еще одна задача на применение операции вхождения in. Как проверить, есть ли в строке заданная подстрока.
Результат выполнения программы
Задача 4. Как найти все уникальные (неповторяющиеся) значения в массиве чисел?
Множества в Pascal
В Pascal множества обладают рядом особенностей. Все элементы одного множества должны принадлежать одному и тому же базовому типу. В качестве базового типа должен выступать порядковый тип, но не каждый.
Размер множества в Паскале ограничен предельно допустимым количеством элементов. Во множествах допускаются только такие элементы, порядковые значения которых в их базовых типах не выходят за границы 0..255. Для целочисленных множеств это означает, что в них могут присутствовать только числа от 0 до 255. Отрицательные элементы во множествах не допускаются.
Поэтому базовым типом не может выступать, например, integer . Если необходимо множество целочисленных объектов, то базовый тип должен объявлен как диапазон типа byte . Для символьных множеств базовым типом является char (в нем 256 значений с порядковыми номерами от 0 до 255).
Объявление множеств
В математике для обозначения множества используют фигурные скобки, например , в Паскале — квадратные, например [1, 3, 5]. Порядок элементов во множестве не имеет значения. Так множества [3, 6, 9] и [9, 3, 6] одинаковы.
По форме записи объявление переменной типа множество сходно с объявлением одномерного массива:
var имя: set of тип;
Например, объявление переменной ch как множества с базовым типом char , имеет вид:
var ch: set of char;
Можно сначала объявить тип множества, а потом использовать его для объявления переменных:
type t_ch = set of char; var ch1, ch2: t_ch;
Часто в качестве базового типа используются перечисления и диапазоны:
type week_days = (Mon, Tue, Wed, Thu, Fri); var work_days: set of week_days; lett: set of ‘A’..’Z’;
type nums = 5..25; var a: set of nums;
Объявление переменной-множества не присваивает ей набора значений.
Построение множества
Чтобы во множестве появились элементы, необходимо выполнить оператор присваивания, в левой части которого стоит имя переменной-множества, а в правой — конструктор множества или некоторое выражение над множествами.
Конструктор множества — это заключенный в квадратные скобки перечень элементов, разделенных запятыми. В качестве элементов могут использоваться диапазоны значений:
type week_days = (Mon, Tue, Wed, Thu, Fri); var work_days: set of week_days; lett: set of ‘A’..’Z’; begin work_days := [Mon, Wed, Thu]; lett := [‘C’, ‘E’..’M’, ‘Z’] end.
Следует помнить, что при задании множества порядок его элементов безразличен, но при задании диапазона такой порядок важен.
Множество, в котором нет элементов, называется пустым (или нуль-множеством). В языке программирования Паскаль обозначается квадратными скобками, между которыми нет элементов:
work_days := [ ];
Множество может быть объявлено типизированной константой, для чего в описании после знака равенства следует указать конструктор множества. Например:
const lett: set of [‘а’..’я’] = [‘а’, ‘е’, ‘и’, ‘о’, ‘у’, ‘ы’, ‘э’, ‘ю’, ‘я’];
Конструируя множества, можно использовать и переменные при условии, что их текущие значения попадают в диапазон базового типа множества. Так, если ch1 и ch2 имеют тип char , то допустима следующая последовательность операторов:
ch1 := ‘A’; ch2 := ‘K’; chs := [ch1, ch2, ‘M’];
В результате получится множество [‘A’, ‘K’, ‘M’].
Вывод элементов множества
В Pascal элементы множества нельзя вводить и выводить. Для организации их ввода-вывода следует использовать вспомогательные переменные. В то же время можно использовать множества как элементы типизированных файлов.
type nums = 0..10; var a: set of nums; i: byte; begin a := [3, 0, 2]; for i := 0 to 10 do if i in a then writeln(i); end.
0 2 3
Операции над множествами
- присвоение
- объединение
- пересечение
- дополнение
- тождественность
- нетождественность
- содержится во множестве
- содержит множество
- принадлежность элемента множеству
Объединение, пересечение и разность множеств
Над множествами выполнимы объединение (+), пересечение (*) и разность (-).
Объединение двух множеств A и B (A + B) – это новое множество, состоящее из элементов, принадлежащих множеству A или B, либо тому и другому одновременно.
var chs1, chs2, chs3: set of char; begin chs1 := [‘a’, ‘b’, ‘d’]; chs2 := [‘m’, ‘d’, ‘e’]; chs3 := chs1 + chs2 + [‘k’, ‘n’]; end.
Результат: chs3 = [‘a’, ‘b’, ‘d’, ‘m’, ‘e’, ‘k’, ‘n’].
Пересечение двух множеств A и B (A * B) – это множество, состоящее из элементов, одновременно принадлежащих множествам A и B.
chs3 := chs1 * chs2;
Результат: chs3 = [‘d’] .
Разность (дополнение) множеств A и B (A — B) – это новое множество, состоящее из элементов множества A, не вошедших в множество B.
chs1 := [‘a’, ‘e’, ‘t’]; chs2 := chs1 – [‘e’] < [‘a’, ‘t’] >chs3 := [‘m’, ‘n’, ‘t’] – chs2
Используя операции объединения, пересечения и разности, можно добавлять элементы к множествам или удалять их.
Для вставки и удаления элементов при работе с множествами в Pascal введены две процедуры:
include(имя_множества, элемент) exclude(имя_множества, элемент)
Первая из них позволяет выполнить добавление одного элемента в указанное множество, а вторая удалить. Например:
include (chs1, ‘g’); < аналогично chs1 + [‘g’] >exclude (chs2, ‘a’);
Операции сравнения множеств
Над множествами можно выполнять четыре операции сравнения: =, <>, >=,
Два множества A и B равны (A = B), если каждый элемент множества A является элементом множества B и наоборот.
Два множества A и B не равны (A <> B), если они отличаются хотя бы одним элементом.
Другими словами, операции = и <> используются для проверки эквивалентности: два значения переменной типа set считаются равными, если они состоят из одних и тех же элементов.
[1, 3] = [3, 1] возвращает true,
[1..3] = [1, 2, 3] возвращает true,
[1] <> [2] возвращает true,
[1, 2, 3] = [1, 4, 3] возвращает false,
[red, blue] = [red, yellow] возвращает false.
Множество A является подмножеством множества B (A = A), если каждый элемент из A присутствует в B.
Пустое множество [ ] содержится во всех множествах, т.е. всегда [ ]
in — операция проверки принадлежности элемента множеству
Имеется возможность выяснить, принадлежит ли данный элемент некоторому множеству. Для этого служит операция in . Пусть A – множество элементов некоторого базового типа, а x – переменная этого типа. Тогда выражение x in A истинно, если значение x является элементом множества A .
red in [red, yellow] возвращает true ;
red in [blue, green] возвращает false .
Замечание 1. Чтобы проверить, является ли значение n цифрой, удобно использовать операцию in следующим образом:
if n in [0..9] then …
Замечание 2. Результат операции in может быть неопределенным в некоторых случаях. Пусть:
a: set of 1..50; x: integer.
Если присвоить x число, большее максимального значения 50 (например, x := 55 ), то в этом случае результат операции x in a не всегда false .
Все операции сравнения множеств, а также операция in возвращают логическое значение true или false .
Приоритеты операций над множествами
В сложных выражениях над множествами операции имеют следующие приоритеты:
Источник: pas1.ru
1.6. Использование множеств в языке Паскаль
В языке Паскаль множеством называется конечный неупорядоченный набор элементов [2]. Все элементы одного множества должны принадлежать к одному и тому же типу, который называется базовым типом данного множества. В качестве базового типа можно использовать любой простой тип, кроме вещественного. Множество должно быть описано в разделе описания типов. Общий вид описания:
Type имя=set of базовый_тип;
Пусть в нашем распоряжении имеется множество монет различного достоинства: 1р, 5р и 10р. Из этих монет можно составить следующее подмножества (их число равно 2 3 =8):
1р; 5р; 10р; 1р, 5р; 1р, 10р; 5р, 10р; 1р, 5р, 10р; пустое множество.
Эти подмножества и будут принадлежать некоторому множеству sum. Сами элементы (монеты), из которых состоит подмножество, пусть принадлежат некоторому базовому типу monet. Тогда описание будет иметь вид:
Var sum:set of monet;
В программе значение переменной типа «множество» изображается путем перечисления конкретных компонентов подмножества, разделенных запятыми и заключенных в скобки [ ]. Такие изображения называются конструкторами множеств. Например: [r1], [r1,r10].
С переменной типа set допустимы следующие операции: =, <>, >=,
Пример использования операции присваивания:
В этом случае в ячейку k будет записана комбинация [3,4,5,6].
Операции = и <> используются для проверки эквивалентности: два значения переменной типа set считаются равными, если они состоят из одних и тех же элементов.
[1,3]=[3,1] – дает True;
[1..3]=[1,2,3] – дает True;
[1,2,3]=[1,4,3] – дает False.
Операция In используется для установления наличия определенного элемента в множестве. Так, если x есть элемент множества b, то (x In b) дает True.
Пример: [3]In [1,2,3] дает True.
Если a и b – операнды, имеющие один и тот же конкретный тип, то к ним применимы операции:
Так, a+b представляет собой объединение множества элементов, входящих в a или в b (одинаковые элементы не повторяются); a–b – это множество элементов, которые есть в a, но отсутствуют в b; a*b представляет собой объединение множества элементов, входящих в множества a и b одновременно.
Операция a:=a+x добавляет элемент x к множеству a, а операция a:=a–x исключает x из a.
Рассмотрим несколько примеров решения задач на Паскале, использующих множества [3].
З а д а ч а 1. Задать множество целых чисел от заданного числа до числа в три раза большего, чем заданное.
Решение. Используем описание множеств на языке Паскаль и операторы для работы с множествами.
Если количество элементов n в множестве известно заранее, то задача решается так:
type setnum=set of byte;
Если начальное значение задается пользователем, то задача решается так:
type setnum=set of byte;
begin write(‘задайте первый элемент множества ‘);
else write(‘заданное количество элементов не поместится в множестве ‘);
З а д а ч а 2. Вывести на экран элементы множества, содержащего прописные и строчные буквы латинского алфавита.
Решение. В цикле проверим вхождение всех элементов базового типа и выведем те, которые входят в множество.
var zn:set of ‘A’..’z’;
begin for i:=’A’ to ‘Z’ do
if i in zn then write(i,’ ‘);
if i in zn then write(i,’ ‘);
З а д а ч а 3. Написать программу, которая в заданном слове, состоящем из строчных букв, определяет составляющие его буквы, глухие и звонкие согласные, затем все согласные и все гласные буквы.
Решение.
type setchar=set of char;
Источник: studfile.net