//1.Пользуясь рекуррентной формулой yi=yi-1 + yi-3^2, где i=3,4,...n,
//для заданного значения n вычислить yn, если известны y0, y1, y2.
//2.Последовательность {an} задана равенствами:
// a1=0.5; an=n*(an-1+0.5).
// Вычислить предел произведения (1+1/a1)*...*(1+1/an).
// Вычисления закончить при |1/an| < eps.
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<limits.h>
int recur1(int n, int y0, int y1, int y2);
int recur2(int n, int y0, int y1, int y2);
int recur3(int n, int y0, int y1, int y2);
float predel1(float eps);
float predel2(float eps);
float predel3(float eps);
int main()
{int var, n;
int re1, re2, re3; //результаты решения первой задачи
float rez1, rez2, rez3; //результаты решения второй задачи
float eps; //точность вычисления результата
float y0, y1, y2; //исходные данные для первой задачи
clrscr();
for(;;)
{
//Выбор вида действия
cout << " Вид действия:\n";
cout << " 1 - вычисление по рекуррентной формуле\n";
cout << " 2 - вычисление предела произведения\n";
cout << " 3 - завершение задачи\n";
cout << " Введите вид действия -> ";
cin >> var;
switch(var)
{case 1:
//Ввод исходных данных для первой задачи
cout << " Введите n -> ";
cin >> n;
cout << " Введите y0, y1, y2 -> ";
cin >> y0 >> y1 >> y2;
re1 = recur1(n, y0, y1, y2);
re2 = recur2(n, y0, y1, y2);
re3 = recur3(n, y0, y1, y2);
//Вывод результата
cout << " Для цикла WHILE результат = " << re1 << endl;
cout << " Для цикла DO..WHILE результат= " << re2 << endl;
cout << " Для цикла FOR результат = " << re3 << endl;
break;
case 2:
//Ввод исходных данных для второй задачи
cout << " Введите точность вычисления -> ";
cin >> eps;
rez1 = predel1(eps);
rez2 = predel2(eps);
rez3 = predel3(eps);
//Вывод результата
cout.precision(4);//число знаков после дес. точки
cout << " Для цикла WHILE результат =" << rez1 << endl;
cout.precision(4);
cout << " Для цикла DO..WHILE результат=" << rez2 << endl;
cout.precision(4);
cout << " Для цикла FOR результат =" << rez3 << endl;
break;
default: return 0;
}//switch
}//for
}
//вычисление значения рекуррентного выражения циклом while
int recur1(int n, int y0, int y1, int y2)
{int i = 3, y;
while(i <= n)
{y = y2 + y0 * y0;
y0 = y1;
y1 = y2;
y2 = y;
i++;
}
return y;
}
//вычисление значения рекуррентного выражения циклом do..while
int recur2(int n, int y0, int y1, int y2)
{int i = 3, y;
do
{y = y2 + y0 * y0;
y0 = y1;
y1 = y2;
y2 = y;
i++;
}
while(i <= n);
return y;
}
//вычисление значения рекуррентного выражения циклом for
int recur3(int n, int y0, int y1, int y2)
{int i, y;
for(i = 3; i <= n; i++)
{y = y2 + y0 * y0;
y0 = y1;
y1 = y2;
y2 = y;
}
return y;
}
//вычисление предела произведения циклом while
float predel1(float eps)
{float pr = 1, an =.5;
int n = 1;
while(fabs(1 / an) > eps)
{pr *= (1 + 1 / an);
n++;
an = n * (an +.5);
}
return pr;
}
//вычисление предела произведения циклом do..while
float predel2(float eps)
{float an =.5, pr = 1;
int n = 1;
do
{pr *= (1 + 1 / an);
n++;
an = n * (an +.5);
}
while (fabs(1 / an) > eps);
return pr;
}
//вычисление предела произведения циклом for
float predel3(float eps)
{float an =.5, pr = 1 + 1 / an;
for(int n = 2; n < INT_MAX; n++)
{an = n * (an +.5);
if(fabs(1 / an) > eps) pr *= (1 + 1 / an);
else break;
}
return pr;
}