[C++] metoda siecznych + virtual

0

Witam napisalem programik ktory powinien liczyc metoda siecznych miejsce zerowe a przy okazji za pomoca funkcji virtualnej wyswietlac rozne kompunikaty jak nastapi jakis wyjatek. Nie wiem czemu zwracana mam jakas dziwna wartosc. Nie wiem gdzie jest blad bo wydaje mi sie ze sieczne sa dobrze zaimplemenotwane. Oto kod

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <math.h> 
using namespace std; 

double dabs(double x) //abs tyle ze dla double 
{ 
   if (x<0) return -x; 
   return x; 
} 

class Wyjatek 
{ 
   public: 

      Wyjatek(string a){ 
            a=komunikat; 
        }; 
      virtual void raport() 
      { 
         cout<<komunikat; 
      } 
   protected: 
      string komunikat; 
}; 
//////////////////////////////      ZŁY PRZEDZIAL   /////////////////////////////////////// 

class Zly_przedzial:public Wyjatek //z dziedziczeniem z klasy Wyjatek 
{ 
   public: 
      Zly_przedzial(double a,double b); 
}; 

Zly_przedzial::Zly_przedzial(double a,double b):Wyjatek("") 
{ 
   komunikat=" Podales beznadziejny przedzial "; 
} 

////////////////////////////        LEWA FUNKCJA    //////////////////////////////////////// 

class Zle_zalozenia:public Wyjatek //z dziedziczeniem z klasy Wyjatek 
{ 
   public: 
      Zle_zalozenia(string a):Wyjatek("") 
      { 
         komunikat="Blad zalozen w funkcji: "+a; 
      }; 

}; 

///////////////////////////     POZA DZIEDZINA FUNKCJI  /////////////////////////////////// 

class Poza_dziedzina:public Wyjatek 
{ 
   public: 
      Poza_dziedzina(double);   //podajemu pkt bledny 
      Poza_dziedzina(string,double); //podajemy nazwe funkcji i pkt bledny 
}; 

Poza_dziedzina::Poza_dziedzina(double x):Wyjatek("") 
{ 
   char bufor[20]; 
   gcvt(x,sizeof(bufor)/sizeof(char),bufor); //funkcja ktora wczytuje liczbe i zamienia ja na string 
   komunikat="Funkcja nieokreslona w punkcie x="; 
   komunikat+=bufor; //doklejamy do naszego komunikatu punkt ktory przerobil na string 
} 

Poza_dziedzina::Poza_dziedzina(string a,double x):Wyjatek("") 
{ 
   char bufor[20]; 
   gcvt(x,sizeof(bufor)/sizeof(char),bufor); 
   komunikat="Funkcja '"; 
   komunikat+=a; 
   komunikat+="' jest nieokreslona w punkcie x="; 
   komunikat+=bufor; 
} 
/////////////////////////// NIE ZBIEGA /////////////////////////////////////////////////////// 

class Nie_zbiega:public Wyjatek 
{ 
   public: 
      Nie_zbiega(string a):Wyjatek("") 
      {    
         komunikat="Niestety nasza funkcja nie zbiega do niczego: "+a; 
      }; 
}; 

////////////////////////////////        ZADANIE     //////////////////////////////////////// 

class Zadanie 
{    
    private: 
      void szukaj(double&,double&,double&,double&) throw (Poza_dziedzina); 
      double dokladnosc; 
      double (*wskFun)(double); 
      double poczatek,koniec; 
      bool czy_rozne(double s,double k) 
      { 
         if (wskFun(s)*wskFun(k)>=0) return false; 
         return true; 
      } 
    
   public: 
      Zadanie(double,double,double (*wsk)(double),double); 
      double rozwiaz(double); 

}; 

Zadanie::Zadanie(double _pocz,double _koniec,double (*wsk)(double),double _dokl) 
{ 
   dokladnosc=_dokl; 
   poczatek=_pocz; 
   koniec=_koniec; 
   wskFun=wsk; 
} 

void Zadanie::szukaj(double& a,double& b,double & zerowe, double& dokl) throw(Poza_dziedzina) //funkcja szukajaca miejsca zerowego  i wyrzucajaca ew blad zalozen 
{    

   while(dabs(wskFun(zerowe))>=dokl) 
   { 
   double wart_a,wart_b; 
   if(b-a==0) 
   { 
      Poza_dziedzina f_wyrzuc_poza(" miejsce zerowe wyskoczylo poza dziedzine ",0); 
      throw f_wyrzuc_poza; 
   } 
   wart_a=(wskFun(b)-wskFun(a))/(b-a); 
   wart_b=wskFun(a)-((wskFun(b)-wskFun(a))*a)/(b-a); 
   zerowe=-wart_b/wart_a; 
   if(wskFun(a)*wskFun(zerowe)<0) b=zerowe; 
   else if(wskFun(b)*wskFun(zerowe)<0) a=zerowe; 
   else a=b=zerowe; 
   } 
} 


double Zadanie::rozwiaz(double dokl) //wlasciwe rowiazanie sprawdzajace bledy po kolei 
{ 

   if(czy_rozne(poczatek,koniec)==false) //sprawdza poprawnosc zalozen funkcji dla szukania 
   { 
      Zle_zalozenia f_wyrzuc_zalozenia(" nie moge policzyc bo jest niezgodne z zalozeniami "); 
      throw f_wyrzuc_zalozenia; 
   } 

   if(poczatek>=koniec) //sprawdza czy przedzial jest poprawny 
   { 
      Zly_przedzial f_wyrzuc_przedzial(poczatek,koniec); 
      throw f_wyrzuc_przedzial; 
   } 
    
    szukaj(poczatek,koniec,koniec,dokl); 
} 
//////////////////////////////////////////////      FUNKCJA      //////////////////////////////////////// 

double f1(double x) throw(Poza_dziedzina) 
{ 
   return cos(x)/sin(x); 
} 

double f2(double x) throw(Poza_dziedzina) 
{ 
   return (x-2.5)/(x-2); 
} 

//###################################################################################### 
int main() 
{ 
   double x,y; 
   double _dokl; 

   cout<<"Podaj poczatek przedzialu: "; 
   cin>>x; 
   cout<<"Podaj koniec przedzialu: "; 
   cin>>y; 
    
   _dokl=0.00000000001; 
   //cout<<"Podaj jaka chcesz dokladnosc: "; 
   //cin>>_dokl; 
    
   Zadanie jakies(x,y,f2,_dokl); 
   try{ 
      cout<<"Miejsce zerowe funkcji to x="<<jakies.rozwiaz(_dokl); 
   } 
    
    catch(Wyjatek wywal) 
   { 
      printf("!!! >>>>>>>> MASZ BLEDA <<<<<< !!!\n"); 
      wywal.raport(); 
   } 
   cout<<endl; 
   system("pause"); 
   return 0; 
}

Proszę o pomoc gdyż potrzebuje tego programu do czegos innego ;/

0

Pytanie z cyklu: "macie mój kod, co w nim jest źle?".

To jest Twój kod i ty powinieneś wiedzieć gdzie jest błąd. Nie wiem, czy znajdzie się ktoś, kto przeczyta i zanalizuje Twoje wypociny.

Sprawdź czy nie zrobiłeś jakiejś literówki.
Sprawdź pokoleii wartości zmiennych, w każdym etapie programu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1