- •1.Принципиальная схема компьютера. Потоки управления и потоки данных.
- •3. Принципы фон Неймана.
- •4. Создание исполняемых программ в машинных кодах, на Ассемблере и на языках высокого уровня.
- •5. Компиляторы и интерпретаторы, их преимущества и недостатки.
- •6. Классификация программных кодов. Схема создания исполняемого кода.
- •8. Определение и свойства алгоритма. Способы записи алгоритмов.
- •9. Блок-схемы. Основные управляющие структуры блок-схем.
- •10. Технологии программирования. Структурное программирование.
- •17. Операторы присваивания, инкремента и декремента. L-value выражения.
- •18. Условный оператор. Оператор запятая.
- •19. Инструкция-выражение. Инструкции выбора if и switch.
- •20. Инструкции передачи управления..
- •22. Алгоритмы обработки числовых данных (алгоритм Евклида, нахождение всех делителей числа, нахождение простых делителей числа, нахождение простых чисел, чисел Фибоначчи).
- •23. Указатели. Типизированные и безтиповые указатели. Операция разыменования и операция получения адреса.
- •25. Арифметические операции над указателями.
- •26. Проблемы и типичные ошибки при работе с указателями.
- •30. Двумерные и многомерные массивы (алгоритмы обработки матриц).
- •31. Многомерные массивы. Реализация многомерных массивов с помощью указателей.
- •32. Динамическое выделение памяти под одномерные и двумерные массивы.
- •34.Передача массивов в качестве параметров.
- •35. Подпрограммы. Определение и объявление подпрограмм. Процедуры и функции.
- •36.Формальные и фактические параметры. Соответствие типов в формальных и фактических параметрах.
- •38. Механизм работы с модифицируемыми параметрами, использующий указатели.
- •40. Использование ссылочного типа при выходе из подпрограмм. Константные ссылки.
- •41. Побочный эффект подпрограмм, его преимущества и недостатки.
- •42. Рекурсия. Формы рекурсивных подпрограмм. Глубина и текущий уровень рекурсии.
- •43. Зацикливание рекурсивных подпрограмм. Примеры неэффективности рекурсии.
- •44. Перегрузка функций. Ошибки, возникающие при перегрузке функций.
- •45.Указатели на функции. Callback-функции.
- •46. Функция main. Передача параметров в функцию main.
- •47. Директивы препроцессора. Директивы #pragma и #include.
- •48. Директивы #define и #undef. Константы времени компиляции.
- •49. Макросы. Преимущества и недостатки использования макросов.
- •50.Директивы условной компиляции. Страж включения.
- •51. Пространства имён. Работа с пространствами имён. Оператор using. Приоритеты и конфликты имён.
- •52. Строки. Операции над строками.
- •54. Строки string. Функции стандартной библиотеки для обработки строк.
- •55. Основные алгоритмы обработки строк (выделение слова, подстроки, разбиение на слова, поиск символа, поиск слова).Ответ в 53.
- •56. Пользовательские типы данных. Перечислимый тип enum.
- •57. Пользовательские типы данных. Тип struct. Массивы структур.
- •58. Объединения (union). Битовые поля.
- •59. Понятие сложности алгоритма. Оценка сложности с использованием о-символики.
- •60. Алгоритмы сортировки и поиска. Обменные сортировки. Сортировки вставками. Сортировки выбором. Сравнительный анализ методов сортировки.
- •61. Последовательный поиск. Бинарный поиск. Сравнительный анализ методов поиска.
- •62. Файлы. Основные принципы работы с файлами. Механизм чтения данных из файла. Определение конца файла. Открытие и закрытие файлов.
- •63. Текстовые файлы. Создание и обработка. Функции ввода/вывода в стиле с. Ввод-вывод нуль-терминированных строк. Посимвольный ввод-вывод. Форматированный ввод-вывод.
- •66. Исключительные ситуации. Системные и пользовательские исключения. Оператор try …catch. Виды блоков catch. Выброс исключений. И их обработка. Оператор throw.
- •70. Структура данных очередь. Кольцевая очередь. Реализация очереди с использованием списков.
- •71. Структура данных стек. Реализация стека с использованием массива.
- •72. Структура данных стек. Реализация стека с использованием списков.
- •73. Структуры данных. Списки. Типы списков. Представление этих структур в статической и динамической памяти. Обработка однонаправленных и двунаправленных списков. Сборка мусора.
- •75. Реализация линейного однонаправленного списка с использованием массивов.
- •76. Деревья. Обходы деревьев.
- •77. Бинарные поисковые деревья. Определение, концевой обход бпд.
- •78. Поиск и вставка нового элемента в бпд.
- •79.Удаление элемента из бпд.
- •80. Реализация бпд с использованием динамической памяти.
10. Технологии программирования. Структурное программирование.
Императивное программирование. Структурное программирование. Логическое программирование. Объектно-ориентированное программирование. Функциональное программирование. Визуальное программирование. Параллельное программирование. Все классические языки программирования являются языками процедурного типа. Это означает, что программист явно указывает все действия, которые должна выполнить ЭВМ. С усложнением алгоритмов увеличиваются программы. Увеличение размера программ приводит к тому, что трудно определить, всегда ли программный продукт делает то, что нужно, и что он не делает ничего такого, что не требуется. Одним из методов, улучшающих понимание программ, является структурное программирование. Этот метод позволяет основные усилия при разработке программ направить на наиболее подверженный ошибкам участок – логику программы. Основные составляющие структурного программирования: проектирование сверху вниз (нисходящая стратегия);модульное программирование; структурное кодирование.
Проектирование программного продукта сверху вниз предусматривает сначала определение задачи в общих чертах, а затем постепенное уточнение структуры путем внесения более мелких деталей. Проектирование представляет собой последовательность шагов такого уточнения. На каждом шаге необходимо выявить основные функции, которые нужно выполнить, т.е. задача разбивается на ряд подзадач, пока эти задачи не станут настолько простыми, что каждой из них будет соответствовать один программный модуль. Модульное программирование – это процесс разделения программы на логические части, называемые модулями, и последовательное программирование каждой части. Когда большая единая задача делится на подзадачи, то значительно проще разобраться в ее решении. Это обычный способ управления сложной ситуацией, основанный на принципе “разделяй и властвуй”. Структурное кодирование – это метод написания хорошо структурированных программ, который позволяет получать программы, более удобные для тестирования, модификации и использования. Он предполагает использование лишь разрешенных базовых структур, ограничение на вложенность условных операторов, на использование языковых конструкций с неочевидной семантикой, на величину модулей. Структурное программирование предполагает наличие только одного входа в модуль в начале и одного выхода в конце, документированность программ, соблюдение отступов и т. д. Хорошо структурированную программу можно читать сверху вниз без управляющих переходов на другие страницы. Перечислим цели структурного программирования:
обеспечение дисциплины программирования – это основная цель структурного программирования и главный фактор достижения остальных его целей; улучшение читабельности программ; повышение эффективности программ – достигается за счет такого разбиения на модули, при котором легко находить и исправлять ошибки и переделывать текст любого модуля независимо от других; повышение надежности программ – этого можно достичь, если программа легко поддается тестированию и отладке; а это возможно, если соблюдаются правила написания читабельных программ и хорошего структурирования при разбивке на модули; уменьшение времени и стоимости разработки программ достигается при повышении производительности труда программистов; соблюдение же правил структурного программирования позволяет этого добиться.
11. Способы описания языков программирования. Формы Бэкуса-Наура и синтаксические диаграммы. Язык программирования – это система обозначений и понятий для описания структур данных и алгоритмов.
Авторы языка стремятся изложить свои идеи строго, лаконично и красиво. Разработчиков транслятора интересует совсем другое в описании языка – как быстрее и эффективнее анализировать исходный текст. Программистам хочется программировать, а не тратить время на изучение документации. Различают неформальное и формальное описание языков программирования. В учебниках, как правило, изложено неформальное описание. Формальное описание языка требует больших усилий. Обычно все начинается с описания синтаксиса языка. Для этого используется некоторый вспомогательный язык – метаязык. Наиболее часто используются следующие способы описания языков программирования: 1. Нормальная форма Бэкуса-Наура (БНФ); 2. Синтаксические диаграммы Вирта; 3. Формальные грамматики.
Форма Бэкуса—Наура (сокр. БНФ, Бэкуса—Наура форма) — формальная система описания синтаксиса, в которой одни синтаксические категории последовательно определяются через другие категории. БНФ используется для описания контекстно-свободных формальных грамматик. БНФ-конструкция определяет конечное число символов (нетерминалов). Кроме того, она определяет правила замены символа на какую-то последовательность букв (терминалов) и символов. Процесс получения цепочки букв, можно определить поэтапно: изначально имеется один символ (символы обычно заключаются в угловые скобки, а их название не несёт никакой информации). Затем этот символ заменяется на некоторую последовательность букв и символов, согласно одному из правил. Затем процесс повторяется (на каждом шаге один из символов заменяется на последовательность, согласно правилу). В конце концов, получается цепочка, состоящая из букв и не содержащая символов. Это означает, что полученная цепочка может быть выведена из начального символа.
Примеры: <цифра> ::= 0|1|2|3|4|5|6|7|8|9 <буква> ::= A|B|C|D|E|F|G|H|…|Z|a|b|c|d|e|f|g|h|…|
<символ_подчеркивания> ::= _ <идентификатор>::=<буква>| <символ_подчеркивания>| <идентификатор><буква>| <идентификатор><цифра>| <идентификатор><символ_подчеркивания>
12. Лексемы, выражения, операторы. Структура программы на языке C++.
Лексема – минимальная единица языка, имеющая самостоятельный смысл. Среди лексем выделяют: символы (простые и составные) - символы-разделители. - специальные символы - служебные слова - идентификаторы
- константы - инструкции - комментарии - встроенные типы данных операторы
Операторы языка C++ разделяются по количеству операндов на унарные, бинарные и один тернарный (три операнда) оператор. Унарные операторы, кроме того, разделяются по расположению знаков относительно операнда на префиксные и постфиксные.
Термину «оператор языка C» соответствует термин «операция языка Паскаль», а вместо привычного «оператор языка» будут применяться слова «инструкция языка». Это связано с проблемами, возникающими при переводе английских слов operator и statement.
Выражения В С++ выражением считается любая допустимая комбинация операторов, констант, функций и переменных. Выражение, после которого стоит точка с запятой – это инструкция-выражение. Ее смысл состоит в том, что компьютер должен выполнить все действия, записанные в данном выражении, иначе говоря, вычислить выражение.
13. Типы данных, переменные, константа. Стандартные типы данных в C++. Приведение типов. Переменная – это поименованная область памяти, в которой хранятся данные определённого типа. Определяя переменную, необходимо предоставить компилятору информацию о ее типе. Тогда компилятор будет знать сколько места нужно зарезервировать для нее и какого рода значение будет в ней находиться. Константа – фиксированная величина, которая не изменяется в процессе выполнения алгоритма или программы.
Тип данных определяет внутреннее представление данных в памяти компьютера;
множество допустимых значений величин этого типа;
совокупность операций и функций, которые можно применять к величинам этого типа.
С++ предоставляет набор встроенных (стандартных) типов данных: символьный, целый, вещественный, логический и набор составных и расширенных типов: строки, массивы, комплексные числа и т.д. Если в выражение входят константы и перемненные различных типов, они последовательно, по ходу выполнения вычислений, преобразуются к одному, "покрывающему" типу (типу с наибольшим диапазоном значений. ). Последовательность типов в С++ от "покрывающих" к "покрываемым".
14. Переменные в C++. Область действия, область видимости и время жизни переменных.
Переменная – это именованная область памяти, в которой хранятся данные определенного типа. Область действия переменной– это часть программы, в которой ее можно использовать. Переменная, описанная внутри блока, т.е. части программы, заключенной в фигурные скобки, считается локальной. Область ее действия – от точки описания до конца блока, включая вложенные блоки. Переменные, описанные вне блоков, являются глобальными, их область действия – до конца файла, в котором эта переменная описана (включая внешние файлы, в которые переменная экспортируется по директиве #include). Область видимости чаще всего совпадает с областью действия, однако если во вложенном блоке описана переменная с уже существующим именем, то это делает невидимой внешнюю переменную. Тем не менее, к глобальной невидимой переменной можно обратиться с использованием операции :: (расширение области видимости). Время жизни переменной определяет, как долго сохраняется ее значение. Значение локальных переменных теряются при выходе из блока, в котором они описаны, если только эти переменные не были описаны с классом памяти static. Время жизни глобальных переменных и переменных с классом памяти static – постоянное . extern –объявление, но не определение.
15. Унарные и бинарные арифметические операторы в С++. Операторы сравнения. Операторы сдвига. Операторы разделяются по количеству операндов на унарные, бинарные и один тернарный (три операнда) оператор. Унарные операторы, кроме того, разделяются по расположению знаков относительно операнда на префиксные и постфиксные.
Операторы сравнения :Сравнивать можно операнды любого типа, но либо они должны быть оба одного и того же встроенного типа, либо между ними должна быть определена соответствующая операция сравнения, сравнение на равенство и неравенство может быть для двух величин любого типа. Результат сравнения – логическое значение true или false.
Операторы сравнения и логические операторы не изменяют значения своих операндов, а только вычисляют значение ложь или истина. Любое значение, не равное нулю, считается истиной, равное нулю – ложью . Операторы сдвига Оператор << (сдвиг влево) выполняет побитовый сдвиг влево левого операнда на количество разрядов, соответствующее значению правого операнда. Сдвиг на 1 бит эквивалентен умножению на 2. Результатом является целое число. Оператор >> (сдвиг вправо): выполняет побитовый сдвиг вправо левого операнда на количество разрядов, соответствующее значению правого операнда. Если число без знака, то левые биты = 0. Сдвиг на 1 бит вправо эквивалентен делению на 2. Результатом является целое число. Сдвиг вправо может быть арифметическим (т. е. освобождающиеся слева разряды заполняются значениями знакового разряда) или логическим в зависимости от реализации, однако гарантируется, что при сдвиге вправо целых чисел без знака освобождающиеся слева разряды будут заполняться нулями.
16. Побитовые и логические операторы С++. Неполное вычисление логических выражений. Побитовые составные операторы присваивания&= Побитовое И с замещением
|= Побитовое ИЛИ с замещением ^= Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ с замещением
>>= Сдвиг вправо с замещением <<= Сдвиг влево с замещением Например:
unsigned short y = 0x00FF; cout << hex << y << endl; // ff y &= 0xAA80; cout << hex << y << endl; // 80 Логические операторы && логическое “и” (конъюнкции) || логическое “или” (дизъюнкции) ! логическое “НЕ “(отрицание) Операнды - логические значения, результат – тоже логическое значение. Примеры: (x < y) && (x > y) // =0 (x < y) || (x > y) // =1
! (1 < 2) // =0 В программировании используется два основных варианта конъюнкции: логическое “И” и побитовое “И”. Применительно к C/C++ логическое “И” обозначается символом “&&”, а побитовое — символом “&”. Довольно часто эти операторы можно встретить при проверке составного условия вида: if ((первое_условие) & (второе_условие))
{ /* какие-то действия */};И казалось бы, что разницы между использованием разных “И” в таких составных условиях нет. Однако, это далеко не так. Основное отличие - возможность неполного вычисления булевских выражений при использовании логического “И”. Вики намекает, что в случае битового “&” вычисление условий будет продолжаться до конца выражения, независимо от промежуточных результатов. При использовании логического “&&” вычисление остановится после первого встретившегося неверного условия, т.к. дальнейшие вычисления бессмысленны.