Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

7 Структурное программирование 2012

.pdf
Скачиваний:
12
Добавлен:
29.02.2016
Размер:
310.72 Кб
Скачать

11

7.6 Рекурсивные подпрограммы

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

Рекурсия находит широкое применение в ряде алгоритмов математических вычислений. В этом случае она позволяет упростить тексты программы. Примером может служить функция определения факториала числа:

int fac(int n) {return (n>1) ? n*fac(n-1) : 1; }

Что может быть переписано в виде: int fac(int n)

{

if (n > 1)

return n*fac(n-1);

 

else

return 1;

}

 

 

Отрицательным

моментом использования рекурсивных подпрограмм является то,

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

void fool() { fool();

}

Может иметь место случай косвенной рекурсии, когда подпрограмма вызывает другую подпрограмму, которая внутри себя вызовет первую. Пример

int

f1()

{

f2;

;

return

0};

//

В

теле

имеет вызов rf2

int

f2()

{

f1;

;

return

0}

//

В

теле

функция имеет вызов rf1

7.7 Пример использования подпрограмм

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

#include <iostream.h>

 

 

 

 

int entry(float

M[4][4]);

// прототип функции ввода данных

int

count(float

M1[4][4], float M2[4][4]);//

прототип

функции

расчета

int

outdata(float M[4][4]);

//

прототип

функции

вывода результатов

double degree(double x, unsigned

int n=2);// прототип функции возведения в степень

int main(void)

//

определение головной функции

{ float A[4][4], B[4][4];

//

локальные матрицы исходных данных и результата

entry(A);

//

вызов

функции для ввода данных в матрицу А

count(A,B);

//

расчет матрицы В результата вызовом функции

cout << “\nИсходная матрица

\n”; //

сообщение на экране

outdata(A);

//

вывод

элементов исходной матрицы А на экран

cout << “\nМатрица результата \n”;

// сообщение на экране

outdata(B);

//

вывод

элементов матрицы результата В на экран

return 0;

//

код успешного завершения программы

} // main ----------------------------------------------------------

int entry(float M[4][4])

 

//

определение функции ввода матрицы

{ for(int i=0; i<4; i++){

 

//

цикл изменения индексов строк

for(int j=0; j<4; j++)

 

//

цикл изменения индексов столбцов

{ cout << "\nM[" << i <<

"." << j

<< "]=";

// экранный запрос

cin >> M[i][j];

 

//

ввод элемента с клавиатуры

}

 

 

 

 

} return 0;

 

//

код успешного завершения entry

} // entry ----------------------------------------------------------

int count(float M1[4][4], float M2[4][4])

// определение функции расчета

{ for(int i=0; i<4; i++)

 

 

 

// цикл изменения индексов строк

for(int j=0; j<4; j++)

 

 

 

// цикл индексов столбцов

 

 

 

 

 

 

 

12

 

 

 

 

M2[i][j]=degree(M1[i][j]);

 

 

 

 

 

// расчет элемента результата

return 0;

// код успешного завершения count

} // count ----------------------------------------------------------------

 

 

 

 

 

 

 

int outdata(float M[4][4])

// определение функции вывода матрицы на экран

{ for(int i=0; i<4; i++){

// цикл изменения

вывода строки

for(int j=0; j<4; j++) cout << M[i][j] << "

";

// цикл вывода в строке

cout << endl;

 

 

 

 

 

 

// переход на новую строку

}

 

 

 

 

 

 

 

 

 

 

 

 

return 0;

// код успешного завершения outdata

} // outdata ---------------------------------------------------------------

 

 

 

 

 

 

 

double degree(double x, unsigned int n)

 

// определение функции степени

{ double res=1;

 

 

// локальная переменная результата

for(int i=1; i<=n; i++) res=res*x;

 

 

// цикл расчета степени

return res;

// возврат результата в точку вызова

} // degree ----------------------------------------------------------------

 

 

 

 

 

 

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

entry(A)

 

 

 

 

Ввод исходных данных с клавиатуры

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

count(A,B)

 

 

 

 

