- •Списки §1. Общие сведения о списках
- •§2. Создание списка
- •§3. Просмотр и анализ списка
- •3.1. Просмотр и анализ списка целых чисел.
- •3.2. Просмотр и анализ списка одномерных массивов.
- •§6. Сравнительный анализ списков.
- •§1. Порядок работы с файлом
- •1.1. Потоки и файлы
- •1.2. Объявление файла
- •1.3. Открытие файла.
- •1.4. Закрытие файла.
- •§2. Работа с текстовым файлом
- •2.1. Посимвольная работа с текстовым файлом
- •Int fputc(int ch, file *stream)
- •2.2. Построчная работа с текстовым файлом
- •§3. Функции блокового ввода/вывода
- •3.1. Экономические задачи с использованием файлов
- •3.2. Математические задачи с использованием файлов
- •§4. Прямой (произвольный) доступ к файлу
- •4.1. Функция fseek()
- •4.2. Замена записи. Функции ftell, fgetpos, fsetpos, rewind.
- •Пример. В файл записать координаты точек плоскости. Найти две (любые) точки с наибольшим расстоянием между ними. Массив для хранения координат всех точек не использовать.
- •Упражнения, тесты.
- •Функции (дополнительные возможности)
- •§1. Функции с переменным количеством параметров.
- •§2. Указатели на функции.
- •§3. Массив указателей на функции.
- •§4. Введение в рекурсивные функции.
- •Упражнения, тесты.
- •Void Fun1 (float); void Fun2(float); void Fun3(float);
- •Лабораторная работа № 12.
- •Команды препроцессора (директивы компиляции)
- •§1. Директива define (замены в тексте)
- •Простое макроопределение (макрос)
- •Макрос с аргументами.
- •Директива #undef.
- •§2. Директива #include (включение файлов).
- •§3. Директивы условной компиляции.
- •Директива #if.
- •Директивы #ifdef и #ifndef.
- •Упражнения, тесты
- •История развития технологий программирования
- •§1. Программирование в машинных кодах и на языках символического кодирования
- •§2. Языки высокого уровня. Структурное и модульное программирование
- •§3. Интегрированные системы программирования.
- •§4. История и идеи объектно-ориентированного программирования.
- •§5. Программирование для Windows. Визуальное программирование.
- •Литература
- •Оглавление Предисловие………………………………………………………….…………………3
- •Г л а в а 4. Структуры и другие типы, определяемые пользователем.84
- •Г л а в а 6. Файлы ………………………………………………………..154
- •Г л а в а 7. Функции (дополнительные возможности) ………………190
- •Г л а в а 9. История развития технологий программирования ……220
Команды препроцессора (директивы компиляции)
В интегрированную среду подготовки программ на С++ как обязательный компонент входит препроцессор, который обрабатывает исходный текст программы до её компиляции. Для этого используются его команды, которые ещё называются инструкции компилятору (компиляции), директивы компиляции, директивы (команды) препроцессора, с некоторыми из которых (#include, #define) мы уже кратко знакомы. Такие команды не являются частью языка. Напомним основные синтаксические правила записи команд препроцессора:
в одной строке можно записать только одну директиву;
каждая из них должна начинаться с символа #;
в конце директивы в отличие от операторов символ “точка с запятой” не пишется.
§1. Директива define (замены в тексте)
Простое макроопределение (макрос)
Стандартный вид директивы следующий:
#define идентификатор последовательность_символов
В результате её обработки все вхождения определённого в команде идентификатора в тексте программы, начиная с этой команды, заменяются записанной последовательностью символов. Идентификатор называют ещё макроопределением или макросом.
Правила записи директивы define:
последовательность символов должна отделяться от идентификатора хотя бы одним пробелом;
пробелы, помещённые в начале и в конце строки замещения, в подстановке не используются;
если последовательность символов должна быть расположена на нескольких строках, то за последним не пробельным символом в строке записывается символ “\” (обратный слеш). В ходе препроцессорной обработки этот символ вместе с последующим символом конца строки будет удалён из текста программы ( см. пример3);
замена не производится в строковых и символьных константах и в комментариях;
строка замещения может отсутствовать (пример 2);
директива может размещаться в любом месте текста программы, не обязательно в её начале, как мы писали в простейшем случае раньше. Действие команды распространяется от точки размещения до конца текста программы;
ранее определённый идентификатор можно затем использовать для определения других идентификаторов (пример 6).
Примеры.
1. На практике эта команда часто используется для определения “константы”. Например, в результате выполнения команды
#define n 10
каждое появление идентификатора n будет заменено числом 10.
2. Команда
#define obj
ничего не ставит в соответствие имени obj. Любое вхождение obj будет удалено. Можно использовать такой вид команды для условной компиляции (см. §3).
3. Пример расположения команды на двух строках:
#define Start for (int i=0; i<n; i++)\
for (int j=0; j<m; j++)
Если записать такую команду, то вместо двух подряд идущих вложенных циклов for можно просто записать Start.
4. Пусть задан следующий исходный текст программы:
#define begin {
#define end }
void main()
begin
операторы
end
В результате препроцессорной обработки begin заменится на левую фигурную скобку, а end — на правую. Получим
void main()
{
операторы
}
5 Имея определённый опыт программирования на другом языке (например, Pascal), можно забыть, что в ключевых словах языка С++ строчные и прописные буквы отличаются. Тогда можно записать, например, несколько директив компиляции такого рода:
#define FOR for
#define For for
Тогда не будет ошибки, если в тексте программы запишем FOR или For, так как препроцессор заменит их на for.
6. Если сначала определим
#define ONE 1,
то затем можно использовать ONE при определении другого идентификатора, например:
#define TWO ONE+ONE