- •Программирование и алгоритмические языки. Курс за второй семестр. Абстрактные типы данных.
- •Задача о раскраске.
- •Перечисление последовательностей фиксированной длины.
- •Var I:tСтраны; c:tЦвет;
- •Два взгляда на диаграммы – графы и автоматы.
- •Деревья
- •Как сократить перебор с возвратом. Перечисление последовательностей переменной длины
- •Словарный порядок на последовательностях произвольной длины
- •Статическая реализация стеков.
- •Очереди. Статическая реализация.
- •Статическая реализация деревьев.
- •Автоматы как структуры данных
- •Статическая реализация графов. Проблема фрагментации памяти. Списочные структуры.
- •Общая схема реализации автомата как списка.
- •Обработка кучи.
- •Динамическая реализация абстрактных типов ссылками. Ссылочные типы Паскаля.
- •Ссылочные типы Паскаля. Синтаксис типов.
- •Объявление списочной структуры в Паскале.
- •Реализация стеков.
- •Реализация очередей.
- •Основные операции над списками.
- •Обработка деревьев. Деревья выражений.
- •Поиск атома.
- •Различные объединения типов. Записи типов с вариантами.
- •Создание дерева. Перевод из префиксной записи. Представление записи.
- •Анализ алгоритма вычисления. Дерево как последовательность ветвей.
- •Задача синтаксического анализа.
- •Графы-выражения.
- •Раздельное описание абстрактных типов. Модульное программирование.
- •Проблема с кратным использованием модулей.
- •Деревья как структуры данных.
- •Деревья поиска.
- •Поиск в дереве поиска.
- •Включение в дерево поиска.
- •Другие обходы дерева. Обход в ширину.
- •Рекурсивные процедуры и функции. Примеры применения.
- •Поиск в дереве.
- •Проблемы с семантикой рекурсии.
- •Введение в машинно-ориентированное (ссылочное) программирование. Оператор Goto.
- •Создание новых структурных операторов.
- •Формальная семантика goto и неструктурных программ.
- •Мини-Паскаль.
- •Представление сложных типов. Адресная арифметика.
- •Проблемы реализации ввода-вывода. Идея буферизации.
- •Реализация процедур read и write.
- •Реализация структур управления.
- •Путь наверх. Реализация процедур-подпрограмм.
- •Передача параметров.
- •Сохранение и восстановление значений. Соглашение о связях.
- •Введение в теоретическое программирование. Границы программирования. Принципиальная и практическая неразрешимость.
- •О формальной спецификации. Мир задачи как автомат.
- •Процедуры как функции на множестве состояний. Процедуры как преобразователи предикатов.
- •Универсальные методы решения задач.
Задача синтаксического анализа.
На первый взгляд эта задача кажется совсем не похожей на задачу о вычислении. В реальности это практически та же задача.
Дана произвольная символьная последовательность. Выяснить, является ли она правильно построенным выражением.
/*+x1y2 – true
-*+x1y23 – false
Шаблоном текста c1,…,cn назовём текст c1|,…,cn| , где
‘t’, ci – терм
ci|= ‘f’, ci – знак операции
‘’, ci – чужой (посторонний) символ.
Шаблоном атома назовём строку c1,c2,c3. Это либо строка f,t,t, где c1=f, c2=t, c3=t, либо хотя бы один их них равен .
Формальным вычислением назовём переход от шаблона атома c1,c2,c3 к символу ‘t’ в случае ftt, либо к символу ‘’ во втором случае. (?)
Последовательность есть выражение, если его можно преобразовать формальным вычислением к символу ‘t’.
procedure ReadMask(var exp:text;var m:char);
{Определение шаблонов атомов}
begin
if eof(exp) then m:=’’
else
begin
read(exp,c);
if c in [‘+’ , ’-‘ , ’/’ , ’*’] then m:=’f’
else if c in [‘a’..’z’]+[‘0’..’9’] then m:=’t’
else m:=’’;
end;
end;
function CorrectExp(var exp:text):boolean;
begin
reset(exp);
create(stack);
ReadMask(exp,f);
push(stack,f);
b:=(f<>’’) and (f =’t’) and not eof(exp);
ReadMask(exp,x);
push(stack,x);
b:=b and (x<>’’);
while b and not eof(exp) do
begin
pop(stack,x);
pop(stack,f);
ReadMask(exp,y);
while not AtomMask(f,x,y) do{проверяем на атом}
begin
push(stack,f);
push(stack,x);
push(stack,y);
pop(stack,x);
pop(stack,f);
ReadMask(exp,y);
end;
result:=AtomMaskVal(f,x,y);{Вычисляем шаблон}
push(stack,result);
b:=result<>0;
end;
CorrectExp:=(x=’t’) and empty(stack);
end;
Графы-выражения.
(x+1)*(x+1)2+(x+1)*x
Дерево хранит многократно каждое вхождение, но не собственно выражение.
Ациклический граф.
Такие графы соответствуют выражениям
частичного порядка.
Задача вычисления выражения, представленного графом, аналогична случаю дерева.
Подзадача «поиск атома, значения атома» аналогична. Но уничтожить терм теперь можно лишь в случае, когда на него нет других ссылок.
-
способ – хранить обратные ссылки и, в случае удаления, проверять, присутствуют ли они.
-
способ – хранить в каждой вершине счётчик ссылок на эту вершину. При каждом вычислении уменьшать значение счётчика. В случае равенства нулю – удалять вершину.
Упражнение. Завершить задачу о вычислении выражения.
* Преобразовать выражение из представления деревом в представление графом и обратно.