- •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.9. Принцип сокрытия данных внутри функции. Принцип локализации имен
Этот термин имеет много синонимов, например, пространство имен, приоритет имен, принцип сокрытия имен. Применяется в случае, когда локальное имя какого-нибудь объекта в теле функции совпадает с именем глобального объекта. Что касается выбора имен, то имя любого объекта в любом блоке уникально, но в разных блоках имена могут повторяться, неся различную смысловую нагрузку. Особенно это касается имен рабочих переменных.
Пример 13.22
int A = 90;
…
void F(int x)
{
int A = 0; // каким же будет значение А в теле функции?
…
}
Принцип локализации имен заключается в том, что на время действия локальной переменной глобальная переменная с тем же именем временно прекращает свое существование. Она возобновляет свое значение, как только заканчивается время жизни локальной переменной (при завершении работы функции).
Пример 13.23
Чтобы увидеть механизмы локализации данных и принцип локализации имен, этот пример следует выполнять в отладчике.
#include <stdio.h>
#include <conio.h>
// глобальные данные программы
int a;
int n = 1;
void f1 (void); // объявление функций глобально
void f2 (void);
void f3 (int);
void main(void)
{
int i; // локальная переменная функции main
a = 10; // функция main изменяет глобальную переменную
// все функции имеют одинаковые права на изменение глобального данного
for (i = 1; i <= 3; i++)
{
n ++; // main изменяет значение n, нумеруя последовательность
// вызовов функции f1
printf ("\nMain. Вход № %d", n);
f1 (); // f1 тоже меняет значение n, потому что
} // main и f1имеют одинаковые права на изменение n
for (i = 1; i <= 3; i++)
{
a ++; // main изменяет значение a
printf ("\nMain. Глобальная а: %d", a);
f2(); // в функции f2 значение а свое собственное
}
// как передача данного в функцию защищает его от изменения
f3 (a);
printf ("\nЗначение глобального а после обращения к f3 %d", a);
}
// f1 печатает номер обращения
void f1 ()
{
n ++; // функция меняет глобальную переменную n
printf ("\nФункция f1. Вход %d", n);
}
// f2 печатает значение локальной переменной
void f2 ()
{
int a = 90; // а — локальное данное функции f2
printf "\nФункция f2. Локальная а %d", a);
}
// f2 печатает значение локальной переменной
void f3 (int a) // глобальная переменная передается
{ // как параметр, защищена от изменения
a ++; // локальное данное функции f3
printf("\nФункция f3. Не меняет значение глобального а %d", a);
}
1.10. Передача одномерных массивов как параметров функции
При использовании массива как параметра функции, в функцию передается указатель на его первый элемент, т. е. массив всегда передается по адресу. При этом теряется информация о количестве элементов в массиве, поэтому размерность массива следует передавать как отдельный параметр.
Пример 13.24
void print(int a[100],int n) //вывод массива на печать
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<"\n";
}
Так как в функцию передается указатель на начало массива (передача по адресу), то массив может быть изменен за счет операторов тела функции.