- •1.1.2 Классификация структур данных
- •1.1.3 Обозначения и договоренности
- •1.1.4 Множества.
- •1.1.5 Прямоугольные структуры. Массивы
- •Лекция 2
- •2.1 Прямоугольные структуры. Таблицы
- •2.2 Реализация с использованием параллельных массивов (статическое представление таблицы)
- •2.3 Реализация операций для неупорядоченной таблицы с использованием статической памяти
- •2.4 Динамическая память. Куча
- •2.5 Операции над указателями
- •2.6 Геометрическая интерпретация
- •2.7 Динамическая цепочка
- •2.8 Реализация операций для неупорядоченной таблицы с использованием динамической памяти
- •3.2 Обратная польская (постфиксная) запись
- •Лекция 4
- •4.1 Списковые структуры. Линейный список
- •Атом есть линейный список (атомарный);
- •Атом есть линейный список (атомарный);
- •4.2 Об операции "расчленение"
- •4.3 Логическое описание линейного списка.
- •4.4 Вычисление значения арифметического выражения
- •Лекция 5
- •5.1 Деревья
- •5.2 Бинарные деревья
- •5.5 Дерево двоичного поиска
- •7.2 Инструментальные средства. Архивация файлов (пока без сжатия)
- •7.3 Программы хранения и обработки информации
- •7.4 Код Цезаря
- •7.5 Упаковка текста
- •7.6 Код Хаффмана
- •7.7 Код Хемминга
- •7.8 Вектор Айлиффа
- •Вектор Айлиффа
- •Лекция 8
- •8.1 Сортировка – перестановка элементов линейной структуры
- •8.2 Алгоритмы сортировки Три класса алгоритмов сортировки (включением, выбором, обменом)
- •8.2.1 Сортировка простым включением.
- •9.2 Источники погрешностей
- •9.3 Классификация погрешностей
- •9.4 Терминология
- •FoRmula traNslation (станд.66, станд.77(*))
- •10.0 Бланк для записи текста программы на Фортране
- •10.1 Элементы языка
- •10.2 Типы данных и операции
- •10.3 Описание переменных и констант
- •10.4 Арифметические операции
- •11.3 Операторы присваивания
- •11.4 Оператор continue
- •11.5 Оператор безусловной передачи управления
- •11.6 Вычисляемый оператор передачи управления
- •11.7 Оператор передачи управления по предписанию
- •11.8 Арифметический оператор условной передачи управления
- •11.9 Логический оператор условной передачи управления
- •11.10 Структурный оператор условной передачи управления*
- •11.11 Оператор цикла с параметром
- •Лекция 12
- •12.1 Реализация стандартных структур
- •12.2 Операции ввода/вывода
- •12.3 Операторы ввода/вывода
- •12.4 Оператор формата (format)
- •12.5 Логическая запись
- •12.6 Взаимодействие операторов в/в и оператора format.
- •Расширенная форма оператора read
- •12.7 Управляющие символы при печати
- •12.8 Представление целого и действительного в памяти.
- •12.9 Оператор data
- •12.10 Сравнение текстовых данных
- •12.11 Функции для данных типа character
- •Лекция 13
- •13.1 Программные единицы
- •13.2 Библиотечные и встроенные функции
- •13.3 Оператор-функция
- •Правило соответствия: Списки формальных и фактических параметров согласованы по количеству, типу и порядку следования. Пример
- •13.4 Подпрограмма-функция
- •13.5 Подпрограмма-процедура
- •О соответствии фактических и формальных параметров
- •13.6 Операторы external и intrinsic
- •Пример (параметр-переменная и параметр-значение)
- •14.3 Операторы ввода и вывода.
- •14.4 Параметры операторов ввода и вывода
- •Открытие (присоединение) файла.
- •14.5 Операторы open и close
- •14.6 Оператор read
- •14.7 Оператор write
- •14.8 Другие операторы
2.5 Операции над указателями
Указатель может находиться в одном из трех состояний:
Указатель не инициализирован. Можно только инициализировать значением другого (инициализированного) указателя, процедурой NEW, или константой NIL;
Указатель инициализирован процедурой NEW. Можно использовать динамическую переменную q^, как переменную типа T, сам указатель сравнивать с другими указателями (только на совпадение или несовпадение), переинициализировать любым способом (см.1.);
Указатель инициализирован константой NIL. Можно указатель сравнивать с другими указателями (только на совпадение или несовпадение), переинициализировать любым способом (см.1.);
Операция взятия адреса.
program adres;
var x:real;
p:^real;
begin
x:=3.1415;
p:=@x;
writeln(integer(p),p^)
end.
2.6 Геометрическая интерпретация
Указатель q:^T;
NEW(q);
Куча;
Диспетчер Динамической Памяти;
q^:T;
2.7 Динамическая цепочка
Pelem=^Elem;
Elem=Record inf:Inform, next:PElem end
Считаем, что Inf=real;
Таблица задается инициализированным указателем p.
Задача: Распечатать третью запись цепочки, если она есть (печать p^.след^.след^.инф)
Задача: Распечатать k-ую запись цепочки.
q:=p;
i:=1;
while (q<>nil) and (i<k) do
begin
i:=i+1;
q:=q^.next;
end;
if q<>nil then writeln(q^.inf) else writeln(‘нет записи’);
2.8 Реализация операций для неупорядоченной таблицы с использованием динамической памяти
PElem = ^Elem;
Elem=record кл:Key; инф:Inf, след:Pelem end;
Заголовок |
Действие |
Создать (var p:PElem) |
p:=NIL |
Таблица пуста? (p:PElem): Boolean |
Таблица пуста?:= p=NIL |
Добавить в начало (var p:PElem,x:Key,i:Inf) (доп. перем p1:PElem) |
NEW(p1); p1^.кл:=x; p1^.инф:=i; p1^.след:=p; p:=p1; |
Добавить в конец (var p:PElem,x:Key,i:Inf) (доп. перем p1,p2:PElem) (можно обойтись одной доп. перем.) |
p1:=p; p2:=p; while p1<>NIL do begin p2:=p1; p1:=p1^.след end; NEW(p1); p1^.кл:=x; p1^.инф:=i; p1^.след:=p; p2^.след:=p1; |
Найти по ключу(p:PElem,x:Key) : PElem (доп. перем. p1:PElem) |
p1:=p; while (p1<>NIL)and(p1^.кл<>x) do p1:=p1^.след; Найти по ключу:=p1 |
Удалить запись таблицы, заданную ключем, если она есть(var p:PElem,x:Key): (доп. перем. p1,p2:PElem) |
p1:=p; p2:=p; while (p1<>NIL)and(p1^.кл<>x) do begin p2:=p1; p1:=p1^.след end; if p1<>NIL then if p1:=p2 then begin p:=p1^.след; DISPOSE(p1) end else begin p2^.след:=p1^.след; DISPOSE(p1) end |
Задача
Реализовать операции для упорядоченной по ключу и упорядоченной по частоте обращения таблиц.
Лекция 3
3.1 Структуры ряда
Последовательный набор записей (цепочка). Доступ к записям структуры ряда осуществляется последовательным просмотром записей цепочки. Определена последующая запись для каждой записи цепочки, кроме последней, и определена предыдущая запись для каждой записи, кроме первой. Структуры ряда подразделяются на строки, очереди, стеки и деки.
3.1.1 Строки
Строка - структура ряда, в которой открыт доступ к любому элементу (любой записи) через последовательный просмотр как от начала цепочки к концу, так и от коца цепочки к началу. Пусть Е - множество элементарных данных, Е(К) - множество всех последовательностей, состоящих из К элементов множества Е, т.е. элементами множества Е(К) являются строки длиной К. В таблице приведены основные операции над строками (использованы обозначения аЕ(К1), вЕ(К2), сЕ(К3), авЕ(К1+К2), авсЕ(К1+К2+К3) и т.д., dЕ(К1-К2+К3))
Имя операции |
Функциональные спецификации |
Аргументы |
Результат |
О п и с а н и е |
Конкатенация |
Е(К1)Е(К2) Е(К1+К2) |
а, в |
ав |
Строка, полученная склейкой строк а и в |
Вычеркивание подстроки |
Е(К1+К2+К3) Е(К1+К3) |
авс |
ас |
Строка, полученная из авс отбрасыванием в |
Разделение |
Е(К1+К2) Е(К1)Е(К2) |
ав |
а, в |
Разделение на две строки |
Подстановка |
Е(К1+К2)Е(К3) Е(К1+К3+К2) |
ав, с |
асв |
Подстановка |
Контекстный поиск? |
Е(К1)Е(К2) Boolean |
а, в |
истина или ложь |
Истина, если в строке а есть подстрока в |
Контекстная замена |
Е(К1)Е(К2)Е(К3) Е(К1-К2+К3) |
а, в, с |
либо d, либо а |
Если контекст в найден в а, то он заменяется на контекст с, иначе без изменения |
Представление с помощью массивов
N - максимальная длина строки, s1,s2,... :array[1..N] of Inf.
Задача: реализовать операции над строками, представляя строки с помощью массивов.
Динамическое представление строки.
PAtom=^Atom; Atom = record инф:Inf; пред,след:PAtom end
Пример:
конкатенация(p1,p2:PAtom),
причем p1 и p2 - непустые строки,
результат - строка p1,
p:PAtom.
Где в алгоритме используется «непустота» строк?
Задача.
Реализовать операции над строками.
3.1.2 Очередь, стек, дек
Всем перечисленным структурам свойственна операция "выборка" (чтение с удалением).
Очередью называется структура данных, добавление записи в которую производится в конец цепочки, а выборка осуществляется из начала цепочки. Очередь работает по принципу
FIFO (First-In, First-Out) – поступивший первым, обслуживается первым.
Стеком называется структура данных, добавление записи в которую и выборка записи из которой производится из начала цепочки (вершины стека). Стек работает по принципу LIFO (Last-In, First-Out) – поступивший последним, обслуживается первым.
Деком называется структура данных, у которой добавление и выборка записей осуществляется как в начале, так и в конце цепочки. Дек является обобщением структур данных очередь и стек.
Логические описания.
Пусть записи принадлежат типу Inf; S - стек; S' - непустой стек; О - очередь; О'- непустая очередь.
Тогда можно определить стек и очередь следующим образом:
Стек
S=(пусто¦S');
S'=(i:Inf,s:S)
Oчередь
О=(пусто¦О');
О'=(i:Inf,o:O¦o:O,i:Inf).
Это рекурсивные определения структур стек и очередь. Рекурсивное определение предполагает использование рекурсивных алгоритмов при реализации операций.
Операции над деком включают все операции, перечисленные в таблице, учитывая, что S и O есть частные случаи дека.
Имя операции |
Функциональ-ные спецификации |
Аргументы |
Результат |
Описание |
Создать |
S O |
|
пустой s пустая o |
Создается пустой стек или очередь |
Пусто? |
SBoolean OBoolean |
s o |
истина или ложь |
Пуст ли стек, или очередь ? |
Первый |
ST OT |
(t, s) (t, o) |
t t |
Определение элемента подлежащего обслуживанию |
Выборка |
SS OO |
(t, s) (t, o) |
s o |
Из стека или очереди удален первый элемент |
Добавление |
TSS TOO |
t, s t, o |
(t, s) (t,o) |
Добавлен новый элемент |
Задача.
Представить структуры очереди, стека и дека с помощью массивов и реализовать операции.
При динамическом представлении структур записи можно представить так:
PElem=^Elem;
Elem = (инф:Inf; след:PElem).
Для удобства реализаций стек задается одним указателем на голову, а очередь и дек - двумя (на первый и последний элемент)
Задачи
Выборка(p:Pelem,i:Inf) - из структуры p (очередь или стек) выбрать в i данное.
Пусть p не пуст, тогда
i=p^.инф; p1=p; p=p^.след; DISPOSE(p1)
Распечатать информационные части стека p.
Традиционное решение |
Рекурсивное решение |
Распечатать(p:PElem): q=p while p<>NIL do begin печ(p^.инф); p=p^.след end |
Распечатать(p:PElem): if p<>NIL then begin печ(p^.инф); Распечатать(p^.след) end |
1. Распечатать информационные части стека в обратном порядке.
2. Превратить стек p в очередь p,q.
3. Перевернуть файл (используем стек p).