Return x; нет этой инструкции, ведь функция так ничего не вернет!
}
void main ( void )
{
cout<<endl<<"vvedite a, x1, x2 ";
float x1, a, x2;
cin>>a>>x1>>x2;
float vir1;
countX (x1*x1, x2,pi, M_PI_2);
float vir2;
countX(x2, x1 + 1.2, 0, vir2);
float x=1/11. + a * vir1 + 1 / vir2;
cout<< endl <<"X = "<<x;
getch();
}
Пояснения к работе программы в этом варианте.
Программа начинает работать с функции main.
Попрежнему первая исполняемая инструкция-выражение
сout << endl << "vvedite a, x1, x2 ";
выводит на экран подсказку.
Следующая инструкция-выражение вводит информацию с клавиатуры в три объекта a, x1, x2.Пользователь ввел a равное 1, x1 равное 2, x2 равное 3.
В инструкции-выражении
countX ( x1*x1, x2, M_PI_2, vir1);
выполняется оператор ( )вызова функции, где четвертым параметром, получаемым по ссылке на float,указан объект vir1.
При вызове функции countX эта функция принимает первый фактический параметр по значению ( получает результат вычисления выражения x1*x1,равное 4) и для хранения этого значения 4 в объекте–функции countX создается локальный объект с именем а, тип которого float (т.к. первый формальный параметр в списке формальных параметров функции float a). Полученное через параметр значение 4 записывается в этот локальный объект а. Так же передаются остальные два фактических параметра – значения 3 из объекта x2 и 1.57 из константы M_PI_2. Для записи этих значений создаются локальные объекты b и c. Здесь механизм тот, который уже был расмотрен. Значения, записанные в локальные объекты а, b и c используются при вычислении значения выражения (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b),а полученный результат, равный 0.02, записывается в объект, имя которого х. А имя х при этом первом вызове функции именует объект vir1,так как в списке формальных параметров при вызове была сделана инициализация 4 параметра:
float& x = vir1,то есть имя х в этой фукции назначено новым именем объекта vir1.
Этот объект определен в функции main, следовательно информация вычисленная в функции countX инструкцией
x = (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);
ее оператором присвоить записывается в объект с именем х , которое именует объект vir1. Информация из области функции countX попадает в область другой функции- функции main.
При втором вызове функции countX в инструкции-выражении
countX( x2, x1 + 1.2, 0, vir2);
выполняется оператор () вызова функцииcountX, где четвертым параметром, получаемым по ссылке на float,указан объект vir2.
Значения, полученные в локальные объекты а, b и c при этои вызове используются при вычислении значения выражения (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b),а полученный результат, равный теперь -0.09, записывается в объект, имя которого в этой функции попрежнему х. А это имя при этом новом вызове функции именует объект vir2,так как в списке формальных параметров при этом вызове была сделана инициализация 4 параметра:
float& x = vir2,то есть имя х в этой фукции будет новым именем объекта vir2.
Этот объект попрежнему определен в функции main. Таким образом информация вычисляется функцией countX винструкции
x = (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);
Оператором присвоить эта инструкция записывает результат в область памяти другой функции, в область памяти объекта vir2.
(Технически такой механизм передачи объекта по ссылке использует все тот же механизм передачи через параметры по значению адреса передаваемого объекта, например, vir1.Но к полученному по значению адресу объекта vir1,автоматически применяется оператор взятия объекта и таким образом, обеспечивается работа не с переданным адресом объекта, а с самим объектом, определенным в другой функции).
По ссылке можно передать объект, тип которого обязательно должен совпадать с типом, на который сделана ссылка.
Файл example3.cpp
Define _USE_MATH_DEFINES
#include <math.h>
void countX (float a, float b, float c, float& x )
{
x= (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);
}
void main ( void )
{
cout<<endl<<"vvedite a, x1, x2 ";
float x1, a;