1.6. Использование множеств в языке Паскаль
В языке Паскаль множеством называется конечный неупорядоченный набор элементов [2]. Все элементы одного множества должны принадлежать к одному и тому же типу, который называется базовым типом данного множества. В качестве базового типа можно использовать любой простой тип, кроме вещественного. Множество должно быть описано в разделе описания типов. Общий вид описания:
Type имя=set of базовый_тип;
Пример.
Пусть в нашем распоряжении имеется множество монет различного достоинства: 1р, 5р и 10р. Из этих монет можно составить следующее подмножества (их число равно 23=8):
1р; 5р; 10р; 1р, 5р; 1р, 10р; 5р, 10р; 1р, 5р, 10р; пустое множество.
Эти подмножества и будут принадлежать некоторому множеству sum. Сами элементы (монеты), из которых состоит подмножество, пусть принадлежат некоторому базовому типу monet. Тогда описание будет иметь вид:
Type monet=(r1,r5,r10);
Var sum:set of monet;
В программе значение переменной типа «множество» изображается путем перечисления конкретных компонентов подмножества, разделенных запятыми и заключенных в скобки [ ]. Такие изображения называются конструкторами множеств. Например: [r1], [r1,r10].
С переменной типа set допустимы следующие операции: =, <>, >=, <=, In, +, – , *, :=.
Пример использования операции присваивания:
Type n=1..9;
Var k:set of n;
. . . . . . . .
k:=[3..6];
В этом случае в ячейку k будет записана комбинация [3,4,5,6].
Операции = и <> используются для проверки эквивалентности: два значения переменной типа set считаются равными, если они состоят из одних и тех же элементов.
Пример.
[1,3]=[3,1] – дает True;
[1..3]=[1,2,3] – дает True;
[1]<>[2] – дает True;
[1,2,3]=[1,4,3] – дает False.
Операции >= и <= используются для проверки принадлежности одного множества другому: так, если множество а содержится в множестве b, то а<=b дает True. Например: [1,2]<=[1,2,3] дает True.
Операция 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 одновременно.
Пример.
[1,3]+[1,4] – дает [1,3,4];
[1,3]–[1,4] – дает [3];
[1,3]*[1,4] – дает [1].
Операция a:=a+x добавляет элемент x к множеству a, а операция a:=a–x исключает x из a.
Рассмотрим несколько примеров решения задач на Паскале, использующих множества [3].
З а д а ч а 1. Задать множество целых чисел от заданного числа до числа в три раза большего, чем заданное.
Решение. Используем описание множеств на языке Паскаль и операторы для работы с множествами.
Если количество элементов n в множестве известно заранее, то задача решается так:
const n=50;
type setnum=set of byte;
const mn:setnum=[n..3*n];
{В тексте программы остается использовать созданное множество}.
Если начальное значение задается пользователем, то задача решается так:
type setnum=set of byte;
var mn:setnum;
n,i:byte;
begin write('задайте первый элемент множества ');
readln(n);
if 3*n<256 then for i:=n to 3*n do mn:=mn+[i]
else write('заданное количество элементов не поместится в множестве ');
end.
З а д а ч а 2. Вывести на экран элементы множества, содержащего прописные и строчные буквы латинского алфавита.
Решение. В цикле проверим вхождение всех элементов базового типа и выведем те, которые входят в множество.
var zn:set of 'A'..'z';
i:char;
begin for i:='A' to 'Z' do
if i in zn then write(i,' ');
for i:='a' to 'z' do
if i in zn then write(i,' ');
end.
З а д а ч а 3. Написать программу, которая в заданном слове, состоящем из строчных букв, определяет составляющие его буквы, глухие и звонкие согласные, затем все согласные и все гласные буквы.
Решение.
type setchar=set of char;
const GL:setchar=['п','ф','к','т','ш','с','х','ц','ч',
'щ'];{множество глухих согласных}
ZV:setchar=['л','м','н','р','й','б','в','г','д','ж',
'з']; {множество звонких согласных}
ALF:string='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
{строка – русский алфавит}
var s:string; {заданное русское слово}
i:integer; {номер обрабатываемого символа в слове}
mgl:setchar; {множество глухих согласных}
mzv:setchar; {множество звонких согласных}
buk:setchar; {множество всех букв слова}
sog:setchar; {множество согласных слова}
gla:setchar; {множество гласных слова}
procedure print(s:string;mn:setchar);
{процедура вывода элементов множества с предшествующим комментарием}
var i:integer;
begin write(s,' ');
for i:=1 to length(ALF) do
if ALF[i] in mn then write(ALF[i],' ');
writeln;
end;
begin write('Введите русское слово ');
readln(s);
mgl:=[]; mzv:=[]; buk:=[];
{вначале множества букв пусты}
for i:=1 to length(s) do
begin buk:=buk+[s[i]]; {объединили букву с множеством букв}
if s[i] in GL
then mgl:=mgl+[s[i]]
{объединили глухую согласную с множеством глухих согласных}
else if s[i] in ZV
then mzv:=mzv+[s[i]];
{объединили звонкую согласную с множеством
звонких согласных}
end;
{находим множество согласных букв}
sog:=mgl+mzv;
{находим множество гласных букв}
gla:=buk-(sog+['ь','ъ']);
print('слово состоит из букв; ',buk);
print('гласные буквы: ',gla);
print('согласные буквы: ',sog);
print('глухие согласные: ',mgl);
print('звонкие согласные; ',mzv);
end.
З а д а ч а 4. Написать программу для нахождения простых чисел с помощью «решета Эратосфена».
Решение.
1. Поместим все числа между 2 и n (n<=255) в решето.
2. Выберем из решета наименьшее из чисел.
3. Поместим это число среди простых.
4. Переберем и вынем из решета все числа, кратные данному.
5. Если решето не пустое, то повторим шаги 2–5.
const n=255; {количество элементов в множестве}
var interval, {решето}
prost:setof2..n; {множество простых чисел}
next:integer; {наименьшее число в решете}
c:integer; {новое простое число}
j:integer; {переменная для удаления из решета чисел,кратных текущему простому числу}
begininterval:=[2..n];
prost:= [];
next:= 2;
repeat {поиск очередного простого числа}
while not (next in interval) do next:=succ(next);
prost:=prost+[next];
c:=2*next–1;
j:=next;
while j<=n do
begin interval:=interval–[j]; j:=j=c; end;
until interval=[];
end.
- Содержание
- 6. Элементарные двоичные переключательные функции
- 7. Основные законы булевой алгебры и преобразование
- Приложение 2. Варианты контрольных заданий по дисциплине
- Предисловие
- Дискретная математика
- 1. Множества и алгебраические системы. Булевы алгебры
- 1.1. Основные понятия теории множеств
- 1.2. Основные операции над множествами
- 1.3. Декартово произведение множеств
- 1.4. Соответствия и функции
- 1.5. Отношения
- 1.6. Использование множеств в языке Паскаль
- 2. Элементы общей алгебры
- 2.1. Операции на множествах
- 2.2. Группа подстановок Галуа
- 2.3. Алгебра множеств (алгебра Кантора)
- 2.4. Алгебраические системы. Решетки
- 2.5. Задание множеств конституентами
- 2.6. Решение уравнений в алгебре множеств.
- 3. Элементы комбинаторики
- 3.1. Комбинаторные вычисления
- 3.2. Основные понятия комбинаторики
- 3.3. Размещения
- 3.4. Перестановки
- 3.5. Сочетания
- 3.6. Треугольник Паскаля.
- 3.7. Бином Ньютона
- 3.8. Решение комбинаторных уравнений
- 4. Основные понятия теории графов
- 4.1. Способы задания графов
- 4.2. Характеристики графов
- 4.3. Понятие о задачах на графах
- 4.4. Задача о Ханойской башне
- 5. Переключательные функции и способы их задания
- 5.1. Понятие о переключательных функциях
- 5.2. Двоичные переключательные функции и способы их задания
- 5.3. Основные бинарные логические операции
- 5.4. Понятие о переключательных схемах и технической реализации переключательных функций
- 5.5. Использование логических операций в теории графов
- 6. Элементарные двоичные переключательные функции и функциональная полнота систем переключательных функций
- 6.1. Элементарные переключательные функции одной переменной
- 6.2. Элементарные переключательные (логические) функции двух переменных
- 6.3. Функциональная полнота систем переключательных функций
- 6.4. Базисы представления переключательных функций
- 6.5. Пример анализа и определения свойств пф, заданной десятичным номером
- 7. Основные законы булевой алгебры и преобразование переключательных функций
- 7.1. Основные законы булевой алгебры переключательных функций
- 7.2. Равносильные преобразования. Упрощение формул алгебры переключательных функций
- 7.3. Преобразование форм представления переключательных функций
- 8. Минимизация переключательных функций
- 8.1. Цель минимизации переключательных функций
- 8.2. Основные понятия и определения, используемые при минимизации
- 8.3. Аналитические методы минимизации переключательных функций
- 8.4. Минимизация переключательных функций по картам Карно
- 8.5. Метод поразрядного сравнения рабочих и запрещенных наборов
- Минимизация переключательных функций на основе поразрядного сравнения рабочих и запрещенных восьмеричных наборов.
- 8.6. Минимизация переключательных функций, заданных в базисе {, и, не}
- 8.7. Минимизация систем переключательных функций
- 8.8. Минимизация переключательных функций методом неопределенных коэффициентов
- 9. Понятие об автомате и его математическом описании
- 9.1. Основные определения теории конечных автоматов
- 9.2. Описание конечных детерминированных автоматов
- 9.3. Понятие о технической интерпретации конечных автоматов
- 9.4. Синтез комбинационных автоматов в заданном базисе
- 9.5. Булева производная
- 9.6. Элементарные автоматы памяти на основе комбинационного автомата и задержки
- 9.7. Синтез автомата – распознавателя последовательности
- 10. Элементы теории кодирования
- 10.1. Понятие о кодировании
- 10.2. Системы счисления, как основа различных кодов
- 10.3. Понятие о помехоустойчивом кодировании
- 10.4. Кодирование по Хэммингу
- 10.5. Кодирование с использованием циклических кодов и математического аппарата умножения и деления полиномов. Сигнатурный анализ
- 10.6. Понятие о криптографической защите информации
- 10.7. Понятие о сжатии информации