- •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. ПОДПРОГРАММЫ