Расчет матрицы результата

 

 

 

 

 

 

 

 

 

 

 

 

 

‘Исходная

 

 

 

 

 

 

 

 

Вывод строки сообщения на экран

 

 

матрица’

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

outdata(A)

 

 

 

 

Вывод исходной матрицы на экран

 

 

 

 

 

 

 

 

 

 

 

 

 

‘Матрица -

 

 

 

Вывод строки сообщения на экран

 

 

 

 

 

 

 

результат’

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

outdata(B)

 

 

 

 

Вывод матрицы результата на экран

 

 

 

 

 

 

 

 

 

 

 

 

 

Конец

Рисунок 7.3 – Схема головной программы entry

i

от

1

до

4

j

от

1

до

4

 

M[i][j]

М

Циклическая модификация индексов элементов массива

Ввод по запросу значения элемента с клавиатуры

Передача массива в программу через параметр-переменную

Выход

Рисунок 7.4 – Схема подпрограммы ввода матрицы

13

count

 

 

M1

 

 

i

от

1

до

4

j

от

1

до

4

M2[i][j]=degree

(M1[i][j])

M2

Выход

Получение исходной матрицы из программы через параметры

Циклическая модификация индексов элементов массива

Расчет элементов матрицы М2

Передача M2 в программу через параметр-переменную

Рисунок 7.5 – Схема подпрограммы расчета массива результата

OutMatrix

 

 

 

 

 

 

 

 

 

 

 

 

М

 

 

 

 

 

Получение матрицы

 

 

 

 

 

 

 

 

 

из программы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i от 1

до 4

 

 

 

 

 

Цикл номера строки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Перевод курсора

 

 

 

 

 

 

 

 

 

 

 

j от 1

до 4

 

 

 

Цикл номера столбца

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

M[i][j]

 

 

 

 

 

 

 

 

 

 

Вывод в троке значения

 

 

 

 

 

 

 

элемента матрицы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Выход

Рисунок 7.6 – Схема подпрограммы вывода матрицы на экран

14

7.9 Модульность языков программирования С и С++

Модули являются в языках C и C++ основой модульного программирования. Они используются для создания библиотек, которые могут включаться в различные программы (при этом становится необязательным иметь в наличии исходный код), а большие программы могут подразделяться на логически связанные модули.

Модульность программ дает следующие преимущества:

а) сокращает общий объем программ за счет того, что наиболее часто использующиеся программные ресурсы помещаются вне программы, и они могут использоваться другими программами;

б) повышается наглядность программ; в) улучшается процесс отладки программ, так как в модуль помещаются откомпи-

лированные верифицированные программные ресурсы; г) защищаются авторские права программиста, так как при продаже или про-

граммном обмене можно поставлять откомпилированные tpu-файлы модулей с описанием интерфейса, а не исходные тексты программ.

Недостатками модулей являются а) проблемы связанные с совместным использованием программной нескольких мо-

дулей (доступа к компонентам, имеющим одинаковые имена, или несовместимость некоторых модулей);

б) увеличение числа файлов, необходимых для работы над программой. В языках С и С++ модули представлены тремя видами:

1) одиночные заголовочные файлы, имеющие расширение .h;

2) файлы программных модулей, состоящие из одноименных заголовочного и cppфайлов файлов;

3) динамически подключаемые библиотеки (DLL-модули)

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

Директива #include "имя файла"

замещает строку, в которой встретилось #include, содержимым исходного текста на C++ файла указанного файла.

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

Если необходимо использовать одноименную переменную только локально, внутри модуля, тогда ее можно определить как static

7.10 Заголовочные файлы

 

Для использования программных ресурсов созданных ранее файлов исходных тек-

стов, необходимо в начале программы с помощью директивы препроцессора

#include

подключить к программе файл в формате

 

 

 

#include <имя заголовочного файла>

// из стандартного каталога

INCLUDE

или

#include "имя заголовочного файла"

// из текущего каталога

 

замещает строку, в которой встретилось #include, содержимым исходного

текста на

C++файла указанного файла.

 

 

 

Следующее эмпирическое правило является не требованием языка, а

просто пред-

