МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ГРАЖДАНСКОЙ АВИАЦИИ

 

Лабораторная работа №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();

}