Wyliczanie pierwiastkow wielomianu - zawieszenie prog

0

Witam napisałem program do wyliczania pierwiastków dla danego wielomianu.
Program komplikuje się prawidłowo lecz po wpisaniu wszystkich parametrów nic się dalej nie dzieje.
Nie mam pojęcia co to może być, zrobiłem odpluskwianie w dev c++ i pokazalo ze zmienna "g_zakres = ?"
cokolwiek to oznacza. Modyfikowanie tej zmiennej przez odpluskwiacz nic nie zmienia nadal równa się "?"
Ponizej zamieszczam caly kod: ( bede wdzieczny za wszelkie wskazowki co to moze byc )

#include <iostream>
#include <cmath>
using namespace std;

main()
{
      bool znaleziono = false, brak_rozw = false;
      double wynik = 0, skok = 0, x = 0;
      int potega = 0, stopien = 0, d_zakres = 0, g_zakres = 0, ilosc_pierwiastkow = 0, ilosc_powtorzen = 0;
            
      cout << "Podaj stopien wielomianu W(x): \n";
      cin >> stopien;
      
      cout << "Podaj dolny zakres poszukiwania pierwiastkow: \n";
      cin >> d_zakres;
      
      cout << "Podaj gorny zakres poszukiwania pierwiastkow: \n";
      cin >> g_zakres;
      
      cout << "Podaj co ile ma byc zwiekszany poszukiwany pierwiastek: \n ";
      cin >> skok;      
      
      int* tWspolczynnik = new int[stopien + 1];
      double* zPierwiastek = new double[stopien];
      
      for (int j = 0;j < (stopien + 1); j++)                             // Wczytanie wartosci dla kolejnych
      {                                                                  // wspolczynnikow wielomianu
          cout << "Podaj wartosc wspolczynnika nr " << j+1 << "\n";
          cin >> tWspolczynnik[j];
      }
 
      while (!brak_rozw || !znaleziono)
      {
            wynik = 0;
            x = d_zakres + ilosc_powtorzen * skok;             // x jest sprawdzana liczba ktora zwieksza sie 
            ilosc_powtorzen++;                                 // co powtorzenie petli o wartosc "skok"
            
            for (int i = 0; i < stopien; i++)
            {
                potega = (stopien - i);
                wynik += pow(x, potega) * tWspolczynnik[i]; 
            }
      
            wynik += tWspolczynnik[stopien + 1];
      
            if (wynik == 0)                                    // Jesli wynik wynosi 0 to 
            {                                                  // zwieksz liczbe pierwiastkow o 1 i
                zPierwiastek[ilosc_pierwiastkow] = x;          // zapisz ten x . x: f(x)=0
                ilosc_pierwiastkow++;
            }
            
            if (x > g_zakres && ilosc_pierwiastkow == 0)       // Jesli szukana liczba przekroczy zakres a 
            {                                                  // nie znaleziono pierwiastkow to brak rozwiazan 
                  brak_rozw = true;                            // koniec dzialania programu
            }
            
            if (x > g_zakres && ilosc_pierwiastkow > 0)        // Jesli szukana liczba przekroczy zakres a 
            {                                                  // znaleziono jakis pierwiastek to bardzo dobrze:)
                  znaleziono = true;
            }
            
            if ( ilosc_pierwiastkow == stopien )                  // Jesli znaleziono tyle pierwiastkow jakiego stopnia 
            {                                                  // jest wielomian to zakoncz dzialanie gdyz jest to max
                 znaleziono = true;
            }               
      }
      if (brak_rozw)
      {
         cout << "Ten wielomian nie ma miejsc zerowych w zakresie (" << d_zakres << " , " << g_zakres << ") o skoku ";
         cout << skok << "\n";
      }
      else
      {
          
        cout << " W(x)= ";
        for ( int k = 0; k < (stopien + 1); k++)                                 // wyswietlenie calego wielomianu
        {
            if ( k != stopien ) cout << tWspolczynnik[k] << "x^" << (stopien - k);
            else cout << tWspolczynnik[k];
        }
        cout << "/n/n";
        
        for ( int k1 = 0; k1 < ilosc_pierwiastkow; k1++)                       // wypisanie wynikow
        {
            cout << "x" << k1 + 1 <<" = " << zPierwiastek[k1] << "/n";
        }
        }
delete[] zPierwiastek;
delete[] tWspolczynnik;

char c;
cin >> c;

}
0

Dev-cpp (dokładniej, mingw) jest zły, bardzo często źle kompiluje kod i dobry program się wywala, niewinne instrukcje zmieniają jakąś zupełnie inną zmienną i ogólnie burdel.
Pisz w Visualu albo ściągnij nowszą wersję mingw (betę wersji 4.x) - zdaje się, że większość błędów poprawiono.

0

Nie zwiększasz licznika ilosc_powtorzen. Poza tym kompletnie nie tak się szuka pierwiastków wielomianu ! Ta metoda jest zła. Najprościej to szukasz dowolnego pierwiastka metodą np. bisekji, newtona itp., a później skracasz wielomian przez jednomian "(x - znaleziony_pierwiastek)" i szukasz dalej.

Wracając jeszcze do twojego programu:

if (wynik == 0)

nie możesz tak porównywać, bo prawie nigdy takie porównanie nie będzie prawdą. Liczby zmiennoprzecinkowe porównuje się w pewnym przybliżeniu:

if(fabs(wynik) < przyblizenie)) ...
0

spoko dzięki za rady.
Jak to nie zwiększam ilości powtórzeń? chodzi Ci o to że powinienem użyć post inkrementacji zamiast pre?
Wyliczam takim sposobem bo jest to już nie wiem która próba zrobienia przeze mnie takiego programu poprzednie także nie działały wiec każdorazowo podchodzę do tego inaczej. Jak zrobię tak, to zabiorę się za jakiś inny sposób.

0

a czy nie mógł bym tego warunku zapisać tak: if (static_cast<int>(wynik) == 0 )?

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