C++. Макросы. Директива #define. Примеры

Макросы. Директива #define. Примеры


Содержание


Поиск на других ресурсах:




1. Понятие макроса. Директива #define

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

  • функции;
  • макросы.

Для объявления макроса используется директива #define. Общая форма объявления макроса следующая:

#define MacroName(parameters) expression

здесь

  • MacroName – имя макроса;
  • parameters – параметры, которые получает макрос;
  • expression – выражение, которое вычисляет макрос. Выражение размещается той же строке, что и директива #define.

После объявления макроса его можно использовать как вызов обычной функции.

 

2. Реализация макросов в программах. Пример, который демонстрирует использование 3-х макросов в программах

Задача 1. Разработать программу, которая реализует 3 макросы:

  • SQR(x) – возвращает значение x2;
  • POWER_4(x) – возвращает x4;
  • SIGN(x) – определяет знак числа.

Текст программы на языке C++

#include <iostream>
using namespace std;

// Тема: Раскрытие макроса
// Используется директива препроцессора #define
// #define Имя_макроса(Параметры) (Выражение)

// 1. Макрос, который возводит число x в квадрат
#define SQR(x) ((x) * (x))

// 2. Макрос, возводящий число x в степень 4
#define POWER_4(x) (SQR(x) * SQR(x))

// 3. Макрос, возвращающий -1 если число отрицательно, 0 - если нулевое, 1 - если положительное
#define SIGN(x) (((x)<0)? -1 :(((x)==0) ? 0 : 1))

void main()
{
  // Демонстрация использования макросов в программе
  // 1. Объявить переменные
  int x;

  // 2. Ввести x с клавиатуры
  cout << "x = ";
  cin >> x;

  // 3. Вызвать макросы и вывести результат на экран
  cout << "SQR(x) = " << SQR(x) << endl;

  cout << "POWER4(x) = " << POWER_4(x) << endl;
  cout << "SIGN(x) = " << SIGN(x) << ::endl;    

  system("pause");
}

 

3. Пример, в котором в одном макросе используется результат другого макроса. Вычисление площади треугольника

В данном примере демонстрируется вызов макроса из другого макроса. Решается задача вычисления площади треугольника по сторонам a, b, c. Если из сторон a, b, c невозможно образовать треугольник, то макрос возвращает 0.

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

#include <iostream>
using namespace std;

// Макросы. Директива #define
// Вычислить площадь треугольника по сторонам a, b, c.
// Если из сторон a, b, c невозможно создать треугольник, то вернуть 0.

// Вычисление полупериметра
#define P(a, b, c) ((a+b+c)/2.0)

// Определение, можно ли из сторон a, b, c образовать треугольник
#define IS_TR(a, b, c) ((((a+b)>c)&&((b+c)>a)&&((a+c)>b)) ? true : false)

// Вычисление площади. Из данного макроса вызываются два других макроса: IS_TRIANGLE и P
#define AREA_TR(a, b, c) ((IS_TR(a,b,c)) ? (sqrt(P(a,b,c)*(P(a,b,c)-a)*(P(a,b,c)-b)*(P(a,b,c)-c))) : 0)

void main()
{
  // Демонстрация работы макросов
  double a, b, c;
  double area; // площадь - результат
  double sp; // полупериметр

  cout << "a = "; cin >> a;
  cout << "b = "; cin >> b;
  cout << "c = "; cin >> c;

  sp = P(a, b, c);
  area = AREA_TR(a, b, c);

  cout << "semiperimeter = " << sp << endl;
  cout << "area = " << area << endl;
}

Результат работы программы

a = 5
b = 8
c = 4.5
semiperimeter = 8.75
area = 10.2269

 

4. Пример разбиения решения задачи на несколько макросов. Решение квадратного уравнения

В примере демонстрируется решение квадратного уравнения. В программе объявляется 4 макроса. Также определяется, имеет ли уравнение корни.

Текст программы следующий

#include <iostream>
using namespace std;

// Макросы. Директива #define
// Вычисление дискриминанта
#define D(a, b, c) ((double)b*b-4*a*c)

// Определение, есть ли корни в уравнении, заданном коэфициентами a, b, c
#define IS_ROOTS(a, b, c) ((D(a, b, c)>=0) ? true : false)

// Вычисление корней

#define X1(a, b, c) (IS_ROOTS(a, b, c) ? ((-b - sqrt(D(a, b, c)))/(2.0*a)) : 0)

#define X2(a, b, c) (IS_ROOTS(a, b, c) ? ((-b + sqrt(D(a, b, c)))/(2.0*a)) : 0)

void main()
{
  double a, b, c;
  double d;
  double x1, x2;

  cout << "a = "; cin >> a;
  cout << "b = "; cin >> b;
  cout << "c = "; cin >> c;

  if (IS_ROOTS(a, b, c))
  {
    x1 = X1(a, b, c);
    x2 = X2(a, b, c);
    cout << "x1 = " << x1 << endl;
    cout << "x2 = " << x2 << endl;
  }
  else
  {
    cout << "The equation has no solutions";
  }
}

Результат работы программы

a = 4
b = -5
c = -6
x1 = -0.75
x2 = 2

 


Связанные темы