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

Макроси. Директива #define. Приклади


Зміст


Пошук на інших ресурсах:




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

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

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

Для оголошення макросу використовується директива #define. Загальна форма оголошення макросу наступна:

#define MacroName(parameters) expression

тут

  • MacroName – ім’я макросу;
  • parameters – параметри, які отримує макрос;
  • expression – вираз, який обчислює макрос. Вираз розміщується в тому самому рядку, що й директива #define.

Після оголошення макросу його можна використовувати як виклик звичайної функції.

 

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

Завдання. Розробити програму, яка реалізує 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

 


Зв’язані теми