- •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 Другие операторы
Лекция 4
Повторение: Рекурсивная процедура или функция.
Обязательно есть нерекурсивная ветка.
Обязательно «когда-нибудь» на нерекурсивную ветку попадем.
Двойная рекурсия. Косвенная рекурсия.
4.1 Списковые структуры. Линейный список
Линейный список – структура данных, позволяющая учесть «вложенность». Используют линейные списки для описания выражений (арифметических, логических), структуры текста программы на алгоритмическом языке и т. д.
Пусть a,b,c,...,+,-,*,/ - элементы типа Т (атомы), скобки – особые символы, описывающие вложенность.
Определение 1 (рекуррентное) линейного списка:
Атом есть линейный список (атомарный);
( ) – линейный список (пустой);
если l1,l2,...,ln – линейные списки (n>0), то и (l1 l2 ...ln) – линейный список.
В непустом неатомарном списке (l1 l2 ...ln) l1- голова списка, (l2 ...ln) - хвост списка.
Примеры.
Пример |
Описание |
Степень вложенности (уровень) |
a |
атомарный список |
0 (элемент а на уровне 0) |
(a) |
список неатомарный |
1 (элемент а на уровне 1) |
( ) |
пустой список |
1 (нет элементов на уровне 1) |
(()) |
непустой список |
2 (элемент ( ) на уровне 1) |
ab |
не список |
- |
a(b) |
не список |
- |
(ab) |
список |
1 (элементы а и b на уровне 1) |
(((ab)c)(de)) |
список |
3 (элементы а и b на уровне 3) |
((a+b)/(c+d)*f) |
список |
2 (элементы а, +, b, с, +, d – на уровне 3) |
Определение 2 (рекурсивное) линейного списка
Пусть S – линейный список, S+ – неатомарный список, S* – непустой неатомарный список.
Атом есть линейный список (атомарный);
( ) – линейный список (пустой);
S = (либо пустой, либо атомарный, либо S*);
S* = (голова:S, хвост:S+);
S+ = (либо пустой, либо S*);
Операции над структурой данных линейный список:
Создать атомарный список;
Создать пустой список;
Создать список из набора имеющихся списков по п.3 определения 1;
Список пуст?;
Список атом?;
Расчленение (выделение головы и хвоста);
Голова (функция с побочным эффектом);
4.2 Об операции "расчленение"
Операция определена на непустых неатомарных списках S*.
Голова - первый элемент первого уровня. Хвост - список без головы.
Примеры:
Список |
Голова |
Хвост |
(a) |
a |
( ) |
(ab) |
a |
(b) |
(( )) |
( ) |
( ) |
(((ab)c)(de)) |
((ab)c) |
((de)) |
4.3 Логическое описание линейного списка.
pElem=^Elem;
Elem=record
след:pElem;
case R:0..1 of
0: (уров:pElem);
1: (атом:T)
end;
Поле R - поле тега (переключатель).
Примеры:
1. Пустой список ( )
2. Атом a
3.(ab)
4. (a( )b)
5. ((a+b)*(c-(b/a)))
4.4 Вычисление значения арифметического выражения
Функция «Голова(р)» с побочным эффектом (р указывает на непустой неатомарный линейный список).
Голова:=р^.уров;
p^.уров:=Голова^.след;
Голова^.след:=nil
{Серия картинок, иллюстрирующих работу функции Голова}
"Правильное" арифметическое выражение представлено как "правильный" линейный список. Атомы a,b,c,... – инициализированные переменные или константы, атомы + - * / – бинарные операции.
Функция VAL(p:pElem) возвращает значение арифметического выражения, заданного указателем p.
VAL(p:pElem)
Список пуст? |
||
|
Список атом? |
|
|
VAL=p^.атом |
x=VAL(Голова(p)) |
|
|
оп=Голова(p)^.атом |
|
|
y=VAL(p) |
|
|
если оп=+ VAL=x+y |
|
|
если оп=- VAL=x-y |
|
|
если оп=* VAL=x*y |
|
|
если оп=/ VAL=x/y |
Разъяснения:
Вот «правильный» линейный список
x=VAL(Голова(p)). Вот результат применения функции Голова:
оп=Голова(p)^.атом. Вот результат второго применения функции Голова:
y=VAL(p). Вот результат третьего применения функции Голова:
Вопросы:
В какой последовательности будут выполняться операции одного уровня?
Почему рекурсия обязательно завершится?
Задача
Имеется правильное выражение в виде строки. Построить линейный список для этого выражения.
pElem=^Elem;
Elem=record
след:pElem;
case R:0..1 of
0: (уров:pElem);
1: (атом:T)
end;
Выражение вводится с клавиатуры.
procedure LS(var p:pElem);
var c:char;
begin
if not eoln
begin
read(c);
case c of
‘(‘ : begin
new(p); p^.R:=0; LS(p^.уров); LS(p^.след);
end;
‘a’..’z’,’+’,’-‘,’*’,’/’: begin
new(p); p^.R:=1; p^.атом:=с; LS(p^.след);
end;
‘)’ : p:=nil;
end;
end
else p:=nil;
end;
Задачи
Написать алгоритм вычисления значения арифметического выражения, используя операцию "расчленение".
Имеется линейный список для "правильного" арифметического выражения. Построить линейный список для обратной польской записи этого выражения.
Построить алгоритм обхода элементов линейного списка (восстановить строку символов с учетом вложенности).