- •Предисловие
- •4. Функции
- •4.1. Объявление функций. Прототипы функций
- •4.2. Вызов функции
- •4.3. Завершение работы функции и возвращение результата.
- •4.4. Локальные переменные
- •4.5. Глобальные переменные
- •4.6. Аргументы функции
- •5. Массивы
- •5.1.Понятие массива. Одномерные массивы
- •5.2. Двумерные массивы
- •6. Передача массивов в функции
4.4. Локальные переменные
Внутри тела функции можно объявлять собственные переменные. Эти переменные называются локальными. Формальные параметры функции тоже считаются локальными переменными. Локальные переменные объявляются подобно другим переменным.
Каждая переменная в программе характеризуется своей областью видимости, определяющей ее доступность в различных частях программы. Локальные переменные существуют и видимы только внутри своей функции, их можно использовать только в теле своей функции.
После того, как выполнение программы выходит за пределы функции, все ее локальные переменные перестают существовать. Следует отметить, что переменные, объявленные в функции main() также являются локальными для функции main.
4.5. Глобальные переменные
Переменные, определенные в программе вне тела любой функции, называют глобальными. Они имеют глобальную область видимости, т. е. доступны в любой функции программы, включая функцию main().
Если в функции есть локальная переменная с именем, совпадающим с именем глобальной переменной, то внутри функции используется локальная переменная.
Глобальные переменные необходимы в тех случаях, когда данные нужно сделать доступными для многих функций, а передача параметров из функции в функцию является проблематичной. Однако использование глобальных данных в силу своей общедоступности часто чревато возникновением ошибок.
Выполним Пример 4.2 с использованием глобальных переменных.
#include <iostream.h>
#include <stdlib.h>
void Quantity(); //Прототип функции Quantity
int k = 0; //Глобальная переменная k
long Number; //Глобальная переменная Number
int main()
{
cout << "Enter number: ";
cin >> Number;
cout<<"Number: " << Number << endl;
Quantity(); //Вызов функции Quantity
cout<<" Quantity: "<< k<<endl;
system("pause");
return 0;
}
void Quantity()
{
while (Number)
{
k++;
Number = Number / 10;
}
}
4.6. Аргументы функции
Аргументы - список величин, передаваемых в функцию при ее вызове. Количество и типы аргументов должны совпадать с количеством и типами формальных параметров, описанных в заголовке функции.
Аргументы в функцию могут передаваться по значению. Тогда в качестве аргументов могут выступать константы, переменные или выражения, тип которых соответствует типу параметров. В ряде случаев, если тип параметра отличается от типа аргумента, компилятор сам произведет приведение типа аргумента к типу параметра. Важно, чтобы такое приведение типов было допустимым.
При передаче аргумента по значению параметр является локальной копией аргумента. В самой функции происходит инициализация формальных параметров значениями аргументов. Поэтому изменения, внесенные в параметры во время выполнения функции, не влияют на переменные, значения которых передаются в функции, т.е. на аргументы. В примерах 4.1, 4.2 аргументы в функции передаются по значению.
Ссылки
В языке Си++ ссылка определена как другое имя (псевдоним) уже существующей переменной. Определение ссылки:
ИмяТипа & ИмяСсылки = Инициализатор;
Например,
int x;
int &y=x;
Тогда имена x и y –это синонимы одной и той же переменной. Поэтому операторы
x += 1; и y += 1; равносильны.
После инициализации значение ссылки изменить нельзя, она всегда "смотрит" на ту переменную, с которой она связана инициализацией.
Самостоятельное использование переменных ссылочного типа не имеет практического применения. Основные достоинства ссылок проявляются при работе с функциями.
Ссылочный тип удобно использовать для возврата значений из функции. В этом случае ссылочный тип используется следующим образом:
-в заголовке функции параметры-результаты записываем как переменные ссылочного типа, то есть с символом &;
-в теле функции никакие дополнительные символы для этих переменных не используем, т.е. работаем, как с обычными переменными;
-при вызове функции в качестве аргументов используем только переменные, причем их тип должен совпадать с типом параметров-ссылок.
Таким образом, параметры-ссылки являются другими именами им соответствующих аргументов. Поэтому параметр-ссылка не требует выделения отдельной памяти.
Пример 4.4. Для каждой пары введенных целых чисел найти их сумму и произведение двумя способами:
- с помощью одной функции SumMult типа void , которая возвращает и сумму, и произведение двух чисел;
- с помощью двух функций Sum, Mult с одним результатом типа int, одна из которых возвращает сумму, а вторая – произведение двух целых чисел.
#include <iostream.h>
#include <stdlib.h>
void SumMult (int , int , int &, int &); //Прототип функции SumMult
int Sum ( int , int ); //Прототип функции Sum
int Mult (int , int ); //Прототип функции Mult
int main()
{
int a, b, r1, r2;
while( true )
{
cout<<"Vvedi a, b"<<" (a=0 b=0 -->exit)"<<endl;
cin>>a>>b;
if ( !(a || b)) break;
SumMult ( a, b, r1, r2); //Вызов функции SumMult
cout<<a<<" + "<<b<< " = "<<r1<<endl;
cout<<a<<" * "<<b<<" = "<<r2<<endl;
cout<<a<<" + "<<b<<" = "
<<Sum( a, b )<<endl; //Вызов функции Sum
cout<<a<<" * "<<b<<" = "
<<Mult( a, b )<<endl; //Вызов функции Mult
}
system("pause");
return 0;
}
void SumMult ( int x, int y, int &s, int &p) //Функция SumMult
{
s=x+y;
p=x*y;
}
int Sum ( int x, int y) //Функция Sum
{
return x+y;
}
int Mult ( int x, int y) //Функция Mult
{
return x*y;
}
Пример 4.5. Расположить значения целочисленных переменных а, в, с в порядке возрастания, используя функцию перестановки значений двух переменных.
#include <iostream.h>
#include <stdlib.h>
void Change ( int &, int &); //Прототип функции Change
int main()
{
int a, b, c;
cout<<" a= "; cin>>a;
cout<<" b= "; cin>>b;
cout<<" c= "; cin>>c;
if ( a > b ) Change ( a, b ); //Вызов функции Change
if ( b> c ) Change ( b, c );
if ( a > b ) Change ( a, b );
cout<<" a = " << a << " b = "<< b <<" c = "<< c;
system("pause");
return 0;
}
void Change ( int & x , int & y) //Функция Change
{
int temp;
temp = x;
x = y;
y = temp;
}
Подключение заголовочных файлов
В программе можно использовать готовые стандартные функции, объявления которых находятся в специальных файлах с расширением h. Включение такого файла в текст программы выполняется директивой компилятора.
#include <ИмяФайла.h>
Так, например, основные математические функции находятся в файле math.h. Для их использования в начале текста программы следует включать строку
#include<math.h>
Функция system находится в файле stdlib.h. Для использования данной функции включаем строку
#include<stdlib.h>.