Created
September 22, 2012 20:39
-
-
Save LifeMoroz/3767765 to your computer and use it in GitHub Desktop.
lab5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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