ложением по разумному использованию аппарата #include.

 

 

В заголовочном файле могут содержаться:

 

 

1) Определения типов, например:

struct point { int x,

y; };

 

2) прототипы функций, например:

extern int strlen(const char*);

3)определения inline-функций, например: inline char get() { return *p++;}:

4)описания внешних переменных, например: extern int a;

5)

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

const float

pi = 3.141593;

6)

перечисления, например:

enum bool {

false, true };

7)

директивы include, например:

#include

 

 

15

 

8)

определения макросов, например:

#define Case break;case

9)

комментарии, например:

/* проверка на конец файла */

Запрещается использование

 

1)

Определения обычных функций, например:

char get() { return *p++; }

2)

Определения переменных, например:

int a;

3) Определения сложных констант, например: const tbl[] = { /* ... */ } Заголовочные файлы имеют расширение h.

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

#ifendef кодовое_слово #define кодовое_слово

текст_заголовочного файла

#endif--------- конец h-файла

Первая строка содержит директиву ifendef, которая проверяет не было ли ранее определено указанное кодовое слово. Если нет, тогда производится определение этого ключевого слова с помощью директивы define, которое может быть любым (рекомендуется, чтобы оно отражало наименование h-файла). В конце файла закрывается блок проверки директивой endif.

 

Пример

заголовочного файла со структурой, описывающей комплексное число в

алгебраической форме с полями: Re – действительной части и Im – мнимой. Имя файла

– re_im.h.

 

#ifndef reim_h

#define reim_h

struct compl

// Описание структуры комплексного числа

{ double Re;

// действительная часть

 

double Im;

// мнимая часть

};

// конец структуры

#endif

 

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

#include <iostream.h>

// подключения потоков для работы с консолью

#include "re_im.h"

// подключения типа комплексного числа

compl cadd(compl X, compl Y);

// функция сложения двух комплексных чисел

void incomplex(char *st, compl *x);

// функция ввода комплексного числа

void outcomplex(char *s, compl y);

// функция вывода комплексного числа на экран

int main() // головная программа --------------------------------------------

 

 

{ compl A, B, C;

// три локальных комплексных числа

incomplex("A",&A);

// ввод числа А с клавиатуры

incomplex("B",&B);

// ввод числа B с клавиатуры

C=cadd(A,B);

// сложение комплексных чисел в п6еременной С

outcomplex("C",C);

// вывод результата на экран

return 0;

// код успешного завершения программа

}//-------------------------------

конец main

 

compl cadd(compl X, compl Y)

// Описание функции сложения комплесных чисел

{ compl Z;

// локальная переменная

Z.Re=X.Re+Y.Re;

// Сумма действительных частей

Z.Im=X.Im+Y.Im;

// сумма мнимых частей

return Z;

// возврат результата

}//------------------------------------------

 

 

void incomplex(char *st,compl *x)

// Описание функции ввода комплексного числа

{ cout << *st << ".re=";

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

cin >> x->Re;

// ввод действительной части

cout << *st << ".im=" ;

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

cin >> x->Im;

// ввод мнимой части

}//------------------------------------------------

 

 

void outcomplex(char *s, compl y)

// вывод комплексного числа на экран

{ cout << "\n" << *s << ".re=" << y.Re << "

" << *s << ".im" << y.Im;

} // ----------------------------------------------

 

 

16

7.11 Статические модули

Статические модули в языке С представляют собой откомпилированный набор программных ресурсов: типов данных, подпрограмм, переменных.

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

1)заголовочного h-файла, который является интерфейсом модуля,

2)одноименного cpp-файла реализации, который при компиляции преобразуется в

объектный obj-файл, где задается реализация функций и объявляются переменные и структурированные константы, используемые для собственных нужд модуля. Структура заголовочного файла расписана выше, а состав файла реализации сле-

дующий:

1)директива #include “заголовочный файл модуля”, подключает h-файл;

2)список include-подключения внешних ресурсов других модулей;

3)объявление собственных глобальных переменных и констант, которые могут использоваться как для обмена между функциями модуля, так и для обмена данными между модулями;

4)описание внешних (extern) переменных, объявленных в других модулях проекта, которые не подключены с помощью include;

5)собственные внутренние функции модуля, используемые только внутри модуля;

6)описание функций, прототипы которых объявлены в h-файле модуля; Статические откомпилированные модули в последствии могут использоваться без

исходного текста cpp-файлов, что позволяет защитить авторские права на программную реализацию подпрограмм.

Возможно компоновка статического модуля в виде библиотечного файла, который имеет одинаковое имя с модулем, но расширение обозначается как lib.

Библиотечные подпрограммы C++ объявляются со своими прототипами в одном или более файлов заголовка.

Пример модуля со структурой комплексного числа в алгебраической форме и тре-

мя функциями: ввода, вывода и сложения

комплексных чисел в алгебраической форме.

Заголовочный файл re_im.h модуля

 

#ifndef reim_h

// ------------------

 

проверка наличия ключа модуля

#define reim_h

// ------------------

 

определение блокирующего ключа

struct compl

 

// структура мнимого

типа данных в алгебраической форме

{ double Re;

 

// действительная часть числа

double Im;

 

// мнимая часть числа

}// ----------------

 

конец описания

структуры

compl cadd(compl X, compl Y);

//

функция сложения двух комплексных чисел

void incomplex(char *st, compl *x);

//

функция ввода комплексного числа

void outcomplex(char *s, compl y);

//

функция вывода комплексного числа на экран

#endif

//----------------

конец h-файла модуля ---------------------------

Файл реализации модуля re_im.cpp

 

#include “re_im.h”

 

//

подключение заголовочного файла модуля

#include <iostrea.h>

//

подключение требуемых ресурсов ввода-вывода

compl cadd(compl X, compl Y)

//

Описание функции сложения комплексных чисел

{ compl Z;

 

 

//

локальная переменная

Z.Re=X.Re+Y.Re;

 

//

Сумма действительных частей

Z.Im=X.Im+Y.Im;

 

//

сумма мнимых частей

return Z;

 

 

//

возврат результата

}//-------------------------------------------------------------

 

 

 

 

void incomplex(char *st,compl *x)

//

Описание функции ввода комплексного числа

{ cout << *st << ".re=";

//

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

cin >> x->Re;

 

//

ввод действительной части

cout << *st << ".im=" ;

//

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

cin >> x->Im;

 

//

ввод мнимой части

} // ------------------------------

 

 

 

 

void outcomplex(char *s, compl y)

//

вывод комплексного числа на экран

{cout << "\n" << *s << ".re=" << y.Re << " " << *s << ".im" << y.Im;

} // -----------------

конец текса файла реализации ----------------------

Пример программы, использующей ресурсы модуля

#include "re_im.h"

//

подключения типа комплексного числа

int main()

//

головная программа

 

17

{ compl A, B, C;

// три локальных комплексных числа

incomplex("A",&A);

// ввод числа А с клавиатуры

incomplex("B",&B);

// ввод числа B с клавиатуры

C=cadd(A,B);

// сложение комплексных чисел в переменной С

outcomplex("C",C);

// вывод результата на экран

return 0;

// код успешного завершения программа

}// конец программы

-------------------------------------------------------

7.12 Назначение и состав стандартных модулей языков C и C++

Языки С и C++ предоставляют огромное количество стандартных функций, которые в совокупности составляют стандартную библиотеку, поставляемую в комплекте с конкретной версией среды программирования языка. Классическая библиотека модулей языка C++ состоит из большого количества отдельных тематических библиотек. Под стандартной библиотекой, часто понимаю стандартную библиотеку шаблонов (Standart Template Library, STL), но STL фактически является только большой частью стандартной библиотеки. В языке C++ входят следующие составляющие библиотек модулей:

1)стандартные библиотеки языка С;

2)стандартные библиотеки C++, составляющие STL;

3)дополнительные библиотеки интегрированной среды программирования, которые обычно представлены в виде заголовочных файлов. Для языка С версии ANSI их состав указан в таблице 7.1, а для С++ - в таблице 7.2.

4)объектно-ориентированные библиотеки интегрированной среды (MFC, ATL, WTL,

OWL, VCL и многие другие), которые используются при программировании приложений для операционных систем Windows или Linux;

5)интерфейс прикладного программирования (или интерфейс программирования приложений) — набор готовых классов, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах; сокращенно API от англ. Application Programming Interface, предоставляемых операционной системой (например, Windows API или Linux Kernel API);

6)нестандартные библиотеки, например, API графических интерфейсов (OpenGL, GTK, GDI, Direct3D и другие).

Таблица 7.1 - Описание заголовочных файлов языка ANSI С

h-файл

Описание

assert

Содержит макрос утверждений, используемый для обнаружения логических

 

и некоторых других типов ошибок в отлаживаемой версии программы.

complex

Набор функций для работы с комплексными числами. (Появилось в C99)

ctype

Содержит функции, используемые для классификации символов по их типам

 

или для конвертации между верхним и нижним регистрами независимо от

 

используемой кодировки.

errno

Для проверки кодов ошибок, возвращаемых библиотечными функциями.

fenv

Для управления средой, использующей числа с плавающей запятой.

float

Содержит заранее определенные константы, описывающие специфику реали-

 

зации свойств библиотеки для работы с числами с плавающей запятой,

 

как, например, минимальная разница между двумя различными числами с

 

плавающей точкой (_EPSILON), максимальное число цифр точности (_DIG)

 

и область допустимых чисел (_MIN, _MAX).

inttypes

Для точной конвертации целых типов. (Появилось в C99)

iso646

Для программирования в кодировке ISO 646. (Появилось в NA1)

limits

Содержит заранее заданные константы, определяющие специфику реализа-

 

ции свойств целых типов, как, например, область допустимых значений

locale

Для setlocale() и связанных констант. Используется для выбора соот-

 

ветствующего языка.

math

Для вычисления основных математических функций

setjmp

Объявляет макросы setjmp и longjmp, используемые для переходов

signal

Для управления различными исключительными условиями

stdarg

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

stdbool

Для булевых типов данных. (Появилось в C99)

stdint

Для определения различных типов целых чисел. (Появилось в C99)

 

 

 

 

 

18

 

 

 

 

 

 

 

 

h-файл

 

 

 

 

Описание

 

stddef

 

Для определения нескольких полезных типов и макросов.

 

stdio

 

Реализует основные возможности ввода и вывода в языке С

stdlib

 

Для выполнения множества операций, включая конвертацию, генерацию

 

 

псевдослучайных чисел, выделение памяти, контроль процессов, окруже-

 

 

ния, сигналов, поиска и сортировки.

 

string

 

Для работы с различными видами строк.

 

tgmath

 

Для типовых математических функций. (Появилось в C99)

 

time

 

Для конвертации между различными форматами времени и

даты.

wchar

 

Для

обработки «широких» потоков и нескольких видов

строк при помощи

 

 

«широких» символов (поддержка набора языков).

 

wctype

 

Для классификации «широких» символов. (Появилось в NA1)

Таблица

7.2 – Стандартные заголовочные файлы языка C++

 

 

 

 

 

 

 

Файл

 

 

 

Назначение

 

<bitset>

 

 

Реализует

специализированный класс контейнеров std::bitset — бито-

 

 

 

 

вый массив.

 

<deque>

 

 

Реализует

шаблон класса контейнера std::deque — очередь с двусто-

 

 

 

 

ронним доступом.

 

<list>

 

 

Реализует

шаблон класса контейнера std::list — двусвязный список.

<map>

 

 

Реализует

шаблоны классов контейнеров std::map и std::multimap —

 

 

 

 

Ассоциативный массив и мультиотображение.

 

<queue>

 

 

Реализует

класс адаптер-контейнера std::queue — односторонняя оче-

 

 

 

 

редь.

 

 

<set>

 

 

Реализует

шаблоны классов контейнеров std::set и std::multiset —

 

 

 

 

сортированные ассоциативные контейнеры или множества.

<stack>

 

 

Реализует

