Основы программирования для автоматизированного проектирования и решения творческих задач. Романенко А.В - 35 стр.

UptoLike

Составители: 

}
Главным недостатком функции является ее неправильная работа при ошибке в задании числа аргументов.
П р и м е р 40
Нулевой код при окончании списка аргументов
long sum(int n, ...)
{
int *p = &n;
long s = 0;
for (; *p; p++) s += *p;
return s;
}
Недостатком в данном случае является невозможность использования кода окончания списка внутри него как аргумента.
Для повышения мобильности, простоты и надежности функций, работающих со списками параметров переменной дли-
ны, могут быть использованы макросредства, описанные в заголовочном файле stdarg.h. В этом заголовочном файле описа-
ны макросы:
void va_start(va_list param, последний явный параметр функции);
тип va_arg( va_list param, тип);
void va_end(va_list param);
здесь va_listспециальный тип данных, описанный в файле stdarg.h; типтип очередного параметра из списка переменной
длины, к которому осуществляется доступ.
Макрос va_start используется для настройки указателя типа va_list на первый элемент списка параметров переменной
длины. Вторым параметром в нем указывается последний из явно заданных параметров функции. Применяя операцию разы-
менования, можно получить доступ к элементам списка переменной длины. Для этого необходимо знать тип текущего эле-
мента в списке. Применяя макрос va_arg, получаем значение текущего элемента списка переменной длины и переадресовы-
ваем указатель на следующий элемент списка. Макрос va_end служит для корректного завершения работы функции со спи-
ском параметров переменной длины. Он вызывается перед возвращением из функции после того, как будет обработан весь
список параметров переменной длины. Описатели типов аргументов списка переменной длины лучше передавать в функцию
в виде строки символов.
П р и м е р 41
double sum(char *format, ...)
{
va_list p;
double s = 0;
va_start(p, format);
for (; *format; format++)
switch (*format)
{
case 'i': s += va_arg(p, int); break;
case 'd': s += va_arg(p, double);
}
va_end(p);
return s;
}
13.5 Рекурсивные функции
Рекурсивным считается объект, в определении которого содержится ссылка на самого себя. Таким образом, функция,
содержащая вызов самой себя, будет считаться рекурсивной. Различают прямую и косвенную рекурсию. Если функция со-
держит явную ссылку на саму себя, то она называется явно рекурсивной. Если функция ссылается на функцию, которая вы-
зывает исходную, то такая рекурсия называется косвенной. Рекурсивная функция подобна явному циклическому итерацион-
ному процессу и всегда может быть заменена им. Она появляется тогда, когда некоторый объект может быть определен че-
рез другой объект той же сущности, но с другим содержанием: P = P1(S, P). Важным требованием, относящимся к использо-
ванию рекурсии, является конечность объектов, порожденных рекурсивным определением. Классическим примером рекур-
сивного процесса является вычисление факториала: n! = n*(n – 1)*(n – 2)*...*1.
Рекурсивные алгоритмы обычно более просты и наглядны, чем циклические. Методика анализа любой задачи на пред-
мет составления рекурсивного алгоритма ее решения состоит из следующих этапов:
1) параметризация задачи, т.е. выявление различных элементов, от которых зависит ее решение, с целью нахождения
управляющего параметра; при этом размерность управляющего параметра должна убывать после каждого рекурсивного вы-
зова;