Problem z napisaniem programu - funkcja kwadratowa

Problem z napisaniem programu - funkcja kwadratowa
0

Witam,
chce napisac program obliczajacy miejsca zerowe funkcji kwadratowej i napisałem takie cos:

Kopiuj
 
    #include<iostream>
    #include<conio.h>
    #include<cmath>
    using namespace std;
    float pow(float base, float exponent);
    float delta, delta2;
    float row(float a, float b, float c)
    {
        if (a==0 && b!=0) return -c/b;
        if (a!=0)
        {
             delta=pow(b,2) - 4*a*c; delta2=sqrt(delta);
             if (delta>0) return (-b-delta2)/(2*a) && (-b+delta2)/(2*a);
             if (delta==0) return -b/(2*a);
             }
    }
    int main()
    {
        float a,b,c;
        cout<<"Podaj wspolczynnik a: ";
        cin>>a;
        cout<<"Podaj wspolczynnik b: ";
        cin>>b;
        cout<<"Podaj wspolczynnik c: ";
        cin>>c;
        if (a==0)
                 if (b==0)
                          if (c==0) cout<<"Rownanie posiada nieskonczenie wiele rozwiazan. "<<endl;
                          else cout<<"Rownanie nie posiada rozwiazania. "<<endl;
        cout<<"Rozwiazanie: "<<row(a,b,c)<<endl;
        getch();
        return 0;
    } 

Jednak wystąpiły dwa problemy:

  1. Wychodzi mi ciagle wynik 5.3465e+036
  2. Oraz nie wiem jak zrobic zeby dla delty ujemnej wyswietlał sie napis, ze dane rownanie nie ma rozwiazan
    No i czy przez zastosowanie koniunkcji zwroci mi dwie wartosci? (13 linijka)

Z góry dzięki
Pozdrawiam

edytowany 1x, ostatnio: madmike
transient
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:24
0

Pierwszy błąd jaki widzę:

Kopiuj
 if (delta>0) return (-b-delta2)/(2*a) && (-b+delta2)/(2*a); 

W deklaracji funkcji napisałeś, że zwraca wartość typu float, i ta wartość zostanie przypisana do jednego obiektu. W ten sposób nie zwrócisz obu pierwiastków funkcji kwadratowej, musisz posłużyć się wskaźnikiem.

Kolejna sprawa, korzystaj z konstrukcji else if:

Kopiuj
if (a==0 && b!=0) return -c/b;
else if (a!=0)
// dalsza część programu

Odnośnie tego, aby wyświetlało, iż dane równanie nie ma rozwiązań i aby nastąpiło przerwanie wykonywania dalszych instrukcji:

Kopiuj
if(delta < 0)
{
     cout << "Równanie nie ma rozwiaza" << endl;
     break;
}

Jeszcze jedno - niepotrzebnie wywołujesz zewnętrzną funkcję pow - wywołanie funkcji zawsze chwilę trwa, zamiast

Kopiuj
delta = pow(b,2) - 4*a*c;

Lepiej napisać

Kopiuj
delta = b * b - 4*a*c;

W ten sposób otrzymasz wydajniejszy kod.
Pozdrawiam

edytowany 6x, ostatnio: transient
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:10 dni
0

Po co deklarujesz pow()?
Niepotrzebny 2 if w row() bo jeśli dojdzie do tego miejsca to a != 0.
W main() te dwa zewnętrzne ify można zapisać jako if (a == 0 && b == 0).
Zamiast używać pow() napisz b*b.
Sprawdzaj czy delta jest nieujemna przed spierwiastkowaniem jej.
Co do 2. to nie, nie zwróci 2 wartości tylko true lub false i pewnie dla tego masz zawsze taki dziwny wynik.


transient
No ten drugi(pierwszy ;x) if chyba jest potrzebny, chociaż mogłby wyglądać tak: if(b!= 0)
iooi
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
0

Zastosowanie koniunkcji da ci w wyniku koniunkcję tych dwóch wartości (w tym przypadku zawsze true).
W takiej postaci funkcji możesz np. wartości pierwiastków zwracać przez argumenty, a przez return - ilość pierwiastków, przenosząc przy tym wszystkie możliwe przypadki do funkcji:

Kopiuj
int row(float a, float b, float c, float& x1, float& x2) {
    if (a == 0) {
        if (b == 0) {
            if (c == 0) {
                return -1;
            } else {
                return 0;
            }
        } else {
            x1 = -c / b;
            return 1;

        // itd...
    }
}

float x1, x2;
switch (row(a, b, c, x1, x2)) {
    case 0 :
        cout << "Rownanie nie posiada rozwiazan";
        break;
    case 1 :
        cout << "Rownanie posiada jedno rozwiazanie: x1 = " << x1;
        break;

    // itd...
}
edytowany 2x, ostatnio: iooi
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

zmienna "a" jest typu float, a więc raczej

Kopiuj
if (a == 0.0f) {
edytowany 2x, ostatnio: vpiotr
vpiotr
oczywiście że ma znaczenie, tylko nie dla każdego - styl: (implicit) http://bit.ly/nPOC9K ; http://bit.ly/xVYAp
0

Zamiast używać pow() napisz b*b.

Albo b^2

ZJ
Nie wypowiadaj się na temat języka o którym nie masz pojęcia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.