Skip to content

Instantly share code, notes, and snippets.

@LifeMoroz
Created September 22, 2012 20:39
Show Gist options
  • Save LifeMoroz/3767765 to your computer and use it in GitHub Desktop.
Save LifeMoroz/3767765 to your computer and use it in GitHub Desktop.
lab5
#include <iostream>
#include <math.h>
#include <iomanip>
#include <string>
using namespace std;
const int N=30;
string chr,s;
bool bol;
struct promezhytok
{
double min; //начальный x
double max; //конечный c
int vozr; // возрастает - 1. убывает - -1. нет данных 0
double& operator=(double&);
};
double f(double x)
{
if (x=0) {return 100000000000000;} // достаточно много, что бы с точностью в 0,000000001 не получить значение больше.
if (x+3*sin(x)-3) {return -100000000000000;} //аналогично
return (((x + cos(x) + 2) / (2*x)) - (4*x) / (x + 3*sin(x) - 3));
}
void gline(int c) //горизонтальная линия длинной с
{
for(int i=1; i<=c; i++)
{cout << "\304";}
}
void show(double n,double k,double d)
{
setlocale(LC_ALL,"C");
cout << "\332";//угол
gline(9);
cout << "\302";//линия с выходом
gline(17);
cout << "\302";
gline(9);
cout << "\302";
gline(17);
cout << "\277" << endl; //угол
cout << "\263" << setw(9) << "X" << "\263" << setw(17) << "Y"
<< "\263" << setw(9) << "X" << "\263" << setw(17) << "Y" << "\263";
long int c=floor(abs((k-n)/d))+1;
int i=1;
for(n; n<=k; n+=d, i++)
{
if ((f(n) > f(n-d)) && i!=1)
if ((i-1)%2 ==0 || i==1)
{
cout << endl << "\303";//вертикальная с выходом
gline(9);
cout << "\305";//линия с выходом
gline(17);
cout << "\305";
gline(9);
cout << "\305";
gline(17);
cout << "\264";
cout << endl;
cout << "\263";
}
if (n==0 || (n + 3*sin(n) - 3)==0)
{
cout << setw(9) << n << "\263" << setw(17) << "Asymptote" << "\263";
} else
{
cout << setw(9) << n << "\263" << setw(17) << f(n) << "\263";
}
}
if (c%2 !=0) {cout << setw(10) << "\263" << setw(18) << "\263";}
cout << endl << "\300";//угол
gline(9);
cout << "\301";//линия с выходом
gline(17);
cout << "\301";
gline(9);
cout << "\301";
gline(17);
cout << "\331" << endl;//угол
setlocale(0,"rus");
} //таблица промежутка от Xn до Xk с шагом в Xd
bool repeat(string s) //запрос на повтор программы (части)
{
do
{
cout << s << endl;
cin >> chr;
}
while ( !((chr == "y") || (chr == "Y") || (chr == "n") || (chr == "N")));
if ((chr == "y")||(chr == "Y")) {return true;} else {return false;}
}
int main()
{
double n, k;
float d;
promezhytok prom[N];
setlocale(0,"rus");
repeat1: // возврат на повтор п1.
while(1)
{
cout << "Введите Xn" << endl;
cin >>n;
cout <<"Введите Xk" << endl;
cin >>k;
if (n>k)
{cout << "Ошибка ввода, повторите ввод!"<< endl;}
else
{
cout <<"Введите шаг функции Xd != 0"<< endl;
cin >>d;
if (d==0) {cout << "Ошибка ввода, повторите ввод! k>n"<< endl;}
else {break;}
}
}
show(n,k,d);
if (repeat("Повторить? [y/n]"))
{
system("cls");
goto repeat1;
}
if (repeat("Перейти к пункту 4? [y/n]")==true)
{
while(1)
{
system("cls");
cout << "Введите Xn" << endl;
cin >>n;
cout <<"Введите Xk" << endl;
cin >>k;
if (n>k)
{cout << "Ошибка ввода, повторите ввод!"<< endl;}
else
{
cout <<"Введите шаг функции Xd != 0"<< endl;
cin >>d;
if (d==0) {cout << "Ошибка ввода, повторите ввод! k>n"<< endl;}
else {break;}
}
}
int j=0;
// Было бы логично переписать программу так, что бы максимально использовать структуры
// Но т.к. структуры введены позже написания 1 части программы, используются только далее
while (n+d<=k) //поиск промежутков на которых вероятно есть корни/экстремумы.
{
if ((f(n+d)>f(n)) && (prom[j].vozr == 1))
{prom[j].max=n+d;}
else
{
j++;
prom[j].min=n;
prom[j].max=n+d;
prom[j].vozr=1;
}
if ((f(n+d)<f(n)) && (prom[j].vozr==(-1)))
{prom[j].max=n+d;}
else
{
j++;
prom[j].min=n;
prom[j].max=n+d;
prom[j].vozr=-1;
}
n+=d;
}
cout << "Найдены вероятные промежутки кол-во:"<< (j+1) << endl;
int i;
if (repeat("Показать? [y/n]"))
{
for (i=0; i<=j; i++)
{
cout << "Промежуток № "<<(i+1)<< endl;
show(prom[i].min, prom[i].max, d/10);
}
k=0;
}
do
{
if (k>0)
{
cout << "Не существует такого промежутка введите число от 1 до" << j << endl;
cout << "Какой промежуток выбрать? Введите порядковый номер";
cout << "Warning! Будет найден первый корень/экстремум функции" ;
cin >> n;// Т.к. используем структуру, то переменная n не имеет необходимости на данный момент.
n--;
k++;
cout<<endl;
}
}
while (n<j);
double exp;
cout << "Введите точность";
cin >> exp;
k=prom[n].max;
n=prom[n].min;
d=d/10;
if (repeat("Показывать ход поиска? [Y/N]"))
{bol = true;}
while (abs(f(n)-f(k)) > exp)
{
if (bol=true)
{
system("cls");
cout << "Xn="<<n<< " "<<"Xk="<<k<<" "<<"Xd="<<d<<endl;
system("pause");
}
show(n,k,d);
if (prom[j].vozr == 1)
{
if (f(n+d)>f(n))
{n+=d;}
else
{
k=n+d;
d=d/10;
}
}
else
{
if (f(n+d)<f(n))
{n+=d;}
else
{
k=n+d;
d=d/10;
}
}
}
}
system("pause");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment