Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структура программы на языке С.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
112.31 Кб
Скачать

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, т.к. оно безусловно выполняется

// на каждом шаге цикла, и проверку условия цикла

// Т.к. в теле цикла должно быть более одного оператора,

// а по синтаксису возможен только один,

// операторы, составляющие тело цикла,

// объединяются в один с помощью операторных скобок {...}