- •6. Функции в языке с
- •6.1 Описание функции
- •Void main()
- •6.2 Вызов функции
- •6.3 Варианты описания и использования функций
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •7. Работа со строками
- •7.1 Способы описания строк в программе
- •7.2 Ввод-вывод строк
- •7.3 Функции для работы со строками
- •8. Структуры и объединения в языке с
- •8.1 Описание структур
- •8.2 Инициализация структур
- •8.3 Работа с элементами структур
- •8.4 Структуры и указатели
- •8.5. Битовые поля в структурах
- •Работа с битовыми полями:
- •8.6. Объединения
- •Работа с полями объединения
- •8.7. Отличие объединения от структуры
- •8.8. Применение объединений
- •Void main()
- •9. Файлы в языке c. Функции работы с файлами
- •A) чтение данных из файла
- •Б) запись данных в файл
- •Дополнительные функции для работы с файлами
- •10. Программирование в графическом режиме
- •Функции библиотеки graphics
- •Управление графической системой Управление графическим режимом производится с помощью следующих функций:
- •Черчение и заполнение
- •Управление цветом
- •Обработка ошибок в графическом режиме
- •Функции запроса состояния
- •Void main()
- •11. Директивы препроцессора
- •11.1. Директива #include
- •11.2. Директива #define
- •11.3. Директива #undef
- •12. Побитовые (поразрядные) операции
- •Использование побитовых операций
11.1. Директива #include
Директива #include включает в текст программы содержимое указанного файла. Эта директива имеет две формы:
#include "имя файла"
#include <имя файла>
Имя файла должно соответствовать соглашениям операционной системы и может состоять либо только из имени файла, либо из имени файла с предшествующим ему маршрутом. Если имя файла указано в кавычках, то поиск файла осуществляется в соответствии с заданным маршрутом, а при его отсутствии в текущем каталоге. Если имя файла задано в угловых скобках, то поиск файла производится в стандартных директориях операционной системы, задаваемых командой PATH.
Директива #include может быть вложенной, т.е. во включаемом файле тоже может содержаться директива #include, которая замещается после включения файла, содержащего эту директиву.
Директива #include широко используется для включения в программу так называемых заголовочных файлов, содержащих прототипы библиотечных функций, и поэтому большинство программ на С начинаются с этой директивы.
Наиболее часто используемые в программах директивы #include следующие:
# include <stdio.h> /* Включение файла с описанием функций ввода-вывода */
# include <math.h> /* Включение файла с описанием математических функций */
# include <conio.h> /* Включение файла с описанием функций управления консолью*/
11.2. Директива #define
Директива #define служит для замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. Идентификаторы, заменяющие текстовые или числовые константы, называют именованными константами. Идентификаторы, заменяющие фрагменты программ, называют макроопределениями, причем макроопределения могут иметь аргументы.
Директива #define имеет две синтаксические формы:
#define идентификатор текст
#define идентификатор (список параметров) текст
Эта директива заменяет все последующие вхождения идентификатора на текст. Такой процесс называется макроподстановкой. Текст может представлять собой любой фрагмент программы на СИ, а также может и отсутствовать. В последнем случае все экземпляры идентификатора удаляются из программы.
Пример:
#define WIDTH 80
#define LENGTH (WIDTH+10)
Эти директивы изменят в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками.
Скобки, содержащиеся в макроопределении, позволяют избежать недоразумений, связанных с порядком вычисления операций. Например, при отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в выражение t=(80+10)*7, как это получается при наличии скобок, и в результате получится 150, а не 630.
Во второй синтаксической форме в директиве #define имеется список формальных параметров, который может содержать один или несколько идентификаторов, разделенных запятыми. Формальные параметры в тексте макроопределения отмечают позиции, на которые должны быть подставлены фактические аргументы макровызова. Каждый формальный параметр может появиться в тексте макроопределения несколько раз.
При макровызове вслед за идентификатором записывается список фактических аргументов, количество которых должно совпадать с количеством формальных параметров.
Пример:
#define MAX(x,y) ((x)>(y))?(x):(y)
Эта директива заменит фрагмент
t=MAX(i,s[i]);
на фрагмент
t=((i)>(s[i])?(i):(s[i]);
Как и в предыдущем примере, круглые скобки, в которые заключены формальные параметры макроопределения, позволяют избежать ошибок связанных с неправильным порядком выполнения операций, если фактические аргументы являются выражениями.
Например, при наличии скобок фрагмент
t=MAX(i&j,s[i]||j);
будет заменен на фрагмент
t=((i&j)>(s[i]||j)?(i&j):(s[i]||j);
а при отсутствии скобок - на фрагмент
t=(i&j>s[i]||j)?i&j:s[i]||j;
в котором условное выражение вычисляется в совершенно другом порядке.
