Формальные и фактические параметры

Функции, создаваемые программистом

Библиотечные (стандартные) функции

Понятие подпрограммы

Подпрограммы

Результат работы программы

Введите значение х: 0.47

Сумма данного ряда при х = 0.4700 с точностью до 0.0001, S = 0.4893

Значение контрольной функции, у = 0.4893

Вывод: С точностью до 0.0001 значение суммы ряда и значение контрольной функции совпадают, следовательно, вычисление суммы членов ряда запрограммировано верно.


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

Большинство языков программирования содержат следующие разновидности подпрограмм:

- встроенные подпрограммы;

- библиотечные подпрограммы;

- подпрограммы, создаваемые программистом.

В С++ (как и в С) подпрограммы реализуются в виде функций. Различают библиотечные (стандартные) функции и функции, создаваемые программистом.

С++ предоставляет стандартные функции, имеющие определённые имена и выполняющие стандартные действия. Эти функции, определённы в языке и объединены в заголовочные файлы или библиотеки. Чтобы использовать библиотечную функцию, необходимо подключить к программе соответствующий заголовочный файл. Чтобы вызвать такую функцию, достаточно в теле основной или пользовательской функции указать её имя и список фактических параметров.

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

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

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

Фактические параметры – это информация о том, какие значения нужно передать аргументам подпрограммы и каким именам программы передать значения результатов подпрограммы.

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

5.3. Локальные и глобальные переменные

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

Описание переменной кроме типа и класса памяти, явно или по умолчанию задает ее область действия. Класс памяти и область действия зависят не только от собственно описания, но и от места ее размещения в тексте программы.

Область действия идентификатора – это часть программы, в которой его можно использовать для доступа связанной с ним области памяти. В зависимости от области действия переменная может быть локальной или глобальной.

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

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

Время жизни может быть постоянным (в течение выполнения блока).

Областью видимости идентификатора называется часть текста программы, из которой допустим обычный доступ к связанной с идентификатором областью памяти. Чаще всего область видимости совпадает с областью действия. Исключением является ситуация, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее, к этой переменной, если она глобальна, можно обратиться, используя операцию доступа к области видимости «::».

Для задания класса памяти используются следующие спецификаторы:

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

- extern– означает, что переменная определяется в другом месте программы (в другом файле или дальше по тексту). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены.

- static– статическая переменная. Время жизни – постоянное. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной. В зависимости от расположения оператора описания статические переменные могут быть глобальными и локальными. Глобальные статические переменные видны только в том модуле, в котором они описаны.

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

inta; \\ 1 глобальная переменная а

intmain()

{

intb; \\ 2 локальная переменная b

extern intx; \\ 3 переменная х определена в другом месте

static intc; \\ 4 локальная статическая переменная с

a = 1; \\ 5 присваивание глобальной переменной

inta; \\ 6 локальная переменная а

a = a; \\ 7 присваивание локальной переменной

::a = 3; \\ 8 присваивание глобальной переменной

return 0;

}

intx = 4; \\ 9 определение и инициализация х

В этом примере глобальная переменная а определена вне блоков. Память под нее выделяется в сегменте данных в начале работы программы, областью действия является вся программа. Область видимости - вся программа, кроме строк 6- 8, так как в первой из них определяется локальная переменная с тем же именем, область действия начинается с точки ее описания и заканчивается при выходе из блока. Переменные b и c- локальные, область их видимости - блок, но время жизни различно: память под b выделяется в стеке при входе в блок и освобождается при выходе из него, а переменная с располагается в сегменте данных и существует все время, пока работает программа.

Если при определении начальное значение переменных явным образом не задается, компилятор присваивает глобальным и статическим переменным нулевое значение соответствующего типа. Автоматические переменные не инициализируются.

Имя переменной должно быть уникальным в своей области действия (например, в одном блоке не может быть двух переменных с одинаковыми именами).


Для определения области действия идентификаторов надо придерживаться правил:

- каждый идентификатор должен быть описан перед тем, как будет использован;

- областью действия идентификатора является блок, в котором он описан;

- все идентификаторы в блоке должны быть уникальными, т.е. не повторяться;

- один и тот же идентификатор может быть по-разному определен в каждом отдельном блоке.

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