Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР13-С++17-мая-2012.doc
Скачиваний:
13
Добавлен:
15.09.2019
Размер:
1.3 Mб
Скачать

1.11. Передача многомерных массивов в функцию

Многомерный массив – это массив, элементами которого служат массивы. Например, массив int a[4][5] – это массив из указателей int*, которые содержат имена одноименных массивов из 5 целых элементов (рис. 13.2).

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

Пример 13.25

const int N=4;//глобальная переменная

void transp(int a[][N],int n)// транспонирование матрицы

{

int r;

for(int I=0;I<n;I++)

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

if(I<j)

{

r[a[I][j];

a[I][j]=a[j][I];

a[j][I]=r;

}

}

Рис.13.2. Выделение памяти под массив, элементами которого являются массивы.

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

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

Пример 13.26

Рекурсивная функция вычисления факториала

#include <iostream>

#include <iomanip>

using namespace std;

unsigned long factorial(unsigned long number);

int main()

{

for (int i=0; i<=7; i++)

cout<<setw(2)<<i<<"!="<<factorial(i)<<endl;

system("pause");

return 0;

}

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

unsigned long factorial(unsigned long number)

{ if (number<=1) return 1;

else

return number*factorial(number-1);

}

0!=1

1!=1

2!=2

3!=6

4!=24

5!=120

6!=720

7!=5040

8!=40320

9!=362880

10!=3628800

В объявлении функции factorial указано, что она получает параметр типа unsigned long и возвращает результат типа unsigned long. Это является краткой записью типа unsigned long int. Как видно из результатов, значение факториала растет очень быстро. Указанный тип данных unsigned long позволяет выводить числа, большие чем 7!.

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

1.13. Аргументы по умолчанию

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

Пример 13.27

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

#include <iostream>

using namespace std;

inline int volume (int length=1, int width=1,

int height=1)

{return length * width * height ;}

int main()

{

cout<<” volume (length=1, width=1,height=1)”

<< volume()<<endl

<<” volume (length=10, width=1,height=1)”

<< volume(10)<<endl

<<” volume (length=10, width=5,height=1)”

<< volume(10,5)<<endl

<<” volume (length=10, width=5,height=2)”

<< volume(10,5,2)<<endl;

system("pause");

return 0;

}