- •Программирование и алгоритмические языки. Курс за второй семестр. Абстрактные типы данных.
- •Задача о раскраске.
- •Перечисление последовательностей фиксированной длины.
- •Var I:tСтраны; c:tЦвет;
- •Два взгляда на диаграммы – графы и автоматы.
- •Деревья
- •Как сократить перебор с возвратом. Перечисление последовательностей переменной длины
- •Словарный порядок на последовательностях произвольной длины
- •Статическая реализация стеков.
- •Очереди. Статическая реализация.
- •Статическая реализация деревьев.
- •Автоматы как структуры данных
- •Статическая реализация графов. Проблема фрагментации памяти. Списочные структуры.
- •Общая схема реализации автомата как списка.
- •Обработка кучи.
- •Динамическая реализация абстрактных типов ссылками. Ссылочные типы Паскаля.
- •Ссылочные типы Паскаля. Синтаксис типов.
- •Объявление списочной структуры в Паскале.
- •Реализация стеков.
- •Реализация очередей.
- •Основные операции над списками.
- •Обработка деревьев. Деревья выражений.
- •Поиск атома.
- •Различные объединения типов. Записи типов с вариантами.
- •Создание дерева. Перевод из префиксной записи. Представление записи.
- •Анализ алгоритма вычисления. Дерево как последовательность ветвей.
- •Задача синтаксического анализа.
- •Графы-выражения.
- •Раздельное описание абстрактных типов. Модульное программирование.
- •Проблема с кратным использованием модулей.
- •Деревья как структуры данных.
- •Деревья поиска.
- •Поиск в дереве поиска.
- •Включение в дерево поиска.
- •Другие обходы дерева. Обход в ширину.
- •Рекурсивные процедуры и функции. Примеры применения.
- •Поиск в дереве.
- •Проблемы с семантикой рекурсии.
- •Введение в машинно-ориентированное (ссылочное) программирование. Оператор Goto.
- •Создание новых структурных операторов.
- •Формальная семантика goto и неструктурных программ.
- •Мини-Паскаль.
- •Представление сложных типов. Адресная арифметика.
- •Проблемы реализации ввода-вывода. Идея буферизации.
- •Реализация процедур read и write.
- •Реализация структур управления.
- •Путь наверх. Реализация процедур-подпрограмм.
- •Передача параметров.
- •Сохранение и восстановление значений. Соглашение о связях.
- •Введение в теоретическое программирование. Границы программирования. Принципиальная и практическая неразрешимость.
- •О формальной спецификации. Мир задачи как автомат.
- •Процедуры как функции на множестве состояний. Процедуры как преобразователи предикатов.
- •Универсальные методы решения задач.
Представление сложных типов. Адресная арифметика.
Для значений сложных типов главное – применение операции выборки. В машинных языках такое применение модулируется вычислением адресов. В терминах машинных языков адреса – действительные натуральные числа с доступными для использования арифметическими операциями, в первую очередь – сложением. Адреса могут указываться адресным выражением, либо адресной переменной (то есть ссылкой, указателем). Выборка из поля с начальным адресом осуществляется указанием адресного выражения.
Pole Pole+i
i
Такие адреса называют относительными, число i – смещением, адрес поля – базой.
Пусть поле содержит n значений некоторого типа с длиной cSize Of T.
Pole+i*cSizeOfT
Pole j
a0 a1 a2 a3
Такое вычисление адресов лежит в основе реализации одномерных массивов. Но такие рассуждения не решают вопроса, как указать текущие значения последовательности (массива).
A[1]→A
A[2]→A+cSize Of T
A[3]→A+z*cSize Of T
A[i]-?
Решение – адресная переменная или ссылка. Запись адреса вида p^ называется в машинных языках неявной или косвенной.
Пример (трансляция): Суммирование элементов последовательности. Известно, что поле А содержит 10 числовых значений в формате длины 4.
{S:=S+p^;}
S:=0;
p:=addr(A);
i:=1;
while i<=10 do
begin
S:=S+p^;
i:=i+1;
p:=p+cSizeOfT;
end;
Реализация записи аналогична реализации массивов.
cSize Of T1 cSize Of T2
R p1 p2 p3 …
R+cSize Of T1+cSize Of T2+…+cSize Of Ti-1; - указатель на i-е поле записи
Проблемы реализации ввода-вывода. Идея буферизации.
Файлы (как и любая другая структура данных) реализуются в виде двоичной последовательности, либо в последовательности машинных слов, и, как и любая другая структура данных, имеют логическую организацию (формат).
Кроме того, файлы имеют специфическую физическую организацию. Так, например, то, что с логической точки зрения является file of integer, физически может представлять последовательность блоков (физических записей), например, по 100 чисел в блоке.
Физическая организация. Помимо специфичных для каждого устройства особенностей, центральная проблемой ввода-вывода – существенно более низкая скорость обмена данными внешней памяти по сравнению с внутренней (оперативной). Пути решения этой проблемы за счёт распараллеливания обработки внутренних и внешних данных рассмотрим на примере стандартного Паскаля. В стандартном Паскале read и write – не операторы, но процедуры, реализованные с помощью операторов get и put. С каждым именем файла автоматически связывается переменная со стандартным именем f^, называемая буфером и имеющая для файла file of T тип T, для текстового – char. Оператор get(f) считывает очередную компоненту файла в переменную f^, put(f) записывает в файл содержимое буферной переменной.
get(f)~read(f,f^);
put(f)~write(f,f^);