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

8.6. Директивы препроцессора.

Одной из самых распространенных директив является директива #define. Эта директива используется для определения назначения указанных в ней идентификаторов. Использование этой директивы внешне похоже на работу с константами. Каждая строка #define состоит из трех частей:

1) сама директива;

2) выбранная вами аббревиатура или идентификатор, который принято называть макрос;

3) подставляемые значения или список замены или тело.

Процесс начинающийся макросом и завершающийся процессом замены, называется макрорасширением.

Пример:

#include

#define TWO 2

#define FOUR TWO*TWO

#define PX printf ("x - это %d, \n", x)

int main (void)

{

   int x = TWO;

   PX;

   x = FOUR;

   PX;

}

При исполнении приведенной программы на этапе работы препроцессора происходят следующие замены: строка int x = TWO заменяется на int x = 2; строка PX на printf (…); x = FOUR на x = TWO*TWO, а затем на x = 2*2. На этом процесс макрорасширения заканчивается, т.е. на этапе препроцесса умножение не исполняется, а исполняются только предложенные подстановки.

Результатом работы программы будет вывод двух строк:

x - это 2

x - это 4

При объявлении директивой #define значений превышающих длину строки возможно разбиение значения на несколько строк с использованием символа "\".

Пример:

#include

#define PX printf ("Сегодня первой па\

рой - алгоритмизация.\n")

int main (void)

{

   PX

}

Если в приведенном примере перед слогом "рой" поставить несколько пробелов, то они будут выведены в результирующей строке. Используя аргументы директивы #define, можно создавать макросы функции, которые выглядят и действуют подобно функциям.

Пример:

#define SQUARE (x) x*x

Эта директива может быть использована в следующих операторах:

int x = 4;

int z;

1) z = SQUARE (2);

2) z = SQUARE (x);

3) z = SQUARE (x+2);

4) z = 100/SQUARE (2);

На этапе препроцесса первая запись будет заменена на z = 2*2; вторая на z = x*x; третья на z = x+2*x+2; четвертая на 100/2*2. Соответственно результатами будут значения: 4, 16, 14, 100.

Если в третьем случае необходимо исполнения действия (x+2)*(x+2), то подставляемое значение в директиве #define должно быть заменено на (x)*(x). При этом в четвертой записи получим z = 100/(2)*(2). Для исполнения этого действия как 100/(2*2) необходимо в директиве #define записать ((x)*(x)).

Иногда даже предусмотренные предосторожности не позволят обеспечить необходимый результат. Например, если в качестве аргумента используется инкремент или декремент.

8.7. Реализация циклов в языке Си.

Для реализации цикла с предусловием в языке Си используется ключевое слово while. Операторная часть может состоять как из одного оператора, так и из нескольких, объединенных фигурными скобками. В общем виде оператор можно записать так:

while (условие)

{

   оператор 1;

   оператор 2;

}

Операторная часть цикла повторяется до тех пор, пока условие не станет ложным или равным нулю. При составлении условий могут быть использованы следующие относительные операции: <, <=, ==, >=, >, !=. В условиях также можно использовать логические конструкции, которые в Си имеют следующий вид:

&& - логическое "И"

|| - логическое "ИЛИ"

! - логическое отрицание

Для реализации цикла с параметром используется ключевое слово for. В записи оператора используются 3 выражения, управляющие работой цикла. В общем виде цикл имеет следующую форму:

for (присвоение начального значения; проверяемое выражение; выражение изменяющее значение переменной) оператор;

Выражение присваивающее начальное значение выполняется только один раз перед первым действием в цикле. Затем оценивается проверяемое выражение. Затем вычисляется выражение изменяющее переменную цикла. Цикл for в Си - это цикл с предусловием.

Цикл с постусловием в Си реализуется ключевыми словами do и while. В общем случае оператор можно записать:

do

   оператор;

while (условие);

Задача: написать программу выводящую на экран следующую последовательность:

ABCDEF

BCDEF

CDEF

DEF

EF

F

#include

int main (void)

{

   const int a = 6;

   int i;

   char k;

   for (i=0; i<6; i++)

   {

      for (k='A'+i; k<'A'+a; k++)

         printf ("%c", k);

      printf ("\n");

   }

}