Вопросы:
Уровни описания структур данных.
Статические и динамические объекты программ.
Ссылочный тип данных.
Файл. Функциональная спецификация.
Файл. Логическое описание. Физическое представление.
Вектор. Функциональная спецификация. Логическое описание и физическое представление.
Очередь. Функциональная спецификация.
Очередь. Логическое описание и физическое представление (файл).
Очередь. Логическое описание и физическое представление (массив).
Очередь. Логическое описание и физическое представление (динамическое объекты).
Стек. Функциональная спецификация.
Стек. Логическое описание.
Стек. Физическое представление (массив).
Стек. Физическое представление (динамические объекты).
Линейный список. Функциональная спецификация.
Линейный список. Логическое описание.
Линейный список. Физическое представление. Итераторы.
Линейный список. Физическое представление (массив).
Линейный список. Физическое представление (динамические объекты).
Списки общего вида. Представление и обработка графов.
Понятие рекурсия. Рекурсия и итерация. Примеры.
Деревья. Двоичные деревья.
Двоичное дерево. Функциональная спецификация.
Двоичное дерево. Логическое описание. Построение и визуализация.
Двоичное дерево. Физическое представление. Прошивка.
Алгоритмы обхода деревьев.
Особенности представления и обработки деревьев общего вида (преобразование к двоичному, …).
Деревья выражений.
Деревья поиска.
Задача поиска. Простые методы поиска в последовательностях и таблицах.
Алгоритм Кнута-Морриса-Пратта.
Алгоритм Бойера-Мура.
Алгоритм Рабина-Карпа.
Таблица с прямым доступом.
Задача сортировки.
Сортировка вставкой.
Сортировка выборкой.
Обменные сортировки.
Сортировка Шелла.
Турнирные сортировки.
Сортировка Хоора.
*Гладкая сортировка.
Сортировки слиянием.
Сравнение методов сортировки.
Процедурное программирование.
Модульное программирование. Реализация на языке Си.
Абстракции в языках программирования.
Абстрактные типы данных. Пример модуля АТД ОЧЕРЕДЬ.
Экспорт и импорт объектов. Инкапсулированные АТД.
Типизация языка программирования. Контроль типов.
Средства ослабления типового контроля. Преобразование и передача типов.
Полиморфизм операций, отношений и процедур. Родовые модули.
Адресный тип.
Реализация полиморфизма с помощью адресного типа.
Процедурный тип данных.
Реализация полиморфизма с помощью наследования.
Наследование.
Реализация полиморфизма с помощью наследования.
*Парадигма функционального программирования.
*Парадигма логического программирования.
Уровни описания структур данных.
Структуры данных надо как-то описывать, чтобы не было различных формулировок и аспектов одной и той же вещи. Потому решили дать им какое-то описание. Однако описание было немного в разных сферах, потому для каждого типа данных выделили:
А) Его функциональную спецификацию, Б) Логическое описание, В) Физическое представление.
Рассмотрим их поподробнее. А) «Функциональной спецификацией какого-либо типа данных называют внешнее формальное определение этого типа данных, не зависящее ни от языка программирования, ни от конкретной вычислительной машины» ©Зайцев. То есть нам нужно задать множество значений этого типа, множество изображений значений вместе с правилом интерпретации, а также множество атрибутов этого типа, включающее изображения некоторых выделенных значений, еще операции и их свойства, функция создания, доступа и модификации объектов этого типа.
Пример: Функциональная спецификация целого типа. Это множество изображений значений этого типа, как последовательность цифр со знаком или без знака, полиномиальную интерпретацию любого такого изображения как числа в позиционной системе счисления с основанием 10 (Т.е. какими мы эти числа видим. Для компьютера же они представлены в двоичном виде). Операции: +, -, *, деление с остатком и без (div и mod) и свойства (ассоциативность, дистрибутивность и так далее). Отношения (==, <>, <=, <, >=, >).
Такие же примеры можно дать на массивы, что элементы массива обладают только одним типом данных (целый, вещественный, структурный и т.д.), операции и отношения происходят поэлементно, в зависимости от типа данных. Имеет функцию доступа к значению массива с помощью индекса т т.д.
Б) Логическое описание. «Это отображение функциональной спецификации на средства выбранного языка программирования». То есть как ведет себя данный тип данных в том или ином языке программирование (например, в Си нельзя присваивать массивы целиком (a+b), а в паскале можно). При выполнении этого отображения могут быть две ситуации: 1) Данный тип данных есть в этом языке и определен, 2)Его там нет.
В первом случае нужно описать тип данных в синтаксисе языка (Паскаль X : integer, Си int X;) Во втором нужно описать, какими средствами можно описать данный тип данных в языке (например комплексный тип. В Си нужно сделать структуру, в котором будет флаг, означающий присутствие корня из минус единицы, и число).
В) Физическое представление – конкретное отображение на память машины объектов программы в соответствии с логическим описанием. Например, целый тип данных (на примере языка Си) занимает в памяти 16 бит, где первый бит выделен под знак, а остальные 15 под число в двоичном представлении. Тут есть два представления: сплошное и цепное. В первом случае выделяется один неразрывный кусок памяти, где «ячейки» в памяти идут строго подряд. В цепном представлении память может быть разбита на несколько кусков, находящихся в разных местах машины, которые связаны между собой с помощью указателей.
2) Статические и динамические объекты программ.
Статические: при запуске программы в памяти машины выделяется ограниченный, неизменяемый по объему, кусок памяти. Он будет такого же размера в течении работы всей программы.
Динамическую же память нужно выделять. Она появится только после определенных команд для машины при запуске программы, изначально память под данные не выделена.
Примеры: …; int a; …; Тут мы статически выделяем память под переменную а. Она будет одинакова в ходе всей программы, невзирая на внутреннее значение.
Node* a=(node*)malloc(sizeof(node)). Тут мы динамически выделяем память под данный размер типа данных. Она так и будет храниться в памяти, пока мы не освободим эту память командой free(a);
Определение из книги: «Если память выделяется (распределяется) в процессе трансляции и ее объем не меняется от начала до конца выполнения программы, то такой объект является статическим. Если же память выделяется во время выполнения программы и ее объем может меняться, то такой объект является динамическим.»
