изучение алгоритмического языка С. Изучение системы Matlab, страница 4

             double A,B,V,F;                                            |

                                                                                    |

                    B=log(z*z+y*y);                                    |

                   A=sqrt(z)*B;                                           |  описание функции FF

                    V=A-(int)A;                                           |

                    F=A*log10(z+y)+B*cos(V+z);             |

                    return F;                                                 |

   }                                                                              |

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

Фактические параметры определены в точке вызова функции, т. е. в обращении. Вызов функции на работу F=FF(x,y), в скобках перечислены через запятую фактические параметры – x,y.

Формальные параметры определены в заголовке описания функции –

double FF(double z, double y). В скобках после имени функции перечислены описания формальных параметров, эти параметры являются локальными,

 т. е. принадлежат только функции FF.

Между фактическими и формальными параметрами существует строгое соответствие: по количеству, месту и типу.

Передача параметров в функцию:

1.  передача параметра по  значению. При вызове функции происходит выделение специальной области памяти (стека) под всю структуру функции и локальные переменные (в нашем примере это z,y, A,B,V,F). Значение фактического параметра  передается в память выделенную под формальный , следовательно формальный параметр  принимает значение фактического . В период работы функции фактические и формальные параметры занимают разные места в памяти.  В приведенной программе формальный параметр z принимает значение фактического параметра x, формальный параметр y принимает значение фактического y.

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

     Формальный параметр принимает значение адреса фактического

     параметра.

В языке С есть специальный тип – указатель (адрес), для его объявления используется модификатор * .

Пример объявлений указателей:

 double *a,*s;

переменные a и s имеют тип указатель на переменные типа double, их значения равны адресам переменных типа double .

       int *n,*i;

      n, i - переменные типа указатель, они содержат адрес переменных типа 

       int;

       int x,z; -  объявление переменных типа int.

  В программе для работы со значением переменной расположенной по  

  адресу s необходимо провести разадресацию.

  *s=cos(*s); в этом примере вычисляется косинус от переменной,   

  расположенной по адресу s и результат помещается по адресу s;

  z=*i+1; в этом примере значение переменной типа int, расположенной по адресу i увеличивается на 1, результат помешается в переменную z типа int. 

Возвращение результата работы функции в точку вызова функции.

1.  по оператору return ; по оператору return можно вернуть значение только одной переменной (см. программу по табулированию с использованием функции);

2.  по адресам (указателям) можно вернуть сколько угодно переменных;

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

Пример использования указателя для возвращения значения переменной из функции

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

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

   #include “stdafx.h”

     #include <conio.h>

    #include <math.h>