Problem z programem liczącym rozwiązanie trójmianu

0

Witam. Przedstawiony program wylicza rozwiązania równania kwadratowego. Problem polega na tym, że program wylicza poprawnie rozwiązanie tylko kiedy równanie ma jeden pierwiastek, natomiast przy dwóch jest brak rozwiązań. Przedstawiony kod jest częściowo przeze mnie uzupełniony, ponieważ jest to zadanie, które dostaliśmy na zajęciach i musieliśmy dokończyć otrzymany kod.

#include <iostream>
#include <cmath>

using namespace std;

struct TrojmianKw {
  double  a;
  double  b;
  double  c;
};

void WprowadzWspTrojmianu( TrojmianKw *wTKw )
{
  cout << "Podaj wspolczynnik a: "<<endl;
  cin >> wTKw->a;
  cout << "Podaj wspolczynnik b: "<<endl;
  cin >> wTKw->b;
  cout << "Podaj wspolczynnik c: "<<endl;
  cin >> wTKw->c;
}

void WyswietlTrojmian( TrojmianKw TKw )
{
 cout <<TKw.a<<"x^2+"<<TKw.b<<"x+"<<TKw.c<<endl;
}

/*!
 * Oblicza delte oraz wartosci pierwiastkow. Wartosci wyliczonych
 * pierwiastkow podstawiane sa do zmiennych odstepnych poprzez
 * wskazniki wX1 oraz wX2.
 * Interpretacja wynikow zalezy od zwroconej wartosci calkowitej
 * i jest ona nastepujaca:
 *  2 - wyznaczono dwa pierwiastki rzeczywiste, kolejne pierwiastki
 *      wpisane sa do zmiennych dostenych poprzez wskazniki wX1 i wX2.
 *  1 - rownanie ma tylko jeden pierwiastek rzeczywisty, wynik
 *      zostaje wpisany do zmiennej przekazanej poprzez wskaznik wX1.
 *  0 - brak rozwiazan w zbirze liczb rzeczywistych.
 */
int WyliczPierwiastki(TrojmianKw   TKw, double *wX1, double *wX2)
{
  double   Delta, Delta_2;

  Delta_2  = (TKw.b*TKw.b) - (4.0*TKw.a*TKw.c);

  if (Delta_2 > 0) {

      Delta = sqrt( Delta_2 );
      *wX1 = (-TKw.b - Delta) / (2*TKw.a);
      *wX2 = (-TKw.b + Delta) / (2*TKw.a);

  } else if  (Delta_2 == 0) {

      *wX1 = -TKw.b/(2*TKw.a);
      return 1;

  }

  return 0;
}

int main() {
  TrojmianKw   TKw;
  double       X1, X2;

  cout << "Program wylicza rozwiazania trojmianu kwadratowego.\n";

  WprowadzWspTrojmianu(&TKw);

  if (TKw.a == 0) {
  cout<<"Rownanie jest liniowe."<<endl;
    return 1;
  }

  WyswietlTrojmian(TKw);

  switch (WyliczPierwiastki(TKw,&X1,&X2)) {
    case 2:
      cout << "Istnieja dwa rozwiazania rzeczywiste:"<<endl;
      cout << "  x1 = " << X1 << endl;
      cout << "  x2 = " << X2 << endl;
      break;

    case 1:
      cout << "Istnieje jedno rozwiazanie rzeczcywiste" << endl;
      cout << "  x = " << X1 <<endl;
      break;

    case 0:
      cout << "Brak rozwiazan rzeczywistych" << endl;

      break;
  }

  return 0;
}
1

bo nie zwracasz 2 w przypadku 2 rozwiązań....
Gdybyś zamiast tego zrobił zmienną ilosc_rozwiazan i ja zwracał zawsze na końcu funkcji, może byś nie zapomniał

0

Faktycznie. Dzięki wielkie za pomoc :D

1

ten kod ma więcej problemów. Tak się nie porównuje liczb zmiennoprzecinkowych. One mają skończoną precyzję, więc nie masz gwarancji, że delta będzie równa dokładnie zero wtedy gdy się tego spodziewasz.
Przykład na twoim poprawionym (o return) kodzie: https://wandbox.org/permlink/gEGe55HKv4ErP3oT

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