Передача параметров по значению
При передаче в функцию входных параметров, изменение которых не возвращается в вызывающую функцию, используется метод, который называется передачей по значению. Он имеет следующие особенности:
· для фактического и формального параметров компилятор отводит разные ячейки памяти;
· при выполнении программы содержимое аргумента копируется в формальный параметр, то есть при первом вызове в нашем примере выполняется Len=20, y=5 и ch=’*’ , хотя это явно нигде не записывается;
· из первой особенности следует, что если в функции изменить формальный параметр, то это изменение не повлияет на значение переменной, используемой при вызове, то есть фактического параметра. Если бы в функции изменили y (например, там было бы записано y++), то значение соответствующей переменной Y в головной функции после второго вызова осталось бы без изменения, т. е. тем, что ввели;
· в качестве фактического параметра, соответствующего параметру-значению, может быть выражение соответствующего или совместимого типа. Например, функцию можно вызвать так: LINE2 ( LEN*2, Y+1, ‘*’). Как частный случай можно передавать константу, как показано при первом вызове, или переменную (см. второй вызов). При этом её имя, используемое при вызове, не обязательно должно отличаться, как в нашем примере, от имени формального параметра. В головной программе переменную для фактической длины символов можно было бы тоже назвать Len. Но и в этом случае это разные ячейки памяти.
§ 2. Функции типа void с несколькими результатами
С помощью оператора return можно возвратить только одно значение. А как быть, если функция возвращает более одного результата? В таком случае можно использовать указатели (см. 2-й семестр) и ссылочный тип. Здесь рассматривается второй способ, который легче первого.
Пример
Для x=-0.8, -0.6, -0.4, … , 0.8 найти и вывести на экран значения функций:
в виде следующих пяти столбцов: x, y, cos(x), z, sin(x), в которых показать значения указанных тригонометрических функций, вычисленные как сумма бесконечного ряда с заданной точностью, так и с помощью встроенных функций.
С точки зрения разбиения на функции возможны несколько вариантов. Составим функцию SINCOS, которая вычисляет обе бесконечные суммы с произвольной одинаковой точностью. Поэтому она имеет два входных параметра: аргумент функций (x) и одинаковую точность вычисления бесконечных сумм (eps) и два выходных (y и z), которые в заголовке функции объявляются с помощью ссылочного типа.
void SINCOS(float x, float eps, float &y, float &z);
int main()
{ float x, sn, cs;
cout<<" x MySin Sin(Standart) MyCos”<< “ Cos(Standart)";
cout<<endl<<endl;
for (x=-0.8; x<0.805; x+=0.1)
{ SINCOS(x,1E-10, cs, sn);
printf("%5.1f %10.6f %12.6f %10.6f %12.6f\n",
x, sn, sin(x), cs, cos(x)) ;
}
getch(); return 0;
}
void SINCOS(float x, float eps, float &y, float &z)
{ float k=1, v1=1; y=1;
do {
v1=v1*(-1)*x*x/(k*(k+1));
y+=v1;
k+=2;
}
while (fabs(v1)>eps);
k=2; v1=x; z=x;
do {
v1=v1*(-1)*x*x/(k*(k+1));
z+=v1;
k+=2;
}
while (fabs(v1)>eps);
}
Дата добавления: 2016-07-18; просмотров: 1670;