
- •Глава 3. Производные типы данных. Массивы.
- •3.3. Многомерные массивы.
- •3.4. Базовые алгоритмы обработки двумерных массивов.
- •Глава 4. Функции.
- •4.1. Стандартное определение функции.
- •4.2. Локальные переменные.
- •4.3. Размещение тела функции. Прототип функции.
- •4.4. Глобальные переменные.
- •4.5. Классы памяти.
- •5.1. Директива # define.
- •5.2. Использование макроопределений с аргументами.
- •5.3. Директива # include. Включение файла.
- •5.4. Условная компиляция.
4.4. Глобальные переменные.
Для каждого программного объекта существует понятие области действия описания данного программного объекта. Областью действия конкретного программного объекта будем называть ту часть программы, в пределах которой учитывается данное описание. Переменные, рассмотренные во всех предыдущих примерах, являлись локальными, область их действия ограничивалась блоком, в котором они были описаны. Язык Си/Си++ позволяет объявить переменную вне блока, например:
float x;
int f();
{
double y;
....
return;
}
void main()
{
double y;
...
}
Рассмотрим области действия каждой из переменных:
Переменная х может быть использована как внутри функции f, так и внутри основной функции. Эта переменная является глобальной по отношению к функциям f() и main(). Описание глобальной переменной должно предшествовать текстам функций. Областью действия глобальных объектов являются функции, тексты которых расположены за описанием глобальных объектов.
Переменная у, объявленная в функции f, является локальной и ее область действия не выходит за рамки тела функция f.
Переменная у, объявленная в основной программе, никак не связана с одноименной переменной функции f. Общей для обеих функций является переменная х, следовательно, функции могут взаимодействовать друг с другом через эту переменную.
Рассмотрим использование этого механизма на следующем примере:
Задача. Вычислить корни квадратного уравнения вида ах2+bх+с=0.
(считаем, что а≠0)
Определим две функции:
функцию DIS(a,b,c), вычисляющую значение дискриминанта (значение дискриминанта присвоим глобальной переменной D) и функцию SQ, предназначенную для нахождения корней ( значения корней присваиваются глобальным переменным х1, х2).
double D;
double x1,x2;
void DIS(double,double,double);
void SQ(double,double);
#include<math.h>
void main()
{
double a,b,c;
DIS(a,b,c); //вычисляем дискриминант
SQ(a,b); //функция вычисляет значение корней
// вывод значений х1 и х2 на экран
}
void DIS(double a,double b,double c)
{
D=b*b-4*a*c;
return;
}
void SQ(double a, double b)
{
if(D==0) //Анализ значения и знака дискриминанта лучше поручить основной
x1=x2=-b/(2*a); //функции, в данном случае приведен пример использования
if(D>=0) //глобальных переменных несколькими функциями. Назначение
{
x1=(-b-sqrt(D))/(2*a); // функции SQ() – вычисление корней.
x2=(-b+sqrt(D))/(2*a);
}
}
При объявлении программных объектов, которые являются глобальными, необходимо помнить, что функции «общаются» именно через эти переменные.
В приведенном примере функции DIS и SQ не возвращали значения, поэтому тип этих функций void. Вспомогательные функции могут возвращать результат, в этом случае необходимо указать тип функции, либо, не указывая тип функции, использовать по умолчанию тип int. В приведенном выше примере можно поручить вспомогательной функции DIS возвращать целочисленный результат в зависимости от знака дискриминанта, а в основной программе вызывать вспомогательную функцию SQ только после анализа возвращаемого функцией DIS результата. В этом случае текст программы может быть следующим:
double D;
double x1,x2;
DIS(double,double,double);
void SQ(double,double);
#include<math.h>
void main()
{
double a,b,c;
if(DIS(a,b,c)!=0)
{
SQ(a,b);
//вывод х1,х2
}
}
DIS(double a,double b,double c);
{
D=b*b-4*a*c;
if(D<0)
return 0;
else
return 1;
}
void SQ(double a, double b)
{
if(D==0)
x1=x2=-b/(2*a);
else
{
x1=(-b-sqrt(D))/(2*a);
x2=(-b+sqrt(D))/(2*a);
}
}
В языке Си/Си++ все функции в программе равноправны, в том смысле, что каждая из них может вызывать любую другую функцию и в свою очередь каждая может быть вызвана любой другой функцией (например, в языке Паскаль допускается вложение процедур и функций в другие процедуры и функции, соответственно те процедуры и функции, тела которых располагаются внутри других процедур или функций не могут быть вызваны основной программой или другими подпрограммами.).
Функция main() является главной функцией и отличается от всех остальных функций тем, что после «сборки» программы, состоящей из нескольких функций, ее выполнение начинается с первого оператора функции main(). Кроме главной функции в программу может входить произвольное количество неглавных. Выполнение неглавных функций прямо или косвенно инициируется вызовами из главной функции.