
- •1.1. Основные этапы создания программы
- •1.2. Алгоритмы
- •2.1. Структура типов в Turbo Pascal
- •Стандартные скалярные типы. Типы целых чисел
- •2.3. Операции побитовой обработки
- •2.4. Представление вещественных чисел в эвм
- •2.5. Символьный тип
- •2.6. Булевский тип
- •2.7. Перечисленный тип
- •2.8. Интервальный тип (диапазон)
- •3.1. Структура программы на turbo pascal
- •3.2. Основные операторы языка
- •3.2.1. Простые операторы
- •3.2.2. Операторы ввода-вывода
- •3.2.3. Структурные операторы
- •3.2.4. Условные операторы
- •3.2.5. Операторы повтора (цикла)
- •4.1. Массивы
- •4.2. Строковый тип
- •4.3. Множества
- •5.1. Процедуры и функции
- •5.2. Процедуры и функции пользователя
- •5.3. Передача параметров по значению и по ссылке
- •5.4. Рекурсивные процедуры и функции
- •6.1. Структура модулей
- •6.2. Компиляция и использование модулей
- •7.1. Записи
- •7.2. Вложенные записи
- •7.3. Записи с вариантами (вариантные записи)
- •7.4. Файлы
- •7.5. Подпрограммы для работы с файлами
- •7.5.1. Процедуры
- •7.5.2. Функции
- •7.6. Примеры программ для обработки файлов
- •7.7. Текстовые файлы
- •8.1. Структура оперативной памяти для программ на Turbo Pascal
- •8.2. Динамические структуры данных
- •8.3. Основные процедуры и функции для работы с динамическими переменными
- •8.4. Динамика выделения памяти в куче
- •8.5. Линейные списки. Способы создания и обработки
- •8.6. Нелинейные списки. Способы создания и обработки
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
4.3. Множества
Множество – это структурированный тип данных, представляющий набор взаимосвязанных по какому-либо признаку или группе признаков объектов, который можно рассматривать как единое целое.
Значения множественного типа строятся так же, как и массивы, из значений одного базового типа. В качестве базового типа множества используются дискретные типы не более чем с 256 различными значениями. Этим ограничениям удовлетворяют типы byte и char, а также перечисленные и ограниченные типы, образованные из них.
Под переменную типа множество отводится 256 бит. Контроль выхода за пределы диапазона осуществляется с помощью директивы компилятора {$R+}
Множество
определяется двоичным вектором, в
котором
-
й бит равен 1, если
-
является элементом множества. Главное
преимущество такой реализации является
то, что проверка принадлежности элемента
множеству, включение элемента в множество
и удаление элемента из множества можно
выполнять за фиксированное время
(независимо от размера множества) путем
прямой адресации к соответствующему
биту. Однако реализация операций
сложения, умножения множеств и нахождение
относительной разности множеств
выполняются за время, пропорциональное
размеру универсального множества.
Множества могут быть описаны такими способами:
1. type
c = (a, b, d);
p = set of c;
var
k: p; {Переменная типа множество}
2. type
c = set of (f, d, h);
var
65
k: c;
3. var k: set of (s,t,e);
4. var k: set of char;
5. type c =set of 0..100;
p = set of char;
var d: c;
k: p;
Множества задаются с помощью операторов присваивания:
k: = [ ]; {Задание пустого множества}
k: = [4,6,9];
k: = [‘a’...’z’, ‘0’.. ‘9’, ‘ ’]
В качестве элементов в изображении множества допускаются выражения, тип которых должен совпадать с базовым типом множества:
var k: set of byte;
x, y: byte;
begin
x: =1;
y: = 12;
k: = [x..x+10, 0, y-1, y+1];
end.
Для обработки множеств используются следующие операции:
1. Теоретико-множественное объединение, пересечение и вычитание.
2. Проверка принадлежности элемента множеству.
3. Проверка на равенство и неравенство множеств.
4. Проверка на принадлежность одного множества другому.
Объединением множеств a и b (a+b) называется множество, включающее в себя элементы множества a и множества b.
66
a b a+b
[1, 2, 3 ] [1,4,5] [1, 2, 3, 4, 5]
[‘a’..’z’] [‘e’..’z’] [‘a’..’z’]
[ ] [ ] [ ]
[1..10] [1..15] [1..15]
Пересечением множеств a и b (a*b) - называется множество, состоящее из элементов, принадлежащих одновременно множеству a и множеству b.
a b a*b
[1, 2, 3 ] [ 1, 4, 2, 6 ] [1, 2 ]
[1, 3, 5 ] [6, 8, ] [ ]
[‘a’..’z’] [‘b’..’r’] [‘b’..’r’]
[ ] [ ] [ ]
[1..10] [5..15] [5..10]
Разностью множеств a и b (a - b) называется множество, состоящее из элементов множества a, которые не входят во множество b.
a b a-b
[1, 2, 3, 4 ] [3, 4, 1 ] [2]
[‘a’..’z’] [‘d’..’z’] [‘a’..’c’]
[1..10] [5..15] [1..4]
Для проверки принадлежности элемента множеству используется операция in. Результатом этой операции является переменная логического типа.
Операция Результат
2 in [1, 2, 3, 4] - true
5 in [1, 2, 3, 4] - false
С помощью операции in следующий условный оператор
if (ch=’a’) or (ch=’b’) or (ch=’y’) then s;
можно заменить эквивалентным: if ch in [‘a’, ‘b’, ‘y’] then s;
Однако второй оператор является более компактным и выполняется гораздо быстрее.
67
Операция
проверки непринадлежности элемента
множеству
задается
следующей структурой:
if not (x in m) then s;
Проверка на равенство, неравенство и включение множества.
= равенство (совпадение) двух множеств;
< > неравенство множеств;
<= проверка на вхождение множества из левого операнда во множество из правого операнда;
>= проверка на вхождение множества из правого операнда в множество из левого операнда.
[1, 2, 3] = [1, 2] - false;
[1, 2, 3 ] >= [1, 2 ] - true;
[3, 5, 7 ] <= [1..10] - true;
[1, 2, 3 ] <> [1, 3] - true.
Использование множеств позволяет: упростить операцию if, повысить наглядность программ, экономить время на компиляцию и выполнение программы, уменьшает требования к памяти.
В качестве примера рассмотрим программу нахождения простых чисел в заданном ряде натуральных чисел методом решета Эратосфена. Метод состоит в последовательном удалении из исходного ряда, сначала чисел, делящихся на 2, затем на 3 и так далее до значения n. Числа, оставшиеся в ряду после этих действий, будут простыми.
Program er;
const n =256;
var
im, rm:set of 2..n; {Определение типа исходного}
{и результирующего множества}
next: byte; {Определение типа элемента,}
{включаемого в множество}
j: word;
68
begin
im: = [2..n]; {Задание исходного множества}
rm: = [ ]; {Задание начального значения }
{ результирующего множества}
next: =2;
repeat
{Если элемент next не входит в множество, то }
{переходят к следующему элементу ряда next: = next+1}
while not (next in im) do
next: = next + 1;
{В противном случае элемент next включается в}
{результирующее множество}
rm:= rm + next;
j: = next;
{Удаление из исходного ряда всех чисел, кратных next}
while j <= n do
begin
im: = im- [j];
j: =j + next;
end;
until im = [ ]; {Цикл repeat будет продолжаться}
{ до полного исчерпывания исходного}
{множества}
{Вывод множества простых чисел на экран}
for j: = 2 to n do
if j in rm then write(j:6);
end.
69
Контрольные вопросы и упражнения
1.
Если в базовом типе
различных значений, то сколько различных
значений в построенном на его основе
множественном типе?
2. Какие из следующих описаний множеств являются неверными:
3. Вычислить значения отношений:
a)
;
б)
;
в)
;
г)
;
д)
;
е)
;
ж)
;
з)
;
и)
;
к)
;
л)
;
м)
.
4. Написать программу, которая подсчитывает количество элементов в множестве типа:
;
5. Вычислить значения выражений:
а)
;
б)
;
в)
.
6. Дан текст из цифр и строчных латинских букв, за
70
которым
следует точка. Определить, каких букв
– гласных ()
или согласных, больше в этом тексте.
7.
Дан текст, за которым следует точка. В
алфавитном порядке напечатать (по одному
разу) все строчные русские гласные буквы
(),
входящие в этот текст.
8.
Подсчитать количество различных
(значащих) цифр в десятичной записи
натурального числа
(
;).
9.
Напечатать в возрастающем порядке все
цифры, не входящие в десятичную запись
натурального числа
(
;).
10. Дан текст из строчных латинских букв, за которым следует точка. Напечатать:
а) первые вхождения букв в текст, сохраняя их исходный порядок;
б) все буквы, входящее в текст не менее двух раз;
в) все буквы, входящие в текст по одному разу.
11.
В возрастающем порядке напечатать все
целые числа из диапазона
,
представимые в виде
,
где
.
12.
В порядке убывания вывести на экран все
целые числа из диапазона
,
которые представимы в виде
,
но не представимы в виде
13. Построить множество чисел Фибоначчи. Выделить подмножество чисел Фибоначчи, кратных заданному числу. Вывести на экран количество элементов в этом подмножестве (мощность множества) и само подмножество.
14.
Из множества чисел
выделить подмножество составных чисел
вида
,
где
и
-
простые числа.
15.
Из множества чисел
выделить пересечение подмножеств и
разность подмножеств вида
и
;
(
).
71
16.
Из множества чисел
выделить подмножество совершенных
чисел, то есть чисел, равных сумме своих
собственных делителей (6=3+2+1).
17.
Можно ли из букв слова
собрать слово
.
Буквы можно использовать несколько
раз.
18.
Не используя дополнительных переменных,
поменять местами значения переменных-множеств
и
.
19. Разработать программу для реализации основных операций над множествами для случая, если число элементов множества превосходит 256.
20. Разработать программу, которая на основе следующих данных
type город = (a, b, c, d, f, g, h);
города: = set of город;
рейсы: = array[город] of города;
по
рейсам
- множество городов, в которые можно за
один рейс доехать автобусом из города
)
определяет
-
множество городов, в которые можно
попасть автобусом (за один рейс или
через другие города) из города
.
ЗАНЯТИЕ 5. ПОДПРОГРАММЫ