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

Int nod (int, int); - прототип нашей функции.

int main(){тело ....} –главная функция

int nod (int a, int b){тело ....}

Принцип: Если при трансляции main()компилятор встречает вызов некоторой функции, то до этого он должен встретить описание этой функции. Если же сама функция описана после main(), то необходимо поместить до main() так называемый прототип функции – это заголовок функции с ‘;’ после него, при этом можно не указывать имена формальных параметров, указав только их описание. Назначение прототипа – дать компилятору информацию о наличии функции и её параметрах, чтобы он мог проверить правильность вызова функции.

Соответствие между списками формальных и фактических параметров

1)по количеству параметров;

2)по порядку следования;

3)тип фактического параметра при необходимости приводится к типу формального.

Существуют два способа передачи данных в функцию:

1)по значению;

2)по адресу;

При вызове функции под её локальные переменные и формальные параметры отводится место в области оперативной памяти, которая называется СТЕК. Это область памяти, которая организована по принципу LIFO (last in, first out-последний пришел, первый уйдешь).

Для параметров int a, int b (их называют параметрами значениями) фактические параметры передаются по значению: в отведённую для формальных параметров память помещаются значения фактических параметров. Фактические параметры м.б. и выражениями, тогда вычисляются их значения и помещаются в отведённую для формальных параметров память (при необходимости приводятся к типу формального параметра).При выполнении алгоритма функции значения формальных параметров берутся из этой памяти, а пересчитанные значения записываются в эту память. По окончании выполнения тела функции это место в стеке освобождается, значения (возможно и пересчитанные) теряются.

Достоинства таких параметров значений: не портится фактический параметр.

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

2)Если функция не возвращает значение, то в качестве её типа указывается void, в таком случае носителем результата может быть параметр функции.

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

void nod1 (int a, int b, int & c)

{int r0,r1,r2;

r1=abs(a); r2=abs(b);

while (r2>0)

{r0=r1; r1=r2; r2=r0 % r1;

}

c=r1;}

Вызов функции nod1(x,y,z), где z-переменная, которая получит результат. Механизм передачи: в память , отведённую под формальный параметр с, передается адрес фактического параметра z, т.е.когда этому параметру что-то присваивается с=r1, то значение r1 отправляется по адресу ,записанному в этой области, т.е. на место фактического параметра.

#include <iostream>

using namespace std;

Void nod1 (int, int,int &); - прототип нашей функции.

int main() //–главная функция

{int x,y,z;

cout<<” x,y”;

cin>>x>y;

nod1(x,y,z);

cout<<”z=”<<z<<endl;

return 0;}

void nod1 (int a, int b, int & c)

{int r0,r1,r2;

r1=abs(a); r2=abs(b);

while (r2>0)

{r0=r1; r1=r2; r2=r0 % r1;

}

c=r1;

}

Достоинство этого способа в том, что нет копирования (может быть большого объёма ) данных при вызове функции, а только передаётся адрес фактического параметра. Но в этом случае фактический параметр может быть испорчен, что на самом деле и используется для передачи результата.

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

Есть способ защитить фактический параметр, который передаётся по адресу, от порчи (если не надо его использовать для передачи результата). Для этого его оформляют с модификатором const: const int &c , в этом случае нельзя в теле функции что-либо присваивать этому параметру, за этим следит компилятор.

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

int a,b,c; // глобальные переменные

void nod2 ()

{int r0,r1,r2;

r1=abs(a); r2=abs(b);

while(r2>0)

{r0=r1; r1=r2;r2=r0%r1; }

c=r1;

}

Int main()

{cout<<” a,b”;

cin>>a>b;

nod2();

cout<< c<<endl;

return 0;

}