Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Си массивы функции препроцессор.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
38.42 Кб
Скачать

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(). Кроме главной функции в программу может входить произвольное количество неглавных. Выполнение неглавных функций прямо или косвенно инициируется вызовами из главной функции.