Вызов по значению и вызов по ссылке.



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

Аргументы в функцию обычно передаются по значению, т.е. в функцию передается только копия текущего значения. Сама переменная в этом случае внутри функции не может быть изменена. Главным ограничением вызова по значению является то, что функция может возвращать только одно значение.

При вызове по ссылке в функцию передается адрес аргумента. В этом случае копирование аргумента не выполняется, что позволяет экономить память и время выполнения. Переменная, переданная по ссылке, может быть изменена внутри функции. Это позволяет создавать функции, которые возвращают более одного параметра. Для указания того, что передача параметра выполняется по ссылке, используется знак &, который ставится перед именем параметра. Если в функции не предполагается изменение этого параметра, то целесообразно перед типом параметра поставить ключевое слово const:

int add(const int &x, const int &y)

{

       int z;

       z=x+y;

       return z;

}

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

В составе библиотеки С имеется большое число функций. Их прототипы записаны в соответствующие заголовочные файлы. Рассмотрим, как можно самостоятельно написать подобные функции на примере функции y=ex. Математические функции такого типа вычисляются путем разложения в степенной ряд , Для функции  y=ex, . Вычисление очередного члена ряда обычно удобно выполнять рекуррентным способом: , . Вычисление прекращается по достижению требуемой точности. В результате получим следующую функцию:

double exp(double x)

{

       double s,ak;

       long k;

       const double eps=1e-8;

       ak=1.;

       s=ak;

       while(ak>eps)

       {

             ak=ak*x/k;

             s=s+ak;

       }

       return s;  

}

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

Если для требуемой математической функции можно выделить участок, на котором она имеет всего один корень, то этот корень можно найти следующим образом:

1. Задаем значение xleft равное значению левой границы участка.

2. Задаем значение xright равное значению правой границы участка.

3. Вычисляем значение yleft=f(xleft) и yright=f(xright).

4. Делим участок пополам и вычисляем x0=(xright+xleft)/2 и y0=f(x0).

5. Если знак y0 и yleft одинаковый, то выполняем xleft=x0, иначе xrigth=x0.

6. Повторяем пункты 4 и 5 до тех пор, пока разница xright-xleft станет достаточно малой.

Соответствующую функцию на языке С можно записать следующим образом:

// описание функции y=f(x)

double f(double x)

{

       // здесь вычисляется функция y=f(x);

}

// функция sign проверяет равенство знаков

int sign(double a,double b)

{

       if(a>0 && b>0)

return 1;

       if (a<=0 && b<=0)

             return 1;

       return 0;

}

// вычисление корня делением отрезка пополам.

double root(double xleft,double xright)

{

       double x0,y0,yleft,yright;

       yleft=f(xleft);

       yright=f(xright);

       if( xleft > xright )// Левая граница > правой

       {

             x0=xleft;

             xleft=xright;

             xright=xleft;

       }

       if ( sign(yleft,yright) )// Одинаковый знак.

       {

             printf(“Eroor! Equal signs!”);

             return 0;

       }

       while (xright-xleft>eps)

       {

             x0=(xright+xleft)/2;

             y0=f(x0);

             if (sign(yleft,y0))

             {

                   yleft=y0;

                   xleft=x0;

             }

             else

             {

                   yright=y0;

                   xright=x0;

             }

       }

       return x0;

}


Дата добавления: 2018-02-15; просмотров: 624; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!