- •2. Структура программы
- •2.1. Объявление переменной
- •2.1.1. Константы
- •2.1.2. Объявление typedef
- •2.2. Объявление и определение функции
- •2.2.1. Встраиваемые функции
- •2.2.2. Параметры функций по умолчанию
- •2.2.3. Параметры программы
- •2.2.4. Функции с переменным числом параметров
- •2.3. Препроцессор
- •2.3.1. Включение файлов
- •2.3.2. Макроподстановки
- •2.3.3. Условная компиляция
- •3. Пример
- •Первый вариант – обычный способ
- •Второй вариант – как на Паскале
- •Третий вариант – весь алгоритм помещен в заголовок цикла for
- •3.2. Функция с переменным числом параметров, аналогичная функции printf
- •Тема 1.1. Структура программы. Типы данных
2.3.3. Условная компиляция
Условная компиляция обеспечивается в языке С++ набором команд, которые, по существу, управляют не компиляцией, а препроцессорной обработкой. Эти директивы позволяют исключить из процесса компиляции какие-либо части исходного файла посредством проверки условий. #if <константное выражение>
[<текст>]
[#elif <константное выражение>
[<текст>]]
...
[#else
[<текст>]]
#endif
Каждой директиве #if в том же исходном файле должна соответствовать завершающая её директива #endif. Между директивами #if и #endif допускается произвольное количество директив #elif и не более одной директивы #else. Если директива #else присутствует, то между ней и директивой #endif на данном уровне вложенности не должно быть других директив #elif.
Препроцессор выбирает участок текста для обработки на основе вычисления константного выражения, следующего за каждой директивой #if и #elif. Выбирается текст, следующий за константным выражением со значением «истина». Если ни одно ограниченное константное выражение не истинно, то препроцессор выбирает текст, следующий за директивой #else. Если же директива #else отсутствует, то никакой текст не выбирается.
Константное выражение может содержать препроцессорную операцию defined(<идентификатор>). Эта операция возвращает истинное значение, если заданный идентификатор в данный момент определён, в противном случае выражение ложно.
#if (sizeof(void *) == 2) #define SDATA #else #define LDATA #endif
#if defined(CREDIT) credit(); #elif defined(DEBIT) debit(); #else printerror(); #endif |
3. Пример
3.1. Программа поиска корня уравнения f(x) = 0 на отрезке [a; b] с заданной точностью методом деления отрезка пополам
Первый вариант – обычный способ
#include <cstdio>
#include <math.h>
void main() { double a, b, e, x, c, fa, fc; int n;
printf("Введите границы отрезка и точность: "); scanf("%lf%lf%lf", &a, &b, &e); for (n = 0; fabs(a - b) > e; n++)
{ c = (a + b) / 2; fa = f(a); fc = f(c); if (fa * fc < 0) b = c; else a = c; } x = (a + b) / 2; printf("Корень уравнения = %lf\nЧисло итераций = %d\n", x, n); }
|
// Включаем заголовочные файлы, // содержащие прототипы функций ввода/вывода // и математических функций (для fabs)
// Объявления переменных
// Приглашение для пользователя // Ввод исходных данных // В заголовок цикла for включаем инициализацию переменной n, // её увеличение на 1, т.к. оно безусловно выполняется // на каждом шаге цикла, и проверку условия цикла // Т.к. в теле цикла должно быть более одного оператора, // а по синтаксису возможен только один, // операторы, составляющие тело цикла, // объединяются в один с помощью операторных скобок {...} |
