fclose(f);
Zavisimost2(key,selectedOtnoshenie,selectedMethod,selectedFunction);
}
//файл ReturnKurs.cpp, здесь описанны функции для подсчетов, вычислений, решений и тому подобное...
#include "stdafx.h"
#include "Kursovoy.h"
double calcKritCorrectTrapecia(int selectedOtnoshenie,int selectedFunction,double a,double b,int N,double m) //вычисляет критерий точности с помощью метода трапеций
{
double prevI,I,tempI;
prevI=Trapecia(N/2,a,b,selectedFunction,m);
I=Trapecia(N,a,b,selectedFunction,m);
if(selectedOtnoshenie==2) tempI=analitIntegral(selectedFunction,a,b,m);
if(selectedOtnoshenie==1) tempI=prevI;
return(abs((prevI-I)/tempI));
}
double calcKritCorrectSimpson(int selectedOtnoshenie,int selectedFunction,double a,double b,int N,double m)//с помощью метода Симпсона
{
double prevI,I,tempI;
prevI=Simpson(N/2,a,b,selectedFunction,m);
I=Simpson(N,a,b,selectedFunction,m);
if(selectedOtnoshenie==2) tempI=analitIntegral(selectedFunction,a,b,m);
if(selectedOtnoshenie==1) tempI=prevI;
return(abs((prevI-I)/tempI));
}
double Trapecia(int N,double a,double b,int selectedFunction,double m) //вот ОН - сам метод трапеций
{
double I,h,x; //переменные значение интеграла, шаг по пределу интегрирования, значение аргумента на данном шаге
x=a;
h=(b-a)/N; //так вычислется h
I=h*(selectedFunctionValue(selectedFunction,b,m)+selectedFunctionValue(selectedFunction,a,m))/2;//первое значение интеграла при не разбиении его вообще на отрезки
for(int i=0;i<N;++i) //на каждом шаге
{
x=x+h;
I=I+h*selectedFunctionValue(selectedFunction,x,m);//к значению прибавляется значение функции в данной точке умноженное на значение аргумента
}
return I; //возвращается значение интеграла (конечно же не точное, в ином случае смысла в этой программе не было бы совсем)
}
double Simpson(int N,double a,double b,int selectedFunction,double m) //не менее важный метод Симпсона
{
double I,h,x; //тоже самое
h=(b-a)/N;
I=h*(selectedFunctionValue(selectedFunction,b,m)+selectedFunctionValue(selectedFunction,a,m))/3;//но первое значение чуть по другой формуле
x=a;
for(int i=1;i<N;++i) //два цикла, для четных x и нет, этот для четных
{
x=x+2*h; //т.е от первоначального значения отдаляемся на два шага
I=I+2*h*selectedFunctionValue(selectedFunction,x,m)/3; //и прибавляем
i++;
}
x=a-h; //для нечетных нужно первый раз отдалиться на один h
for(int i=0;i<N;++i)
{
x=x+2*h; //а затем уже делать по два шага
I=I+4*h*selectedFunctionValue(selectedFunction,x,m)/3; //ну и формула, и всё всё складываем
i++;
}
return I; //возвращаем полученное значение
}
double selectedFunctionValue(int selectedFunction,double argumentValue,double m) //вычислет значения заддоной функции при заданных параметрах
{
switch(selectedFunction)
{
case 1:return (m/(argumentValue*argumentValue));break;
case 2:return (m/(argumentValue));break;
case 3:return (sin(m*argumentValue));break;
default:return 0;break;
}
}
double analitIntegral(int selectedFunction,double a,double b, double m) //аналитическое значение интеграла, ну тут все понятно
{
switch(selectedFunction)
{
case 1:return m*((1/a)-(1/b));break;
case 2:return m*((log(b))-(log(a)));break;
case 3:return 1/m*((cos(m*a))-(cos(m*b)));break;
default:return 0;break;
}
}
//файл Select.cpp, самое сложное))) функции выбора, ввода параметров, интерфейс, не побоюсь этого слова))
#include "stdafx.h"
#include "Kursovoy.h"
int selectZavisimost() //вывод на экран меню выбора требуемой зависимости (вызывается в самом начале)
{ int numberZavisimost;
Zagolovok();
cout<<"Выберите зависимость:\n"
<<"1. кол-во итераций от критерия точности\n"
<<"2. точность от кол-ва итераций\n"
<<"Выбранная зависимость - ";
cin>>numberZavisimost;
return numberZavisimost;
}
int selectedZavisimostFunction() //если же таких зависимостей не обнаруживается (их всего две)
{
int selectedZavisimost=selectZavisimost();
while (selectedZavisimost!=1&&selectedZavisimost!=2)
{
cout<<"Данная зависимость не обнаружена, выберите заново..."; //то выводим на экран такое сообщение,
selectedZavisimost=selectZavisimost(); //и даем возможность, т.е заставляем, выбрать снова
}
if(selectedZavisimost==1) Zavisimost1(49,1,0,0); //вызывается требуемая функция (с параметрами 49, т.е дальнейший выбор данных будет полным)
if(selectedZavisimost==2) Zavisimost2(49,1,0,0);
return selectedZavisimost; //а ничкому не возвращает ничего, ну и пусть
}
int selectOtnoshenie() //меню выбора делителя для критерия точности
{ int numberOtnoshenie;
cout<<"\nВыберите делитель при вычислении критерия точности:\n"
<<"1. значение интеграла на предыдущем прохождении\n"
<<"2. аналитическое значение интеграла\n"
<<"Выбранный делитель - ";
cin>>numberOtnoshenie;
return numberOtnoshenie;
}
int selectedOtnoshenieFunction(FILE*f,int selectedZavisimost)
{
system("cls");
Zagolovok();
cout<<"Выбранная зависимость - " //выводит номер уже выбранной ранее зависимости
<<selectedZavisimost;
int selectedOtnoshenie=selectOtnoshenie();
while (selectedOtnoshenie!=1&&selectedOtnoshenie!=2) //и пока нужный делитель для вычисления критерия не будет выбран
{
cout<<"Данный пункт не найден..."; //выводится данное сообщение
selectedOtnoshenie=selectOtnoshenie(); //и снова выбираем
}
fprintf(f,"%s%d%s","Выбранное отношение для критерия точности -",selectedOtnoshenie,"\t\n");
return selectedOtnoshenie;
}
int selectMethod() //далее всё так же как и в предыдущих пунктах выбора
{ int numberMethod;
cout<<"\nВыберите метод:\n"
<<"1. Метод трапеций\n"
<<"2. Метод Симпсона\n"
<<"Выбранный метод - ";
cin>>numberMethod;
return numberMethod;
}
int selectedMethodFunction(FILE*f,int selectedZavisimost,int selectedOtnoshenie)
{
system("cls");
Zagolovok();
cout<<"Выбранная зависимость - "
<<selectedZavisimost
<<"\nВыбранный делитель - "
<<selectedOtnoshenie;
int selectedMethod=selectMethod();
while (selectedMethod!=1&&selectedMethod!=2)
{
cout<<"метод не найден, выберите снова...";
selectedMethod=selectMethod();
}
fprintf(f,"%s%d%s","Выбранный метод -",selectedMethod,"\t\n");
return selectedMethod;
}
int selectFunction()
{
int numberFunction;
cout<<"\nВыберите функцию:\n"
<<"1. f(x) = m/x^2\n"
<<"2. f(x) = m/x\n"
<<"3. f(x) = sin(mx)\n"
<<"Выбранная функция - ";
cin>>numberFunction;
return numberFunction;
}
int selectedFunctionFunction(FILE*f,int selectedZavisimost,int selectedOtnoshenie, int selectedMethod)
{
system("cls");
Zagolovok();
cout<<"Выбранная зависимость - "
<<selectedZavisimost
<<"\nВыбранный делитель - "
<<selectedOtnoshenie
<<"\nВыбранный метод -"
<<selectedMethod;
int selectedFunction=selectFunction();
while (selectedFunction!=1&&selectedFunction!=2&&selectedFunction!=3)
{
cout<<"Функция не найдена, выберите снова...";
selectedFunction=selectFunction();
}
fprintf(f,"%s%d%s","Выбранная функция -",selectedFunction,"\t\n");
return selectedFunction;
}
double selectedNizhPredel(FILE*f,int selectedZavisimost,int selectedOtnoshenie, int selectedMethod, int selectedFunction) //вводим нижний предел
{
system("cls");
Zagolovok();
cout<<"Выбранная зависимость - "
<<selectedZavisimost
<<"\nВыбранный делитель - "
<<selectedOtnoshenie
<<"\nВыбранный метод -"
<<selectedMethod
<<"\nВыбранная функция - "
<<selectedFunction;
double a;
cout<<"\nНижний предел интегрирования a=";
cin>>a;
fprintf(f,"%s%f%s","Нижний предел интегрирования a=",a,"\t\n");
return a;
}
double selectedVerhPredel(FILE*f) //и верхний
{
double b;
cout<<"Верхний предел интегрирования b=";
cin>>b;
fprintf(f,"%s%f%s","Верхний предел интегрирования b=",b,"\t\n");
return b;
}
double selectedKoefM(FILE*f)
{
double m; //ну и почти не нужный коэффициент (используем в нашей задаче только для синуса)
cout<<"Коэффициент m=";
cin>>m;
cout<<"\n\nИдет вычисление...\n в зависимости от параметров процесс может занять некоторое время\n";
fprintf(f,"%s%f%s","Коэффициент m=",m,"\t\n");
return m;
}
char uvelicVerhPredel()
{
char a;
cout<<"провести исследование при увелении верхнего предела?? Y???";
cin>>a;
return a;
}
void Zagolovok() //а это самая главная часть программы, без которой ничего работь не будет
{ //выводит на экран КУРСОВАЯ, для красоты, ну или для подобия красоты
cout<<"* * * * ** * * * * * * * * * * \n"
<<"* * * * * * * * * * * * * * * \n"
<<"** * ** * * * * * * * * * * \n"
<<"* * * * * * * * * * * * * * \n"
<<"* * * * * * * * * * * * * * \n"
<<"___________________________________________________ \n\n";
}