Передача значений через глобальные переменные.

Рекурсивные определения функций.

В языках Си/Си++ допускается рекурсивное определение функций.

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

 

В случае если при вызове функции будет задан отрицательный аргумент, она вернет нулевое значение — признак неверного обращения.


Областью действия описания программного объекта называется часть программы, в пределах которой действует (учитывается) это описание. Если переменная описана внутри некоторого блока, то она локализована в этом блоке и из других блоков, внешних по отношению к данному, «не видна». Если описание переменной находится вне блока и предшествует ему в тексте программы, то это описание действует внутри блока и называется глобальным. Глобальная переменная «видна» из блока.

Например:

double x ;

int funcl()

{int у;... }

void main()

{float у;...}

Переменная x является глобальной по отношению к функциям funcl, main и, следовательно, может в них использоваться. В функциях funcl и main имеются локальные переменные с одинаковым именем у. Однако это разные величины, никак не связанные друг с другом. Поскольку переменная х является общей для обеих функций, то они могут взаимодействовать через х друг с другом.


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

Пример

Результат выполнения функции MAX заносится в глобальную переменную z, которая «видна» также и из основной функции

Поэтому при втором обращении эта переменная играет одновременно роль аргумента и результата. Здесь глобальная переменная z играет роль var-параметра.


Классы памяти.

Существуют 4 класса памяти, выделяемой под переменные:

· автоматическая (ключевое слово auto);

· внешняя (extern);

· статическая (static);

· регистровая (register).

Под глобальные переменные выделяется место во внешней памяти (речь идет не о магнитной памяти; это оперативная память класса extern).

Глобальную переменную можно объявить либо вне программных блоков, либо внутри блока с ключевым словом extern. Обычно это делается в тех случаях, когда программный модуль хранится в отдельном файле и, следовательно, отдельно компилируется.


Например, основная и вспомогательная функции хранятся в разных файлах.

Пример:

 

Обмен значениями между основной и вспомогательной функцией func() происходит через общую глобальную переменную var, для которой во время компиляции выделяется место во внешнем разделе памяти. В результате выполнения данной программы на экран выведется число 50.


Локальные переменные, объявленные внутри блоков, распределяются в автоматической памяти, работающей по принципу стека. Выделение памяти происходит при входе выполнения программы в блок, а при выходе из блока память освобождается. Ключевое слово auto писать необязательно (подразумевается по умолчанию).


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

Пример объявления статической переменной:

f()

{static int schet=10; ...}

Инициализация статической переменной происходит только при первом вхождении в блок. Если инициализация явно не указана, то переменной автоматически присваивается нулевое начальное значение. Статические переменные можно использовать, например, для организации счетчика числа вхождений в блок.


Регистровая память выделяется под локальные переменные. Регистры процессора — самый быстрый и самый маленький вид памяти. Они задействованы при выполнении практически всех операций в программе. Поэтому возможность распоряжаться регистровой памятью лучше оставить за компилятором.


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


Упражнения

1. Найти ошибку в программе:

 

2. Определить результат выполнения программы:

3. Составить программу для вычисления площади кольца по значениям внутреннего и внешнего радиусов, используя функцию вычисления площади круга.

4. Даны три целых числа. Определить, сумма цифр которого из них больше. Подсчет суммы цифр организовать через функцию.

5. Составить функцию, определяющую, является ли ее целый аргумент простым числом. Использовать эту функцию для подсчета количества простых чисел в последовательности из десяти целых чисел, вводимых с клавиатуры.

6. Описать рекурсивную функцию stepen (x, n) от вещественного х (х ≠ 0) и целого n, которая вычисляет величину xn согласно формуле

 

7. Даны натуральные числа п и т; найти НОД(n, т). Составить рекурсивную функцию вычисления НОД, основанную на соотношении НОД(n, m) = HOД(m, r), где r — остаток от деления n на т (n > т).