Функции с переменным числом параметров 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функции с переменным числом параметров



 

Если список формальных параметров функции заканчивается многоточием, это означает, что при ее вызове на этом месте можно указать еще несколько параметров. Проверка соответствия типов для этих параметров не выполняется, char и short передаются как int, a float – как double. В качестве примера можно привести функцию printf, прототип которой имеет вид:

int printf (const char*,...):

Это означает, что вызов функции должен содержать по крайней мере один параметр типа char* и может либо содержать, либо не содержать другие параметры:

printf ("Введите исходные данные"): // один параметр

printf("Cyммa: %5.2f рублей", sum): // два параметра

printf("%d %d %d %d", a, b, c, d); // пять параметров

Для доступа к необязательным параметрам внутри функции используются макросы библиотеки va_start, va_arg и va_end, находящиеся в заголовочном файле <stdarg.h>.

Поскольку компилятор не имеет информации для контроля типов, вместо функций с переменным числом параметров предпочтительнее пользоваться параметрами по умолчанию или перегруженными функциями (см. «Перегрузка функций»), хотя можно представить случаи, когда переменное число параметров является лучшим решением.

 

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

 

Если необходимо вывести только один результат целесообразно воспользоваться оператором return.

Если требуется вывести значения нескольких переменных удобно использовать ссылки, так как не требуется взятия адреса и разыменования. Пример:

#pragma hdrstop

#include <iostream.h>

#include <conio.h>

void f(int i, int* j, int& k,int& s,int& pr);

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

#pragma argsused

int main(int argc, char* argv[])

{

int i = 1, j = 2, k = 3,p=0,prt=0;

cout <<"i j k\n";

cout <<i<<' '<<j<<' '<<k<<'\n';

f(i, &j, k, p, prt);

cout <<i<<' '<<j<<' '<<k<<'\n';

cout <<"\ni+j+k="<<p;

cout <<"\ni*k="<<prt;

cout <<"\nPress and key...";

getch();

return 0;

}

void f(int i, int* j, int& k,int& s,int& pr)

{i++; (*j)++; k++;s=i+(*j)+k,pr=i*k;}

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

i j k

1 2 3

1 3 4

i+j+k=9

i*k=8

 

Рекурсивные функции

 

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

Классическим примером рекурсивной функции является вычисление факториала (это не означает, что факториал следует вычислять именно так). Для того чтобы получить значение факториала числа n, требуется умножить на n факториал числа (n-1). Известно также, что 0!=1 и 1!=1.

long fact(long n){

if (n==0 || n==l) return 1;

return (n * fact(n - 1);

}

 

To же самое можно записать короче:

long fact(long n){return (n>l)? n * fact(n - 1): 1;}

Рекурсивные функции чаще всего применяют для компактной реализации рекурсивных алгоритмов, а также для работы со структурами данных, описанными рекурсивно. Любую рекурсивную функцию можно реализовать без применения рекурсии, для этого программист должен обеспечить хранение всех необходимых данных самостоятельно. Достоинством рекурсии является компактная запись, а недостатками – расход времени и памяти(возможно переполнение стека) на повторные вызовы функции и передачу

 



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 55; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.200.180 (0.006 с.)