Замечание

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

Существует два способа передачи параметров в функцию: по значению (копирование) и по адресу.

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

Пример 4

Пример 3

Функция, которая вычисляет .

х,y – вещественные числа, результат будет так же вещественным числом.

Float sqr (float x, float y){float rez;rez=sqrt (x*x+y*y);return rez; }

Функция, которая выводит квадраты чисел от n до тех пор, пока квадрат числа меньше 250:

int kvadrat (int n){ int i=n; while (i*i<=250) { cout<<"Квадрат числа "<<i<<" = "<<i * i<<"\n>>; i++; } return 0;}

 

Если функция возвращает значение типа int, тип результата можно не указывать:

 

kvadrat (int n){ int i=n; while (i*i<=250) { cout<<"Квадрат числа "<<i<<" = "<<i * i<<"\n>>; i++; } return 0;}

 

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

Пример 5void kvadrat (int n){ int i=n; while (i*i<=250) { cout<<"Квадрат числа "<<i<<" = "<<i * i<<"\n>>; i++; } }

 

1.5.3. Функция main

 

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

Вариант 1

main (){ ...return 0;}

Блок main возвращает значение целого типа int.

Вариант 2

void main (){ ...}

1.5.4. Вызов функции

 

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

При вызове функции выполняются все операторы из тела функции до конца (оператора return). Затем происходит возврат в главную функцию.

Пример 6Программа, содержащая функцию, которая возвращает сумму двух целых величин. #include <iostream.h>int sum (int a, int b) // определение функции sum{ return (a+b); // тело функции}int main(){ int a=2, b=3, c, d; c=sum(a,b); // вызов функции sum cin>>d; cout<<sum(c,d); // вызов функции sum return 0;}

 

1.5.5. Способы передачи данных

Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями.

 

Параметры, перечисленные в заголовке описания функции, называются формальными параметрами (или просто параметрами).

Параметры, записанные в операторе вызова функции, называются фактическими параметрами (или аргументами).

Пример 7(передача параметров по значению)

 

f (int i, int j){ i=6; j=16; cout<<"\n i="<< i<<"\n j="<< j; return 0; } main () { int i=5, j=15; f (i,j); // вызов функции f ; выводятся i=6, j=16 return 0; }

В результате выполнения программы в переменных i и j окажутся значения 5 и 15.

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

Пример 8(передача параметров по адресу)

.....f (int *ai, int *aj) // функция f получает два адреса переменных типа int: ai, aj{*ai=6; // по адресу ai записывается значение 6*aj=16; // по адресу aj записывается значение 16cout<<"\n Функция с i="<<*ia<<" \n j"<<*aj;return 0;}void main() { int i=5, j=4;cout<<"\nДо вызова функции i="<< i<<" \nj="<< j;f (&i, &j); // операция &i позволяет определить адрес переменной i, // &j – адрес переменной jcout<<"\n После вызова функции i="<< i<<" \nj="<< j;}

 

В результате выполнения программы в переменных i и j окажутся значения 6 и 16.

 

1.5.6. Возвращаемые значения функции

 

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

 

Пример функции, которая возвращает среднее арифметическое от введенных 3-х чисел.

#include<iostream.h> float sred (float nl, float n2, float n3) // объявление функции sred { int s; s=( n1 + n2 + n3)/ 3; return s; }main(){ float num1, num2, num3; int avg; cout<<"\n Введите три числа"; cin>>num 1>>num2>>num3 ; avg=sred (numl, num2, num3); // вызов функции sred cout<<"\n Среднее значение= "<< avg; return 0; }

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

 

1.5.7. Использование прототипов функций

 

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

Предыдущий пример, записанный при помощи прототипов функций:

#include <iostream.h>float sred (float nl, float n2, float n3); // прототип (объявление) функции sred main(){ float num1, num2, num3;int avg;cout<<"\n Введите три числа";cin>>num1>>num2>>num3 ;avg=sred (numl, num2, num3); // вызов функции sredcout<<"\nСреднее значение= "<< avg;return 0;}float sred (float nl, float n2, float n3) // определение функции sred{int s;s=(n1 + n2 +n3) / 3; //тело функции sredreturn s;}