- •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.3.4. Фактические параметры.
При обращении к функции ей передаются фактические параметры, то есть выражения, имеющие те реальные значения, с которыми функция отрабатывает очередной вызов. Другими словами, при вызове функция получает данные, с которыми фактически выполняется алгоритм функции при этом обращении.
1.4. Формальные и фактические параметры функции
В описании функции ее внешние данные названы формальными параметрами. Это название подчеркивает, что данные описания формальны, абстрактны, то есть не участвуют в реальных действиях, а только описывают взаимосвязь данных в теле функции. Формальные параметры функции — это всегда имена переменных. В заголовке функции они объявляются, поэтому и должны быть указаны вместе с типом.
При обращении к функции ей передаются фактические параметры. Это выражения, значения которых известны на момент обращения к функции, и с которыми функция отрабатывает очередной вызов. Фактические параметры подставляются на место формальных при каждом обращении к функции. Они могут быть в общем случае выражениями, то есть константами, переменными, или выражениями.
Тип параметров, их количество и порядок следования называются совместно «сигнатура параметров». Есть непреложное правило C: в описании функции и в обращении сигнатуры параметров должны строго совпадать. Это означает, что формальные и фактические параметры должны соответствовать друг другу по количеству, типу и порядку следования.
Пример 13.8
Пример описания функции, которая находит среднее арифметическое трех чисел. Иллюстрирует особенности, которые могут быть при обращении к функции, возвращающей значение. Показывает варианты обращения.
float Avg (float a, float b, float c)
{
float S; // локальная переменная
S = (a+b+c)/3.;
return S; // тип совпадает с типом функции
}
void main(void)
{
float x1 = 2.5, x2 = 7, x3 = 3.5;
float y;
// фактические параметры — переменные
y = Avg (x1, x2, x3); // обращение в присваивании
printf ("x1=%f, x2=%f, x3=%f y= %f\n", x1, x2, x3, y);
// фактические параметры — константы вещественного типа
y = Avg (2., 4., 7.);
printf ("x1=%f, x2=%f, x3=%f y= %f\n" , 2., 4., 7., y);
// фактические параметры — выражения
y = Avg (x1*2., x2+4., sin (PI/2.));
printf ("x1=%f, x2=%f, x3=%f, y= %f\n" , 2*x1, x2+4., sin (PI/2.), y);
// обращение в функции вывода. Фактические параметры — произвольные
// то есть константы, переменные, выражения
printf ("x1=%f, x2=%f, x3=%f y= %f\n" , 2., x2, x3+0.7, Avg (2., x2, x3 + 0.7);
// как выражение, оператор-обращение может входить в другие выражения
y = (Avg (0.5, 1.7, 2.9) + Avg (x1, x1+2, x1+2.)) * 0.5;
printf ("y= %f\n" ,y );
}
1.5. Описание и объявление функции. Прототип функции
С точки зрения структуры программы, в C все функции описываются на одном уровне. В терминах «описание» и «объявление» функции путаницы быть не должно.
Описание функции предоставляет программисту всю информацию о ней, как внешнюю (тип, имя, сигнатура параметров), так и внутреннюю (тонкости алгоритма). Если рассматривать функцию как данное конструируемого типа, то описание функции как раз и конструирует данный тип с указанным именем.
Объявление функции предоставляет только внешнюю (интерфейсную часть), для которой важно только умение правильно использовать функцию, то есть обратиться к ней. Заголовок (первая строка описания) функции как раз и предоставляет такую информацию.
Любой объект программы должен быть объявлен перед первым его использованием. Это непреложное правило относится и к функциям. Объявление или описание функции в программе должно появиться до первого обращения к ней.
Существует несколько способов объявления функций (рис. 13.1).
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
Объявление функций в С++ |
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
||||||
|
В одном файле с функцией main() |
|
|
|
|
В отдельном файле |
|
||||||||
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
||||||
Перед main() |
|
|
После main () |
|
|
файл *.срр |
|
файлы *.h; *.срр |
|||||||
|
|
|
|
|
|
|
|
|
|
||||||
Рис. 13.1. Функции в С++ |
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
На рис. 13.1 показаны 4 способа объявления функций в языке программирования С++. Рассмотрим структуры объявления функций в одном файле, с главной функцией. Функции можно объявлять в двух областях, до начала функции main(), после функции main(). До сих пор мы объявляли функции в одном файле, перед функцией main() - это самый простой из способов.