# Зачет
__Семестр II, 2021-2022__
__Информатика, С++__
## Формат зачета
- Пять вопросов из списка
- Правильный ответ - 1
- Максимальный балл за ответ на вопросы -- 5 из 5
- Если оценка не удовлетворяет, то можно сбросить прогресс и получить новые 5 вопросов
## Вопросы к зачету
1. Структурное программирование на языке С++ I.
- Что такое блок кода?
- Базовые операторы C++ и их приоритеты. Пример работы `i = 0; i++ + ++i`.
- Последовательность выполнения кода, точка входа программы?
- Этапы компиляции программы? Зачем нужен компилятор?
2. Объявление переменных. Понятие инициализации и деструктурированного присваивания. Литеральные константы. Фундаментальные типы.
- Как объявляется переменная, отличие от Python? Расшифровать несколько объявлений переменных.
- Фундаментальные типы данных, литеральные константы, перечислить.
- Объявление, инициализация, присвоение. В чем отличия, привести примеры.
3. Ключевое слово auto. Ключевое слово const. Область видимости переменной.
- Как работает служебное слова `auto`. Привести примеры.
- Принцип работы служебного слова `const`. Изменяемость переменных с модификатором `const`.
- Область видимости переменных в цикле и функции. Глобальные переменные. Привести пример.
4. Условные конструкции if / else. Циклы for, while, do / while.
- Циклы for, while, do/while. Объявления переменных в цикле. Примеры
- Условные конструкции, короткая логика. Примеры объявления.
5. Структурное программирование на языке С++ II. Функции. Формальные параметры. Локальные и глобальные переменные. Возвращаемые значения.
- Сигнатура функции. Объявление и определение функции. forward-declaration.
- Локальность параметров функции и способы передачи параметров в функции.
- Перегрузка функций. Выбор перегруженной функции.
- Возвращение данных из функции, void функции.
6. Косвенное обращение – ссылки.
- Косвенное обращение - ссылки. Основные свойства, область применения. Привести пример функции `swap`.
7. Автоматические массивы, поиск и сортировка.
- Объявление автоматических массивов, инициализация. Примеры.
8. Объявление массивов. Обращение к элементам массива. Массивы как аргументы функции.
- Объявление массивов заданного типа данных. Инициализация массива. Примеры
- Обращение к элементам массива, выход за границы. Примеры.
- Способы передачи массивов в функции. Примеры.
9. Асимптотическая сложность алгоритма. Линейный и бинарный поиски. «Медленные» сортировки.
- О-большое, определение и свойства. Применение к алгоритмам.
- Массив. Сложность поиска элемента, доступа, удаления и добавления элемента
- Бинарный поиск. Алгоритм, условие применимости. Асимптотическая сложность.
- Медленные сортировки. Алгоритмы и асимптотическая сложность.
10. Рекурсивный вызов по имени. База рекурсии. Прямой и обратный ход рекурсивного вызова. Эквивалентность итераций и рекурсии. Хвостовая рекурсия.
- Рекурсия. Определение, примеры. База рекурсии.
- Рекурсия. Прямой и обратный ход рекурсивного вызова.
- Эквивалентность итерации и рекурсии. Хвостовая рекурсия. Примеры
11. Парадигма «разделяй и властвуй». Рекурсивная «быстрая сортировка» Хоара. Пирамидальная сортировка.
- Парадигма «разделяй и властвуй»
- Быстрая сортировка. Алгоритм, асимптотическая сложность.
- Пирамидальная сортировка. Алгоритм, асимптотическая сложность.
12. Автоматическая, статическая и динамическая память. Ключевое слово static.
- Представление программы в памяти компьютера. Разделы.
- Автоматическая память. Свойства, примеры.
- Статическая память. Ключевое слово `static` Свойства, примеры.
- Динамическая память. Свойства, примеры.
13. Время жизни и область видимости. Адреса и память, указатели. Операторы &, *. Косвенное обращение посредством адресов, отличие указателя от ссылки.
- Время жизни программных объектов. Область видимости. Примеры.
- Адреса переменных. Получение адреса переменной. Примеры.
- Указатели. Принцип работы. Примеры.
- Указатели. Арифметика указателей. Примеры.
- Указатели. Обращение по указателю. Привести пример функции `swap`.
- Указатели. Отличие указателя от ссылки. Примеры.
- Возвращение из функции по указателю. Примеры.
- (\*) Указатели типа void*. `reinterpret_cast<T>`.
14. Выделение и освобождение динамической памяти. Ключевые слова new / delete. Связь массивов и указателей. Арифметика указателей и оператор []. Выражения new[] / delete[].
- Операторы `new` и `delete`. Выделение динамической памяти, освобождение.
- (\*)Перегрузка оператора `operator new`. Примеры.
- Динамические массивы, оператор `[]`. Указательная арифметика. Примеры.
- «Утечка памяти». «Висящие указатели». «Двойное освобождение».
- (\*) Утилиты для разметки памяти и отслеживания ошибок (санитайзеры и valgrind.)
15. Перечисления, enum class. Структуры, struct. Объединения, union. Оператор -> для доступа к данным структуры или объединения посредством указателя.
- `enum / enum class`, область применения, пример.
- `union`, область применения, пример.
- `struct`, область применения, пример.
- Обращение к данным структуры. Операторы доступа.
- Передача структур (`enum, struct, union`) в функции и их возврат.
16. --- Ключевое слово sizeof. Перегрузка операторов для определённых пользователем типов данных.
- Ключевое слово `sizeof`. Размер фундаментальных и пользовательских типов данных.
- Перегрузка операторов пользовательских структур данных. Примеры.
- (\*) Битовые поля в структурах. Примеры.
17. Конструкторы и инициализация структур. Неявные преобразования типов.
- Конструктор для структуры. Обращение к полям структуры.
- Неявное преобразование типов. `static_cast<T>`.
- (\*) *Ключевое слово explicit.*
18. Односвязный список, стек.
- Представление односвязного списка. Алгоритмы на списках (поиск, добавление, удаление).
- Стек. Реализация на односвязном списке.
19. Двусвязный список, очередь.
- Динамические структуры данных - двусвязный список. Алгоритмы на списках (поиск, добавление, удаление).
- Динамические структуры данных - очередь. Алгоритмы на списках (поиск, добавление, удаление).
20. (\*) Двоичная куча (heap). Построение и поддержание двоичной кучи. Построение очереди с приоритетом на основе двоичной кучи.
- (\*) Двоичная куча. Пример использования.
- (\*) Очередь с приоритетом. Пример.
21. Жадные алгоритмы. Общие принципы построения жадных алгоритмов. Задача о расписании занятий в аудитории. Задача о размене момент. Алгоритм Прима с очередью с приоритетом.
- Жадные алгоритмы. Принцип жадного алгоритма. Пример.
- (\*) Алгоритм Прима с очередью с приоритетом.
22. Динамическое программирование. Понятие динамического программирования. Оптимальная подструктура и перекрывающиеся подзадачи. Нисходящее и восходящее динамическое программирование. Уравнение Беллмана. Задача о наибольшей общей подпоследовательности. Задача о редакционном расстоянии.
- Динамические программирование, принципы и основы. Оптимальнальная подструктура и перекрывающиеся подзадачи.
- Примеры задач.
- Динамическое программирование. Нисходщее и восходящее ДП.
- Динамическое программирование. Задача о наибольшей общей подпоследовательности.
- (\*) Задача о редакционном расстоянии.
23. Бинарные деревья поиска. Бинарное дерево поиска как структура быстрого поиска в упорядоченном множестве. Проблема балансировки. Самобалансирующиеся деревья поиска: АВЛ-дерево, красно-чёрное дерево.
- Бинарные деревья поиска. Определение, основные операции на деревьях.
- AVL-деревья. Балансировка. Отличие от бинарных деревьев.
- (\*) Красно-черное дерево
24. (\*) Хеш-таблицы. Понятие о хеш-функции. Хеш-таблица как структура быстрого поиска в неупорядоченном множестве. Проблема коллизий. Разрешение коллизий методом цепочек и открытой адресацией.
25. Числа с плавающей точкой. Числа с плавающей точкой как числа с относительной точностью. Внутреннее представление чисел с плавающей точкой. Машинное эпсилон. Сравнение чисел с плавающей точкой. Проблема накопительной ошибки. Суммирование Кехена. Проблема перемножения двух чисел с плавающей точкой. Fused multiply accumulate.
- Числа в памяти компьютера - целые, с плавающей точкой. Примеры перевода.
- Машинная точность. Сравнение числе с плавающей точкой.
- Проблема суммирования. Суммирование Кехена.
- Проблема перемножения чисел с плавающей точкой. Fused multiply accumulate.
26. Модульные проекты. Сборка модульного проекта на С++. Заголовочные файлы. Детали компоновки. Пространства имён. Ключевые слова namespace и using. Препроцессор: директивы и макорсы. Статические библиотеки и разделяемые объекты (shared objects). Сборка проекта при помощи Makefile и Cmake.
- Этапы сборки проекта. Заголовочные файлы.