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

Директива #undef

Директива

#undef текстовое_имя

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

Примеры использования директивы #undef

#define SIZE 200 // Определение SIZE

int array1[SIZE];

текст программы

#undef SIZE // Отмена определения SIZE

#define SIZE 20 // Новое определение SIZE

int array2[SIZE];

#define BIG 3

#define HUGE 10

#undef BIG // BIG теперь не определен

#define HUGE 20 // HUGE теперь переопределен как 20

#undef HUGE // HUGE снова равен 10

#undef HUGE // HUGE не определен

Макроопределения с параметрами

Макроопределения (макросы) с параметрами очень похожи на функции. Макрос это лексема, созданная с помощью директивы #define:

#define текстовое_имя(список_параметров) текст_подстановки

Список_параметров содержит один или более формальных параметров, разделенных запятыми. Не допускаются пробелы между текстовым_именем и открывающей скобкой списка_параметров. Первый пробел завершает имя макроопределения и все, что следует за этим пробелом, считается текстом_подстановки. Макрос принимает параметры подобно обычной функции. Преимущество макроопределений заключается в том, что не нужно беспокоиться о типах переменных (макросы имеют дело с символьными строками, а не с фактическими значениями). По этой же причине рекомендуется каждый аргумент в тексте_подстановки и сам текст_подстановки заключать в круглые скобки. Это будет гарантией того, что элементы будут сгруппированы надлежащим образом при вызове макроса.

Примеры использования макросов.

1) #define TWICE(x) ((x)*2) /* Обращение в программе может выглядеть как TWICE(5) или TWICE(1.45), то есть тип переменной не имеет значения. Круглые скобки для x необходимы, чтобы макрос правильно работал, например, при таком обращении TWICE(a+3), без скобок макроподстановка выглядела бы так (a+3*2), и, следовательно, результат вычисления отличался бы от (a+3)*2 */

2) #define MIN(x,y) ((x)<(y) ? (x) : (y))

Пример использования макроопределения для доступа к элементу матрицы.

С помощью датчика случайных чисел сформировать двумерный массив. Возвести в квадрат каждый элемент массива и полученную матрицу выдать на экран. Размерность матрицы задавать с клавиатуры.

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define ARRAY(I,J) * (parray+(I)*ny+(J))

int main()

{ int i,j,nx,ny;

int *parray; // Объявление указателя для первого элемента матрицы

puts(“Введите размерность матрицы( nx, ny) через пробел”);

scanf(“%d %d”, &nx, &ny);

parray = new int[nx*ny]; // Выделение памяти для хранения элементов матрицы

randomize();

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

for (j=0; j<ny; j++)

ARRAY(i,j)=pow(random(10)-5,2);

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

{ for (j=0; j<ny; j++) printf(“ %d ”, ARRAY(i,j)); printf(“\n”);}

delete parray;

return 0;

}

Домашнее задание

1. Вычислить z1=max(x,y), z2=max(2*f,5.0-g). Вычисление оформить в виде макроопределения с параметрами.

2. С помощью датчика случайных чисел задать N чисел (N вводится с клавиатуры). Для каждого числа вычислить его квадрат и куб. Вычисление квадрата и куба оформить в виде макроопределений с параметрами.

Вычислительный зал

Домашнее задание занятия 1.

Дополнительные задачи

1. Ввести с клавиатуры число. Вычислить его абсолютную величину. Вычисление оформить в виде макроопределения.

2. Ввести с клавиатуры 2 числа x и y. Вычислить значение F(x,y):

1, если x,y – числа с одинаковыми знаками

F (x,y)= -1, если x,y – числа с разными знаками

0, во всех остальных случаях

Вычисление оформить в виде макроопределения.

3. Ввести символ x. Вычислить значение функции F(x)

F(x)= 1, если x – знак арифметической операции 0, во всех остальных случаях

Вычисление оформить в виде макроопределения.

4. Ввести символ x. Вычислить значение функции F(x)

F(x)= 1, если x – знак табуляции ‘t’, пробел или символ перехода на новую строку 0, во всех остальных случаях

Вычисление оформить в виде макроопределения.

5. С помощью директивы #define определить три символьных имени. Эти определения сделать в файле с именем definition.h. В исходный текст программы включить файл definition.h. с помощью директивы #include. Проверить определение с помощью директив #ifdef или #ifndef первые два символьных имени, если они были определены как 1 и “Bacia”, определение третьего имени отменить. Вывести на экран соответствующую информацию об именах в начале работы программы и в конце.

6. С помощью датчика случайных чисел сформировать трехмерный массив. Для доступа к элементам массива использовать макрос A(i,j,k).