- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
7.3. Объявление объединения
Объединение – это составной тип данных, компоненты которых могут быть разных типов. Компоненты объединения размещаются с одного адреса памяти.
Синтаксис объявления типа «объединение»:
union имя_типа
{
объявление компонент
};
Компонент объединения может быть любого типа С++, кроме типа объявляемого объединения. К объединениям применяются те же операции, что и к структурам. Основное назначение объединений – экономия памяти. Включение в компоненты объединения данных, которые в программе обрабатываются последовательно, позволяет этим данным использовать общий участок памяти.
Пример объявления объединения:
union
{
int a[1000];
float b[2000];
};
8. Модульное программирование
8.1. Нисходящее проектирование и программирование
При разработке программы этапу программирования (кодирования) предшествует этап проектирования программы. На этом этапе анализируются требования к разрабатываемой программе, разрабатывается алгоритм решения задачи, выбирается язык программирования. При проектировании больших программ используются методы, которые понижают сложность проектирования. К таким методам относятся: метод нисходящего проектирования (пошаговой детализации проекта) и объектно-ориентированное проектирование.
Метод нисходящего проектирования заключается в следующем:
На первом этапе проектирования сложная задача разбивается на несколько задач меньшей сложности. После этого задачу можно описать в терминах введенных разработчиком абстракций – выделенных подзадач, не вникая в детали решения каждой подзадачи.
Далее каждую подзадачу разбивают на свои подзадачи. После этого решение каждой подзадачи описывается в терминах выделенных из нее подзадач.
Такое разбиение выполняют до тех пор, пока каждая подзадача не станет элементарной.
После завершения декомпозиции исходная задача может быть представлена в виде подзадач, которые вызывают друг друга в определенной последовательности и обмениваются данными.
На этапе программирования (кодирования) сложной программы каждую подзадачу проекта можно оформить в виде отдельного программного модуля. Программа будет представлять собой набор программных модулей, расположенных на разных уровнях. Каждый модуль (кроме самого верхнего) получает данные от вышестоящих модулей, решает свою задачу и передает результат вышестоящему модулю. При решении задачи каждый модуль может использовать нижестоящие модули. Модуль самого верхнего уровня называется монитором программы. Он управляет работой всей программы, вызывая в нужной последовательности модули следующего уровня и передавая им данные на обработку. Программирование с использованием модулей называется модульным программированием.
При модульном программировании, как правило, используют метод нисходящего программирования. Метод нисходящего программирования заключается в следующем:
Вначале кодируется модуль верхнего уровня, а модули нижнего уровня заменяются «заглушкам» – модулями, не выполняющими никаких действий. Выполняется тестирование и отладка модуля верхнего уровня.
Далее последовательно каждая «заглушка» первого уровня заменяется реальным кодом, а вызываемые из нее модули второго уровня заменяются «заглушками». Последовательно отлаживаются модули первого уровня.
Процесс последовательно применяется ко всем уровням программы.
Модульное программирование используется для достижения следующих целей:
уменьшения сложности программирования;
уменьшения размера программы за счет повторного использования кода: алгоритм решения некоторой подзадачи оформляется в виде одного модуля, который многократно вызывается для выполнения подзадачи с разными данными;
повышения надежности разработанной программы за счет автономного тестирования и отладки отдельных модулей, а также за счет повторного использования отлаженного кода модуля;
уменьшения срока разработки программы путем распараллеливания работы между несколькими программистами: программисты могут программировать разные выделенные подзадачи (модули) относительно независимо;
возможности использования кода разработанного модуля для других программ;
создания коммерческих откомпилированных библиотек программ, скрывающих от пользователей библиотеки детали реализации алгоритмов (исходный код).
Для использования модульного программирования при кодировании программы на языке программирования, в том числе и на языке С++, надо знать:
как оформить алгоритм решения задачи в виде модуля;
где в программе должно находиться определение модуля;
как вызвать модуль для выполнения;
как передать в модуль данные на обработку и как получить из модуля результаты.
В языке С++ модули называются функциями.