Problem z napisaniem programu - funkcja kwadratowa

2011-09-07 21:41
Trout
0

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


    #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, 2016-12-13 18:26

Pozostało 580 znaków

2011-09-07 22:15
0

Pierwszy błąd jaki widzę:

 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:

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:

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

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

Lepiej napisać

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

W ten sposób otrzymasz wydajniejszy kod.
Pozdrawiam

edytowany 6x, ostatnio: transient, 2011-09-08 01:32

Pozostało 580 znaków

2011-09-07 22:17
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.


No ten drugi(pierwszy ;x) if chyba jest potrzebny, chociaż mogłby wyglądać tak: if(b!= 0) - transient 2011-09-07 22:30

Pozostało 580 znaków

2011-09-07 22:20
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:

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, 2011-09-07 22:24

Pozostało 580 znaków

2011-09-08 11:03
0

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

if (a == 0.0f) {

Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 2x, ostatnio: vpiotr, 2011-09-08 11:16
bez znaczenia - Azarien 2011-09-08 11:57
oczywiście że ma znaczenie, tylko nie dla każdego - styl: (implicit) http://bit.ly/nPOC9K ; http://bit.ly/xVYAp - vpiotr 2011-09-08 19:59

Pozostało 580 znaków

2011-09-08 15:07
adffg
0

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

Albo b^2

Nie wypowiadaj się na temat języka o którym nie masz pojęcia. - Zjarek 2011-09-08 15:13

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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