класс адаптер-контейнера std::stack — стек.

<vector>

 

 

Реализует

шаблон класса контейнеров std::vector — динамический

 

 

 

 

массив.

 

 

<algorithm>

 

Реализует

определения многих алгоритмов для работы с контейнерами.

<functional>

 

Реализует

несколько объект-функций, разработанных для работы со

 

 

 

 

стандартными алгоритмами.

 

<iterator>

 

 

Реализует классы и шаблоны для работы с итераторами.

<locale>

 

 

Реализует

классы и шаблоны для работы с локалями.

 

<memory>

 

 

Реализует

инструменты управления памятью в C++, включая шаблон

 

 

 

 

класса std::auto_ptr.

 

<stdexcept>

 

Содержит стандартную обработку ошибок классов, например,

 

 

 

 

std::logic_error и std::runtime_error, причем оба происходит из

 

 

 

 

std::exception.

 

<utility>

 

 

реализует

шаблон класса std::pair для работы с парами (двучленными

 

 

 

 

кортежами) объектов.

 

<string>

 

 

Реализует стандартные строковые классы и шаблоны.

<fstream>

 

 

Реализует

инструменты для файлового ввода и вывода.

<ios>

 

 

Реализует несколько типов и функций, составляющих основу операций

 

 

 

 

с iostreams.

 

<iostream>

 

 

Реализует основы ввода и вывода языка C++.

 

<iosfwd>

 

 

Реализует предварительные объявления нескольких шаблонов классов,

 

 

 

 

связанных

с вводом-выводом.

 

<iomanip>

 

 

Реализует

инструменты для работы с форматированием вывода, напри-

 

 

 

 

мер базу,

используемую при форматировании целых и точных значений

 

 

 

 

чисел с плавающей запятой.

 

<istream>

 

 

Реализует

шаблон класса std::istream и других необходимых классов

 

 

 

 

для ввода.

 

 

<ostream>

 

 

Реализует

шаблон класса std::ostream и других необходимых классов

 

 

 

 

для вывода.

 

<sstream>

 

 

Реализует

шаблон класса std::sstream и других необходимых классов

 

 

 

 

для работы со строками.

 

<complex>

 

 

Реализует шаблон класса std::complex и связанные функции для ра-

 

 

 

 

боты с комплексными числами.

 

 

 

19

 

 

 

Файл

 

Назначение

<numeric>

Реализует

алгоритмы для числовой обработки

<valarray>

Реализует

шаблон класса std::valarray — класс массивов, оптимизи-

 

рованный для числовой обработки.

<exception>

Реализует

несколько типов и функций, связанных с обработкой исклю-

 

чений, включая std::exception — базовый класс всех перехватов ис-

 

ключений в Стандартной Библиотеке.

<limits>

реализует шаблон класса std::numeric_limits, используемый для

 

описания свойств базовых числовых типов.

<new>

Реализует операторы new и delete, а также другие функции и типы,

 

составляющие основу управления памятью в C++.

<typeinfo>

Реализует

инструменты для работы с динамической идентификацией ти-

 

па данных

в C++.

7.12.1 Состав стандартных функций модуля math

Модуль стандартной библиотеки math.h разработан для выполнения простых математических операций. Функции модуля используют числа с плавающей точкой (как правило, типа double). В языке C++ данные функции для обеспечения совместимости сформированы в заголовочный файл cmath.

Всостав модуля входят:

1)базовые функции (таблица 7.2);

2)дополнительные функции стандарта C99, приведенные в таблице 7.3;

3)функции расширения XSI, которые не описаны в стандартах ANSI или ISO C, но могут присутствовать в системах в качестве расширений X/Open (таблица 7.4).

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

Таблица 7.3 - Базовые функции модуля math

Имя

 

Описание

acos

арккосинус

asin

арксинус

atan

арктангенс

atan2

арктангенс с двумя параметрами

ceil

округление до ближайшего большего целого числа

cos

косинус

cosh

гиперболический косинус

exp

вычисление экспоненты

fabs

абсолютная величина (числа с плавающей точкой)

floor

округление до ближайшего меньшего целого числа

