русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Использование директивы #define


Дата добавления: 2015-06-12; просмотров: 1810; Нарушение авторских прав


С помощью директивы #define можно вводить собственные обозначения базовых или производных типов.

Пример:

Директива

#define REAL long double

вводит имя REAL для типа long double. Далее в тек­сте программы можно определять объекты типа long double, используя данное имя:

REAL x, array [6];

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

Директиву #define также удобно использовать для сокращенного обозначения оператора печати, в случае, когда в программе требуется часто выводить на эк­ран значение переменной с одним и тем же пояснительным текстом.

Пример:

После записи директивы

#define PN printf ("\n Номер элемента=%d", N);

Последовательность операторов

int N=4;

PN;

выведет на экран текст

Номер элемента=4

Еще одной из областей эффективного применения макросов является адресации элементов многомерных массивов.

Доступ к элементам многомерных массивов в С++ имеет две особенности, которые создают неудобства при работе с ними:

· при обращении к элементу массива нужно указывать все его индексы,

· нумерация элементов массивов начинается с нуля.

Применение макросов для организации доступа к элементам массива позволяет обойти трудности, вызванные указанными выше особенностями, хотя это достигается за счет нетрадиционных обозначений элементов - индексы в макросах, представляющих элементы массивов, заключаются в круглые скобки.

Пример:

#define N 4 // число строк матрицы

#define M 5 // число столбцов матрицы

#define A(i,j) x[M*(i-l) + (j-1)]

#include <stdio.h>

void main ( )

{

/* Определение одномерного массива */

double x[N*M];

int i, j, k;

for (k=0; k < N*M; k++) x[k]=k;

/* Перебор строк */

for (i=1; i<=N; i++) {

printf ("\n Строка %d:", i);

for (j=1; j<=M; j++) printf(" %6.1f", A(i, j)); // перебор элементов строк



}

}

Результат выполнения программы:

Строка 1: 0.0 1.0 2.0 3.0 4.0

Строка 2: 5.0 6.0 7.0 8.0 9.0

Строка 3: 10.0 11.0 12.0 13.0 14.0

Строка 4: 15.0 16.0 17.0 18.0 19.0

В программе создается виртуальный многомерный массив, размерностью N×М (N – число строк, M - число столбцов). Размерность массива задается на этапе пре­процессорной обработки с помощью директивы #define. Для имитации многомерного массива (создания виртуального массива) в программе используется макроопределения и одномерный (реальный) массив x[] размерностью N*M. Таким образом, элементы виртуального многомерного массив будут размешаться в одномерном массиве построчно. Значения элементам массива присваиваются в цикле с параметром k.

На рис. 2.7 приведена схема одномерного массива х[ ] для моделирования виртуального двумерного массива с помощью макоопределений.

Рис. 2.7 – Имитация многомерного массива с помощью одномерного массива и макроопределения.

Для доступа к элементам массива используются макровызо­вы A(i, j). Индекс i соот­ветствует номеру строки многомерного массива и изменяется от 1 до N, а индекс j – номеру столбца и изменяется во внутреннем цикле от 1 до М. A(i,j) является достаточно естественным обо­значениями элементов матрицы, причем нумерация столбцов и строк начинается с 1.

За счет применения макросов выполняются замены параметризо­ванных обозначений A(i, j) на x[5*(i-l)+(j-l)]. Далее действия выполняются над элементами одномерного массива х[ ]. Но т.к. данные преобразования выполняются на этапе препроцессорной обработки можно считать, что осуществляется работа с традиционными для многомерных массивов обозначениями.

Использованный в программе оператор

printf (“% 6.1f”, A (i, j));

после макроподстановок будет иметь вид:

printf (“% 6.1f”, x[5*(i-l)+(j-l)]);

Например

A (1,1) соответствует x[0] - вычислено как x[5(1-1)+(1-1)]

A (1,2) соответствует x[1] – вычислено x[5(1-1)+(2-1)]

A (2,1) соответствует x[5] – вычислено как x[5(2-1)+(1-1)]

A (3,4) соответствует x[13] – вычислено как x[5(3-1)+(1-1)]

Макросы унаследованы из языка С, при написании программ на C++ их следует избегать. Вместо макросов без параметров предпочтительнее использовать const или enum, а вместо параметризованных макросов — встроенные функ­ции или шаблоны.

Директива #undef отменяет действие директивы #define.

Директива #undef имеет следующий формат:

#undef идентификатор

После выполнения директивы идентификатор, ранее определенный директивой #define. для пре­процессора становится неопределенным, и его можно опреде­лять повторно.

Пример:

Если для переопределения константы M использовать последовательность директив

#define M 16

