rendered paste body/*
Öåë : Òîâà å ïðîãðàìà íàìèðàùà êîðåí íà ïðîèçâîëíî âúâåäåíà ôóíêöèÿ è íåéíèòå ãðàíèöè èçïîëçâàéêè ìåòîäà íà ðàçïîëîâÿâàíåòî.
Àâòîð : Õðèñòîìèð Íåäÿëîâ Èâàíîâ.
Êîìïèëàòîð : Dev-C++ . ÎÑ : Windows Vista .
Äàòà : 10 àïðèë 2008ã.
*/
using namespace std;
#include <iostream>
#include <math.h>
double IntervalHigh,
IntervalLow,
Tochnost = 0.000001;
int PoziciaNaUravnenieto = 0;
char Uravnenie[ 129 ],
Element[ 129 ];
void PrintHeader();
void VzemiInterval();
void VzemiUravnenie();
void VzemiTochnost();
void NamiraneNaKoren();
char VzemiElement();
double F( double x);
double PresmetniElement( double x );
int main()
{
char Answer[ 129 ] = { 'Y', 0 };
while( ( Answer[ 0 ] == 'Y' ) || ( Answer[ 0 ] == 'y' ) )
{
PrintHeader();
VzemiUravnenie();
VzemiInterval();
VzemiTochnost();
system("pause");
NamiraneNaKoren();
system("pause");
Answer[ 0 ] = 0;
printf( "\n\n\n" );
while( strlen( Answer ) != 1 )
{
printf( "Iskate li da prodyljite s nova zadacha? (Y=Yes) :" );
gets( Answer );
}
}
return 1;
}
void PrintHeader() //Èíôîðìàöèîííà ÷àñò ÷àñò
{
printf( "\n\nTazi programa namira koren na f(x)=0 po metoda na razpoloviavaneto\n\n\n"
"Avtor: Hristomir Neialkov Ivanov\n""Studnet v: Burgaski svoboden universitet\n"
"Specialnost: Informatika i komputyrni nauki\nFakulteten nomer: 0731007\nKurs: I-vi\n\n" );
}
void VzemiUravnenie() //Âúâåæäàíå è ïðîâåðêà äúëæèíàòà íà âúâåäåíàòà ôóíêöèÿ
{
Uravnenie[ 0 ] = 0;
while( strlen( Uravnenie ) < 2 )
{
printf( "\nVyvedete jelanata funkciq f(x)=" );
gets( Uravnenie );
if( strlen( Uravnenie ) < 2 )
printf( "\n\7Uravnenieto trqbva da byde pone 2 simvola!\n\n" );
}
}
void VzemiInterval() //Âúâåæäàíå è ïðîâåðêà íà èíòåðâàëèòå íà ôóíêöèïòà
{
char VremenenNiz[ 129 ],
Done = 0;
while( !Done )
{
Done = 1;
VremenenNiz[ 0 ] = 0;
while( !strlen( VremenenNiz ) )
{
printf( "\nVyvedete dolnata granica na intervala za tyrsene: " );
gets( VremenenNiz );
}
IntervalLow = atof( VremenenNiz );
VremenenNiz[ 0 ] = 0;
while( !strlen( VremenenNiz ) )
{
printf( "Vyvedete gornata granica na intervala za tyrsene: " );
gets( VremenenNiz );
}
IntervalHigh = atof( VremenenNiz );
if( IntervalLow == IntervalHigh )
{
Done = 0;
printf( "\n\7Gornata i dolnata granica na intervala syvpadat. Molq, vyvedete novi granici.\n" );
}
if( IntervalLow > IntervalHigh )
{
Done = 0;
printf( "\n\7Dolnata granica na intervala e po-golqma ot gornata. Molq, vyvedete novi granici.\n" );
}
}
}
void VzemiTochnost() //Âúâåæäàíå íà òî÷íîñò èëè çàïàçâàíå íà ïðåäâàðèòåëíî çàäàäåíàòà //
{
char VremenenNiz[ 129 ];
printf( "\nShte byde izpolzvana standartna tochnost %1.6f\n"
"Vyvedete tochnost, koqto iskate da se izpolva\n"
"ili natisnete ENTER za zapazvane na standartnata: ", Tochnost );
gets( VremenenNiz );
if( ( atof( VremenenNiz ) ) &&
( atof( VremenenNiz ) > 0 ) )
Tochnost = atof( VremenenNiz );
printf( "\nIzpolzvana tochnost: %1.6f\n\n", Tochnost );
}
void NamiraneNaKoren() //Èç÷èñëÿâàíå íà âúâåäåíàòà ôóíêöèÿ è íàìèðàíå íà êîðåí
{
double low = IntervalLow,
high = IntervalHigh,
middle, value;
while( 1 )
{
middle = low + ( high - low ) / 2;
value = F(low)*F(high);
printf( "Interval: %2.6f : %2.6f;\n x=%2.6f, Rezultat: %f2,6\n", low, high, middle, value );
if( fabs( value ) < Tochnost )
{
printf( "\nKorenyt e: %2.6f\n", middle );
break;;
}
if( high == low )
{
printf( "\nNqma koren v posocheniq interval!\7\n" );
break;
}
if( F(low)*F(middle) < 0 )
high = middle;
else
low = middle;
}
}
double F(double x)
{
double VyrniStoinost = 0;
PoziciaNaUravnenieto = 0;
while( VzemiElement() )
VyrniStoinost += PresmetniElement( x );
return VyrniStoinost;
}
double PresmetniElement( double x )
{
double Temp = 0,
VyrniStoinost = 0;
int Loop = 1,
Exponent = 0;
if( ( Element[ 1 ] >= '0' ) && ( Element[ 1 ] <= '9' ) )
{
for(; Loop < strlen( Element ); Loop++ )
{
if( ( Element[ Loop ] < '0' ) || ( Element[ Loop ] > '9' ) )
break;
if( !Temp )
Temp = Element[ Loop ] - 48;
else
Temp = Temp * 10 + Element[ Loop ] - 48;
}
}
if( ( Element[ Loop ] == 'x' ) || ( Element[ Loop ] == 'X' ) )
{
if ( Element[ Loop + 1 ] == '^' )
{
for( Loop += 2; Loop < strlen( Element ); Loop++ )
{
if( ( Element[ Loop ] < '0' ) || ( Element[ Loop ] > '9' ) )
break;
if( !Exponent )
Exponent = Element[ Loop ] - 48;
else
Exponent = Exponent * 10 + Element[ Loop ] - 48;
}
}
else
Exponent = 1;
}
if( Temp )
VyrniStoinost = Temp;
else
VyrniStoinost = 1;
if( Exponent )
VyrniStoinost *= pow( x, Exponent );
if( Element[ 0 ] == '-' )
VyrniStoinost = -VyrniStoinost;
return VyrniStoinost;
}
char VzemiElement()
{
char VyrniStoinost = 0,
VremenenNiz[ 2 ] = { 0, 0 };
Element[ 0 ] = 0;
if( !PoziciaNaUravnenieto )
{
if( Uravnenie[ 0 ] == '-' )
{
strcat( Element, "-" );
PoziciaNaUravnenieto++;
}
else
{
strcat( Element, "+" );
if( Uravnenie[ 0 ] == '+' )
PoziciaNaUravnenieto++;
}
}
else
{
if( ( Uravnenie[ PoziciaNaUravnenieto ] == '+' ) ||
( Uravnenie[ PoziciaNaUravnenieto ] == '-' ) )
{
VremenenNiz[ 0 ] = Uravnenie[ PoziciaNaUravnenieto ];
strcat( Element, VremenenNiz );
PoziciaNaUravnenieto++;
}
}
for(; PoziciaNaUravnenieto < strlen( Uravnenie ); PoziciaNaUravnenieto++ )
{
if( ( Uravnenie[ PoziciaNaUravnenieto ] == '+' ) || ( Uravnenie[ PoziciaNaUravnenieto ] == '-' ) )
break;
VremenenNiz[ 0 ] = Uravnenie[ PoziciaNaUravnenieto ];
strcat( Element, VremenenNiz );
VyrniStoinost = 1;
}
return VyrniStoinost;
}