- •Оглавление
- •Занятие 6. Функции.
- •Прототип функции
- •Определение функции
- •Аргументы и параметры функции
- •Функции с переменным числом параметров
- •Рекурсивные функции
- •Математические функции
- •Передача массивов как параметров
- •Передача многомерных массивов как параметров
- •Использование указателей при работе с функциями
- •Перегрузка функций
- •Занятие 7. Коллоквиум.
- •Занятие 8. Строки Указатели и строки
- •Функции ввода, вывода строк
- •Стандартные функции обработки строк
- •Занятие 9. Директивы препроцессора.
- •Директива #include
- •Директива #define
- •Директивы условной компиляции #if, #elif, #else и #endif
- •Директива #undef
- •Макроопределения с параметрами
- •Занятие 10.
- •Занятие 11.
- •Занятие 12.
Директива #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).