#undef M

#define М ‘С’

#undef M

#define M “С”

никаких предупреждающих сообщений выдано не будет (как это было в рассмотренном ранее примере без использования директивы #undef).

Директива #undefиспользуется редко, напри­мер, для отключения какой-либо опции компилятора.

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

В этом случае могут встретиться одинаковые обозначе­ния различных объектов. Чтобы не изменять исходных файлов, включаемый текст можно обрамлять директи­вами #define, #undef и тем самым устранять возможные ошиб­ки.

Пример:

А = 10; // Основной текст

#define A X

А = 5; // Включенный текст

#undef A

В = А; // Основной текст

При выполнении программы переменная В примет значение 10, несмотря на наличие оператора присваивания А = 5; во включенном тексте.

Директива #include вставляет в текст программы описания из указанного файла, в ту точку, где эта директива записана.

Данная директива имеет две формы записи:

#include <имя_файла>

#include “имя_файла”

Имя файла может быть указано с расширением. Конструкция, указывающая имя файла, может являться вызовом макроса, введенного директивой #define, который за конечное число подстановок формирует последовательность символов <имя_файла> либо “имя файла”.

Файлы, имеющие расширение .h, называются заголовочными файлами (header file). Они могут содержать:

· определения типов, констант, встроенных функций, шаблонов, перечислений;

· объявления функций, данных, имен, шаблонов;

· пространства имен;

· директивы препроцессора;

· комментарии.

В заголовочном файле не должно быть определений функций и данных. Эти пра­вила не являются требованием языка, а отражают разумный способ использова­ния директивы.

В форме заголовочных файлов оформляются описания функций стандартных библиотек, а также определения и описания типов и констант, используе­мых при работе с библиотеками компилятора. Например, заголовочных файл stdio.h содержит описание функции ввода/вывода printf, scanf и др. Каталог заголовочных файлов поставляется вместе со стандартными библиотеками компилятора.

Для подключения стандартных заголовочных файлов, используется первая форма записи (имя заключается в угловые скобки). В этом случае поиск файла ведется в стандартных каталогах заголовочных файлов. Например, для включения в текст программы заголовочного файла stdio.h используется директива

#include < stdio.h >.

Стандартные заголовочные файлы могут быть включены в текст программы в любом порядке и по несколько раз без отрицательных побочных эффектов. Однако действие включаемого заголовочного файла распространяется на текст программы только в пределах одного модуля от места размещения директивы #includeи до конца текстового файла (и всех включаемых в программу текстов).

Перечень заголовочных файлов утвержден стандартом языка. Перечислим некоторые заголовочные файлы языка С++:

float.h - работа с вещественными данными

limits.h - предельные значения целочисленных данных

matb.h - математические вычисления

stdio.h - средства ввода-вывода

string.h - работа со строками символов

time.h - определение дат и времени

В конкретных реализациях состав и наименования заголовочных файлов могут отличаться. Например, в компиляторах для MS-DOS активно используются файлы mem.h, alloc.h, conio.h, dos.h, graphics.h и др.

Для каждого файла библиотеки С с именем <name.h> имеется соответст­вующий файл библиотеки C++ <cname>, в котором те же средства описываются в пространстве имен std. Например, директива #include <cstdio> обеспечивает те же возможности, что и #include <stdio.h>, но при обращении к стандартным функциям требуется указывать имя пространства имен std.

Программист может самостоятельно создать собственные заголовочные файлы. При этом используется вторая форма записи (имя файла указывается в кавычках). В этом случае поиск файла ведется сначала в каталоге с исходным файлом, а затем в стандартных каталогах.

Создание таких заголовочных файлов, является эффективным средством при модульной разработке крупных программ. В этом случае связь между модулями, размещаемыми в раз­ных файлах, реализуется не только с помощью параметров, но и через внешние объекты, глобальные для нескольких или всех модулей. Описания таких внешних объектов и прототипы функций помещаются в од­ном файле, который с помощью директив #includeвключается во все модули, где они необходимы.

Внешние объекты должны записываться в заголовочном файле со спецификатором extern. Например:

int ii, jj, ll; // целые внешние переменные

extern float aa, bb; // вещественные внешние переменные

Термин «заголовочный файл» обусловлен тем, что включение заголовочных файлов необходимо помещать в начале текста программы, т.е. заведомо раньше обращений к объектам и функциям, определенным в данном файле. Хотя заголовочный файл может быть включен в программу не в ее начале, а непосредственно перед обращением к функции, описанной в заголовочном файле, этого делать не рекомендуется.



<== предыдущая лекция | следующая лекция ==>
Сравнение макросов и функций | Условная компиляция


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.946 сек.