- •А.Н. Горитов
- •Учебное пособие
- •Учебное пособие
- •Введение
- •1 Введение в предмет
- •1.1 Непрерывная и дискретная информация
- •1.2 Данные и эвм
- •1.3 Объекты предметной области
- •1.4 Представление информации об объектах
- •1.5 Абстрактные алфавиты. Кодирование
- •2 Основные типы и структуры данных эвм
- •2.1 Архитектурные особенности эвм, наиболее существенные для представления данных
- •2.2 Основные понятия о типах и структурах данных
- •2.3 Массивы
- •2.4 Строки
- •2.5 Записи
- •2.6 Записи с вариантами
- •2.7 Множества
- •3 Последовательный файл
- •3.1 Основные свойства последовательных файлов
- •3.2 Сортировка последовательных файлов
- •4 Полустатические структуры
- •4.1 Стек, очередь и дек как полустатические структуры
- •4.2 Представление полустатических структур с помощью массивов
- •5 Линейные динамические структуры
- •5.1 Основные свойства динамических структур
- •5.2 Реализация связного списка массивом
- •5.3 Кольцевой связный список
- •5.4 Линейный двусвязный список
- •6 Представление динамических структур с помощью указателей
- •6.1 Указатели
- •6.2 Представление стека
- •6.3 Представление очереди
- •6.4 Ведение динамических списков с помощью указателей
- •6.5 Алгоритм составления кольцевого двусвязного списка
- •7 Древовидные структуры данных
- •7.1 Основные понятия и определения
- •7.2 Представление деревьев в эвм
- •7.3 Основные операции с бинарными деревьями
- •7.4 Сильно ветвящиеся деревья
- •8 Алгоритмы на графах
- •8.1 Машинное представление графов
- •8.2 Поиск в глубину в графе
- •8.3 Поиск в ширину в графе
- •8.4 Стягивающие деревья (каркасы)
- •8.5 Отыскание фундаментального множества циклов в графе
- •8.6 Эйлеровы пути в графе
- •8.7 Алгоритмы с возвратом
- •8.8 Нахождение кратчайших путей в графе
- •8.9 Кратчайшие пути от фиксированной вершины
- •8.10 Алгоритм Дейкстры
- •8.11 Пути в бесконтурном графе
- •Литература
2.7 Множества
Множество является еще одной фундаментальной оперативной статической структурой. Множества – произвольный набор однотипных объектов, понимаемый как единое целое. Соответствующий тип описывается:
TYPE T = SET OF T0, где T0 - базовый тип элементов множества. Помним, что базовым типом может быть только перечислимый или интервальный.
Значениями переменной x типа T являются множества элементов типа T0. Они составляют множества всех подмножеств T0. Такое множество называется множеством-степенью. Т.е. можно сказать, что тип T – это множество-степень своего базового типа T0.
Порядок следования элементов для множества роли не играет.
Максимальное число элементов множества определяется реализацией. Для Паскаля количество элементов множества не должно превышать 256.
TYPE CHIS = SET OF 0..30;
TYPE DSET = SET OF DAY;
TYPE ZNSET = SET OF '*'..'/';
Соответствующие переменные описываются как
VAR CH : CHIS; D : DSET; ZN : ZNSET;
Операции над множествами нам уже известны. Заметим только, что это обычные операции теории множеств.
Присваивание: |
|
|
СН := [12]; |
D |
:= [SU, FR]; |
Объединение: |
|
|
А = [1, 2, 3, 4, 5] |
|
|
В = [2, 5, 6, 7, 8] |
|
|
А + В = [1, 2, 3, 4, 5, 6, 7, 8] | ||
Пересечение: |
|
|
А * В = [2, 5] |
|
|
Разность |
|
|
А-В = [1, 3, 4] |
|
|
Отношение |
|
|
Паскаль |
|
Математическая значение запись |
А = В |
|
(A = B) true false |
АОВ |
|
(А* В) |
А<=В |
|
(А<В) |
А=>В |
|
(А>В) |
x IN A |
|
(хе А) |
Ранг операций: |
|
|
1) * |
|
|
2) +, - |
|
|
3) IN |
|
|
Пример использования множеств – программа простого сканера в трансляторе. Сканер – программа, преобразующая последовательность символов в последовательность текстовых единиц транслируемого языка, так
называемых лексем. При каждом вызове сканер считывает нужное число входных символов и выдает одну выходную лексему. Конкретные правила трансляции следующие:
имеются следующие входные лексемы: "идентификатор", "число", "меньше-равно", "больше-равно", "присвоить" и лексемы, соответствующие отдельным символам: +, -, *, и т.д;
лексема "идентификатор" выдается по прочтении последовательности букв и цифр, начинающихся с буквы;
лексема "число" выдается по прочтении последовательности цифр;
лексемы "меньше-равно", "больше-равно" и "присвоить" выдаются по прочтении соответствующих пар символов <=, >=, :=;
пробелы и концы строк опускаются.
При работе программы полученная выходная лексема присваивается глобальной переменной sym. Назначение глобальных переменных id и num видно из программы. Глобальная переменная ch содержит текущий символ входной последовательности. Массив лексем S задает отображение символов в лексемы, его индексы ограничены лишь теми символами, которые не являются ни цифрами, ни буквами. Как видим, использование множеств символов позволяет программировать сканер независимо от их упорядоченности.
Текст программы:
VAR CH : CHAR; SYM : SYMBOL; NUM : INTEGER; ID : RECORD
K : 0..MAXK;
A : ARRAY[1..MAXK] OF CHAR END; PROCEDURE SCANNER; VAR CH1 : CHAR; BEGIN {пропуск пробелов}
WHILE CH = ' ' DO READ(CH); IF CH IN ['A'..'Z'] THEN
WITH ID DO BEGIN
SYM := IDENTIFIER; K := 0; REPEAT
IF K < MAXK THEN BEGIN K := K + 1; A[K] := CH END;
READ(CH) UNTIL NOT(CH IN ['A'..'Z','0'..'9']) END ELSE IF CH IN ['0'..'9'] THEN BEGIN
SYM := NUMBER; NUM := 0; REPEAT
NUM := 10 * NUM + ORD(CH) - ORD('0'); READ(CH) UNTIL NOT(CH IN ['0'..'9']) END ELSE
IF CH IN ['<',':','>'] THEN BEGIN CH1 := CH; READ(CH); IF CH = '=' THEN BEGIN IF CH1 = '<' THEN SYM := LEQ ELSE IF CH1 = '>' THEN SYM := GEQ
ELSE SYM := BECOMES; READ(CH) END
ELSE SYM := S[CH1] END ELSE BEGIN {другие символы}
SYM := S[CH]; READ(CH) END END {SCANNER};
Контрольные вопросы
Основные типы данных и их представление в памяти ЭВМ.
Понятие структуры. Логическая и физическая структуры.
Классификация структур.
Массив как структура данных.
Строка как структура данных.
Запись как структура данных. Оператор присоединения.
Записи с вариантами.
Множество как структура данных.