- •1. Краткие теоретические сведения
- •1.1. Знакомство с функциями
- •1.2. Описание функции
- •1.3.1. Тело функции
- •1.3.2. Формальные параметры функции
- •1.3.3. Обращение к функции
- •1.3.4. Фактические параметры.
- •1.4. Формальные и фактические параметры функции
- •1.5. Описание и объявление функции. Прототип функции
- •1 Способ - Перед main().
- •2 Способ - После main ().
- •1.6. Передача параметров в функцию. Изменяемые значения параметров
- •1.6.1. Передача параметров
- •1.6.2. Передача параметров по значению
- •1.6.3. Передача параметров по ссылке
- •1.6.4. Передача параметров по указателю
- •1.7. Механизм обращения к функции и передача данных
- •1.8. Локальные и глобальные переменные. Время жизни и область действия (видимости) переменных
- •1.8.1. Представление об области видимости переменных
- •1.8.2. Объявление локальных переменных
- •1.8.3. О конфликте имен
- •1.8.4. Глобальные переменные
- •1.8.5. Если имена глобальных и локальных переменных конфликтуют
- •1.9. Принцип сокрытия данных внутри функции. Принцип локализации имен
- •1.10. Передача одномерных массивов как параметров функции
- •1.11. Передача многомерных массивов в функцию
- •1.12. Рекурсивные функции
- •1.13. Аргументы по умолчанию
- •1.14. Встраиваемые функции (inline)
- •1.15. Перегрузка функций
- •1.16. Указатель на функцию
- •1.17. Шаблоны функций
- •1.18. Использования библиотеки этапа выполнения
- •1.18.1. Использование функций библиотеки этапа выполнения
- •1.18.2. Изучение функций библиотеки этапа выполнения
- •1.18.3. Использование функций api
- •1.19. Изменение значений параметров функции
- •1.19.1. Почему функции обычно не могут изменить значения параметров
- •1.19.2. Изменение значения параметра
- •1.19.3. Использование ассемблерных листингов для лучшего понимания работы компилятора
- •1.20. Примеры решения задач с использованием механизма функций
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1. Функции пользователя-использование формул
- •2.4.1.1. Условие задания
- •2.4.1.2. Пример для варианта 30
- •2.4.1.3. Программа
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Функции пользователя при работе с массивами
- •2.4.2.1. Условие задания
- •2.4.2.2. Пример для варианта 30
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Функции пользователя при работе с массивами
- •2.4.3.1. Условие задания
- •2.4.3.2. Пример для варианта 30
- •2.4.3.3. Программа
- •2.4.3.4. Тестирование
- •2.4.4. Задание 4. Вычисление выражений с использованием функций
- •2.4.4.1. Условие задания
- •2.4.4.2. Пример для варианта 30
- •2.4.4.3. Программа
- •2.4.4.4. Тестирование
- •2.4.5. Задание 5. Вычисление интеграла методом трапеций
- •2.4.5.1. Условие задания
- •2.4.5.2. Пример для варианта 30
- •2.4.5.3. Программа
- •2.4.5.4. Тестирование
- •2.4.5.5. Типичные ошибки при выполнении работы
- •Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Знакомство с функциями 2
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;
}