fmod

вычисление остатка от деления нацело для чисел с плавающей точкой

frexp

разбивает число с плавающей точкой на мантиссу и показатель степени.

ldexp

умножение числа с плавающей точкой на целую степень двух

log

натуральный логарифм

log10

логарифм по основанию 10

modf(x,p)

извлекает целую и дробную части (с учетом знака) из числа с плаваю-

 

щей точкой

pow(x,y)

результат возведения x в степень y, xy

sin

синус

sinh

гиперболический синус

sqrt

квадратный корень

tan

тангенс

tanh

гиперболический тангенс

Таблица 7.4 - Дополнительные функции стандарта C99

 

 

 

Имя

 

Описание

 

 

 

acosh

 

гиперболический арккосинус

asinh

 

гиперболический арксинус

atanh

 

гиперболический арктангенс

cbrt

 

кубический корень

 

20

 

 

 

copysign(x,y

возвращает величину, абсолютное значение которой равно x, но знак

)

которой соответствует знаку y

erf

функция ошибок

erfc

Дополнительная функция ошибок

exp2(x)

значение числа 2, возведённого в степень x, 2x

expm1(x)

значение функции ex − 1

fdim(x,y)

вычисление положительной разницы между x и y, fmax(x−y, 0)

fma(x,y,z)

значение функции (x * y) + z (см. FMA)

fmax(x,y)

наибольшее значение среди x и y

fmin(x,y)

наименьшее значение среди x и y

hypot(x,y)

гипотенуза, sqrt(x² + y²)

ilogb

экспонента числа с плавающей точкой, конвертированная в int

lgamma

натуральный логарифм абсолютного значения гамма-функции

llrint

округление до ближайшего целого (возвращает long long)

lrint

округление до ближайшего целого (возвращает long)

llround

округление до ближайшего целого в направлении от нуля (возвращает

 

long long)

lround

округление до ближайшего целого в направлении от нуля (возвращает

 

long)

log1p(x)

натуральный логарифм 1 + x

log2

логарифм по основанию 2

logb

целочисленная часть логарифма x по основанию 2

nan(s)

возвращает нечисловое значение 'Not a Number'

nearbyint

округление аргумента до целого значения в формате числа с плаваю-

 

щей точкой

nextafter(x,

следующий ближайшее представимое для x (по направлению к y)

y)

 

 

nexttoward(x

то же, что и nextafter, но y имеет тип long double

,y)

 

 

remain-

вычисляет остаток от деления согласно стандарту IEC 60559

der(x,y)

 

 

remquo(x,y,p

то же, что и remainder, но сохраняет коэффициент по указателю p

)

(как int)

rint

округление до целого (возвращает int) с вызовом ошибку inexact,

 

если результат отличается от аргумента.

round

округление до целого (возвращает int)

scalbln(x,n)

x * FLT_RADIXn (n is long)

scalbn(x,n)

x * FLT_RADIXn (n is int)

tgamma

гамма-функция

trunc

округление до ближайшего целого числа в направлении к нулю

Таблица

7.5 - Функции расширения XSI

 

 

 

Имя

 

Описание

j0(x)

 

значение функций Бесселя первого рода порядков 0 для аргумента x

j1(x)

 

значение функций Бесселя первого рода порядков 1 для аргумента x

jn(n,x)

 

значение функций Бесселя первого рода порядка n

y0(x)

 

значение функций Бесселя второго рода порядков 0 для аргумента x

y1(x)

 

значение функций Бесселя второго рода порядков 1 для аргумента x

yn(n,x)

 

значение функций Бесселя второго рода порядка n

7.12.2 Стандартные функции модуля complex

Модуль complex.h из стандартной библиотеки языка программирования С содержит функции для комплексной арифметики, использующие встроенный тип complex, который появился в стандарте C99. Функции complex.h используют параметры трёх типов — double, float и long double, угловые значения представляются в радианах.

Таблица 7.6 - Функции модуля complex для работы с комплексными числами

Функции

Описание

cabs, cabsf, cabsl

Абсолютное значение комплексного числа

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]