Необходимо реализовать формулу на c++ с помощью циклов while, do while, и for.
В чем проблема? Как помочь? Что пробовали, что получилось?
//Циклические вычисления с заданной точностью. Пример.
//Вычислить предел последовательности {y[n]}.
//Значения y[0], y[1], y[2] и точность eps вводятся с клавиатуры.
//Вычисления закончить при |y[n]-y[n-1]| <= eps.
//Вывести результат и число итераций.
#include<iostream>
#include<cmath>
#include<limits.h>
#include<locale.h>
using namespace std ;
double predel_1(double, double, double, double, int&n) ;
double predel_2(double, double, double, double, int&n) ;
double predel_3(double, double, double, double, int&n) ;
//main_begin___________________________________________________________________
int main()
{int var,
n1, n2, n3 ; //число итераций для разных циклов
double re1, re2, re3, //результаты расчетов
y, //значение предела
y0, y1, y2 ; //текущие значения элементов последовательности
double eps ; //точность вычисления предела
setlocale(LC_ALL,"Russian") ;
for(;;)
{//Ввод исходных данных
cout << " Вид действия:" << endl ;
cout << " 1 - вычисление предела последовательности" << endl ;
cout << " 2 - завершение задачи" << endl ;
cout << " Введите вид действия -> " ;
cin >> var ;
switch(var)
{case 1:
//Ввод исходных данных
cout << " Введите значения y0, y1, y2 -> " ;
cin >> y0 >> y1 >> y2 ;
cout << " Введите точность вычисления -> " ;
cin >> eps ;
if(eps <= 0 || eps > .1)
{cout << "Ошибка ввода. Значение eps д.б. >0 и <=0.1" << endl ;
continue ;
}
//Решение циклом while
re1 = predel_1(y0, y1, y2, eps, n1 = 3) ;
if(n1 != INT_MAX)
{cout.precision(4) ; //число знаков после десятичной точки
cout << "Для цикла WHILE рез. = " << re1 << " n = " << n1 << endl ;
}
else cout << "Для цикла WHILE точность не достигнута" << endl ;
//Решение циклом do..while
re2 = predel_2(y0, y1, y2, eps, n2 = 2) ;
if(n2 != INT_MAX)
{cout.precision(4) ; //число знаков после десятичной точки
cout << "Для цикла DO..WHILE рез.= " << re2 << " n = " << n2 << endl ;
}
else cout << "Для цикла DO..WHILE точность не достигнута" << endl ;
//Решение циклом for
re3 = predel_3(y0, y1, y2, eps, n3 = 3) ;
if(n3 != INT_MAX)
{cout.precision(4) ; //число знаков после десятичной точки
cout << "Для цикла FOR рез. = " << re3 << " n = " << n3 << endl ;
}
else cout << "Для цикла FOR точность не достигнута" << endl ;
break ;
default: return 0 ;
}//switch
}//for
}
//main_end_____________________________________________________________________
//predel_1_beg__________________________________________________________________
//вычисление предела последовательности циклом while
double predel_1(double y0, double y1, double y2, double eps, int&n)
{double y = (atan(n * n - 3.) + 1.5 * y2) / (sqrt(cos(n*n + 1.)) + y0 * y0 + 2.);
while(fabs(y - y2) > eps && n < INT_MAX)
{y0 = y1 ;
y1 = y2 ;
y2 = y ;
n++ ;
y = (atan(n * n - 3.) + 1.5 * y2) / (sqrt(cos(n*n + 1.)) + y0 * y0 + 2.);
}
return y ;
}
//predel_1_end__________________________________________________________________
//predel_2_beg__________________________________________________________________
//вычисление предела последовательности циклом do..while
double predel_2(double y1, double y2, double y, double eps, int&n)
{double y0 ;
do{y0 = y1 ;
y1 = y2 ;
y2 = y ;
n++ ;
y = (atan((n * n) - 3.) + 1.5 * y2) / (sqrt(cos((n* n) + 1.)) + (y0 * y0) + 2.);
}
while (fabs(y - y2) > eps && n < INT_MAX) ;
return y ;
}
//predel_2_end__________________________________________________________________
//predel_3_beg__________________________________________________________________
//вычисление предела последовательности циклом for
double predel_3(double y0, double y1, double y2, double eps, int&n)
{double y = (atan(n * n - 3.) + 1.5 * y2) / (sqrt(cos(n*n + 1.)) + y0 * y0 + 2.);
for( ; fabs(y - y2) > eps && n < INT_MAX ; )
{y0 = y1;
y1 = y2;
y2 = y;
n++ ;
y = (atan(n * n - 3.) + 1.5 * y2) / (sqrt(cos(n*n + 1.)) + y0 * y0 + 2.);
}
return y ;
}
//predel_3_end__________________________________________________________________
Программа выводит “nan” вместо искомых значений
Модуль (fabs - C++ Reference) пропущен и тут может получиться отрицательное число
от которого не получить корень.
не очень понимаю где именно я должен воткнуть этот fabs
там, где в формуле )
к результату cos
.
fabs(cos(...