Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

§ 2. Функции типа void с несколькими результатами

С помощью оператора return можно возвратить только одно значение. А как быть, если функция возвращает более одного результата? В таком случае можно использовать указатели (см. 2-й семестр) и ссылочный тип. Здесь рассматривается второй способ, который легче первого.

2.1. Пример

Для 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);

}

2.2. Что такое ссылочный тип

Сначала рассмотрим самостоятельное использование переменной этого типа, так называемую независимую ссылку. Пусть объявлены две переменные:

float x=5; float &s=x;

Переменная ссылочного типа s обязательно должна быть проинициализирована. После такого объявления идентификатор s определяет другое, альтернативное, имя ячейки, названной x, то есть s и x — синонимы, идентификаторы для обозначения одной и той же области оперативной памяти. Иногда говорят, что ссылочная переменная — это псевдоним переменной, к которой она обращается. Поэтому оператор сout<<endl <<x<<” “<<s; выведет два одинаковых числа 5. Изменим значение переменной x: x*=2; а выведем s: cout<<endl <<x<<” “<<s; Несмотря на то, что значение s явно в программе не изменялось, то есть не было записано s*=2, оно также изменится и будут выведены два одинаковых числа 10. Это произошло потому, что между этими переменными нет разницы, то есть s и x — имена одной и той же ячейки.

Наоборот, если изменим значение ss+=100; а выведем xcout<<endl <<x<<” “<<s; то убедимся, что x также изменилось, и выводится 110 110.

Если объявить и проинициализировать ещё одну “обычную” переменную float y=3; и записать s=y; то копируются не адреса, а, как и при обычном объявлении, значение одной ячейки (y) помещается в другую, которую можно использовать как с именем s, так и x. Аналогично, s++ не меняет адрес, а увеличивает на единицу значение переменной s или x.

Если объявляется несколько переменных ссылочного типа, то перед каждым идентификатором должен стоять символ “&”.

Замечания.

  • Следует различать использование символа & для взятия адреса элемента. Это связано с указателями и рассматривается во втором семестре.

  • Самостоятельное использование переменных ссылочного типа не имеет практического применения. Наоборот, независимые ссылки создают недоразумения и затрудняют отладку программы.