/* Öåë : Òîâà å ïðîãðàìà íàìèðàùà êîðåí íà ïðîèçâîëíî âúâåäåíà ôóíêöèÿ è íåéíèòå ãðàíèöè èçïîëçâàéêè ìåòîäà íà ðàçïîëîâÿâàíåòî. Àâòîð : Õðèñòîìèð Íåäÿëîâ Èâàíîâ. Êîìïèëàòîð : Dev-C++ . ÎÑ : Windows Vista . Äàòà : 10 àïðèë 2008ã. */ using namespace std; #include #include 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; }