МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ГРАЖДАНСКОЙ АВИАЦИИ
Лабораторная работа №5 по дисциплине:
«Алгоритмические языки и программирование»
Разработка функций рекурсивных и без рекурсии, использующих
параметр – функцию и оператор return
Выполнил:
Студент группы ЭВМ 1-1
Приняла:
Цель работы:
Целью лабораторной работы является получение навыков программирования с использованием функций, освоение:
1) построения функций, возвращающих результат с помощью оператора return
2) правил вызова функций, возвращающих результат
3) построения рекурсивных функций
4) правил формирования и использования в качестве параметров – указателей на функции
Выполнение работы
Дана формула: ![]()
Методом деления следующего элемента(
) на предыдущий(
) получаем рекуррентную формулу:
![]()
Алгоритм










Программный код:
#include <math. h>
#include <conio. h>
#include <iostream. h>
#include <iomanip. h>
#include <fstream. h>
#include <stdlib. h>
ofstream fout;
long double fact(int n)
{
if (n<0) return 0;
else if (n==0) return 1;
else return (n * fact(n-1));
}
long double stx(float x, int n)
{
if (n==0) return 1;
if (x==0) return 0;
if (n>0) return(x*stx(x, n-1));
else return (stx(x, n+1)/x);
}
int st(int n)
{
if ((n==0)||(n%2 ==0)) return 1;
else return (-1);
}
float next(float x, int n)
{
return (st(n+1)*stx(2,2*n-1)*stx(x, 2*n)/fact(2*n));
}
typedef float (*func) (float, int);
float S1(float x, float e)
{
float a=2*stx(x,2)/fact(2), s=1;
int n=1;
while (fabs(a)>e)
{
s-=a;
a*=(-1*stx(2*x,2)/(2*(n+1)*(2*n+1)));
n++;
}
return (s+a);
}
float S2(float x, float e)
{
float a=2*stx(x,2)/fact(2), s=1;
int n=1;
do
{
s-=a;
a*=(-1*stx(2*x,2)/(2*(n+1)*(2*n+1)));
n++;
} while (fabs(a)>e);
return (s+a);
}
float S3(int n, float x, float e, func fn)
{
float f=fn(x, n), s=1;
while (fabs(f)>e)
{
s-=f;
n++;
f=fn(x, n);
}
return (s+f);
}
float S4(int n, float x, float e, func fn)
{
float f=fn(x, n), s=1;
do
{
s-=f;
n++;
f=fn(x, n);
} while (fabs(f)>e);
return (s+f);
}
float S5(int n, float x, float e, func fn)
{
float f=-fn(x, n);
if (fabs(f)<e) return (f + 1);
else return (f+S5(n+1, x, e, fn));
}
void main()
{
clrscr();
float e=1.e-5;
cout << "\t\t\tРезультаты для e="<<e<<'\n'
<< "╔═════╦════════╦════════╦════════╦════════╦════════╦════════╗\n"
<< "║ x ║ sin ║ S1 ║ S2 ║ S3 ║ S4 ║ S5 ║\n"
<< "╠═════╬════════╬════════╬════════╬════════╬════════╬════════╣";
for (float x=-3; x<1; x+=1)
{
cout << endl<<'║'<<setw(3)<<x<<setw(3)<<'║'<<setw(9)
<<stx(cos(x),2)<<'║'<<setw(9)<<S1(x, e)<<'║'<<setw(9)<<S2(x, e)
<<'║'<<setw(9)<<S3(1,x, e,next)<<'║'<<setw(9)<<S4(1,x, e,next)
<<'║'<<setw(9)<<S5(1,x, e,next)<<'║';
}
cout << '\n'
<<"╚═════╩════════╩════════╩════════╩════════╩════════╩════════╝";
getch();
}


