Доброго времени суток форумчане у меня проблема при отладке пишет что происходит переполнение стека памяти как этого избежать?
Вот весь код полностью
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <conio.h>
#include <iomanip>
using namespace std;
ofstream fout; //Объявление выходного файлового потока
//---------------------------------Вычисление n -------------------------------
long fact(int n)
{
if(n<0) return (0);
else if(n==0) return (1);
else return (n);
}
//-----------------------------------Вычисление x^n -------------------------------------------
double stx ( double x , int n )
{
if (n == 0) return (1); // здесь рекурсия прерывается;
if (x == 0) return (0);
if (n==1) return (x);
if ( n > 0 ) return (x * stx (x, n-1 ));
if ( n < 0 ) return (stx ( x , n+1 ) / x);
}
//----------------------------------Вычисление (-1)^n --------------------------------------
int st (int n)
{
if ((n==0) || (n%2==0)) return 1;
else return (-1);
}
//---------------------- Функция вычисления очередного члена ряда---------------
float next ( float x, int n)
{
return st(n)*stx(x,2*n+1)/fact(2*n+1);
}
//--------------------------Описание типа – указателя на функции-------------------
typedef float (*func)(float, int);
//----------Вычисление суммы с помощью while и рекуррентной формулы---
float S1 (int n, float x, float e)
{
float a =x, s=0;
while (fabs(a)>e)
{
s+=a;
a*=(-1* x*x/(2*(n+1)*(2*n+3))); n++;
}
return (s+a);
}
//-------Вычисление суммы с помощью do-while и рекуррентной формулы--
float S2 ( int n, float x, float e)
{
float a =x , s=0;
do
{
s+=a;
a*=(-1* x*x/(2*(n+1)*(2*n+3))); n++;
}
while (fabs(a)>e);
return (s+a);
}
//----------Вычисление суммы с помощью while и параметра – функции------
float S3 ( int n, float x, float e, func fn)
{
float f = fn(x,n), s=0;
while(fabs(f)>e)
{
s+=f;
n++; f=fn(x,n);
}
return (s+f);
}
//--------Вычисление суммы с помощью do-while и параметра – функции----
float S4 ( int n, float x, float e, func fn)
{
float f=fn(x,n) , s=0;
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;
else return (f+ S5(n+1, x, e, fn));
}
//------------------------------------Главная функция-------------------------------------
void main()
{
float e = 1.e-5; // точность вычислений;
fout.open("l5.res"); // открытие файла результатов для записи;
if(!fout)
{
cout<<"Ошибка открытия файла результатов"; exit(0);
}
//----------------------------Вывод заголовка и шапки таблицы----------------------
fout<<"\t\t\tРезультаты для e = " <<e<<'\n'
<< "|-----|----------|----------|----------|----------|----------|----------|" <<'\n'
<< "| x | sin | S1 | S2 | S3 | S4 | S5 |" <<'\n'
<< "|-----|----------|----------|----------|----------|----------|----------|";
for(float x=1;x>-1;x-=0.5)
{
fout<< endl<<'|'<<setw(4)<<x<<setw(2)<<'|'<<setw(10)<<sin(x)<<'|'
<<setw(10) << S1(0,x,e)<<'|'<<setw(10) << S2(0,x,e) << '|' << setw(10)
<< S3(0,x,e,next) << '|'<< setw(10) << S4(0,x,e,next) << '|' << setw(10)
<< S5(0,x,e,next) << '|';
}
fout<<'\n'<<"|-----|----------|----------|----------|----------|----------|----------|";
fout.close();
}