Równanie kwadratowe w c++ , bład


(Pawlus1993) #1

Program sie kompiluje, lecz zmienne x1 i x2 nie zaleznie od współczynników mają takie same wartości, dlaczego?

Po skompilowaniu wyswietla się że delta = 0 , a przy współczynnikach 1 , -4 ,-5 to nie mozliwe O.o

//---------------------------------------------------------------------------

include

include

include

include

using namespace std;

pragma hdrstop

//---------------------------------------------------------------------------

pragma argsused

int main(int argc, char* argv[])

{

cout<<"Program znajduje rozwiązanie rownania stopnia drugiego "<

cout<<"Podaj wspolczynniki a,b,c"<

int a,b,c;

cin>>a;

cin>>b;

cin>>c;

cout<<"Wspolczynniki rownania kwadratowego to: a= "<

float delta;

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

cout<

if (delta<0)

{

cout<<"Rownanie nie ma rozwiazania"<

}

else

{

if (delta=0)

{

double x;

x= -b/2*a;

cout<<"Xo= "<

}

else

{

double pierwiastek, x1, x2;

pierwiastek= sqrt(delta);

x1= (-b+pierwiastek)/2*a;

x2= (-b-pierwiastek)/2*a;

cout<<"X1= "<

cout<<"X2= "<

} }

getch();

return 0;

};

//---------------------------------------------------------------------------


(GL1zdA) #2

zacznij od delta==0 zamiast delta=0 (nie wiem jakiego IDE i kompilatora używasz, ale to powinno być wyłapane przez środowisko), przy pierwiastkach pewnie też będzie błąd, bo jest dzielenie całkowitoliczbowe (w C++ int/int daje int a nie double)


(Pawlus1993) #3

Dzięki, był to błąd Borlanda, gdyż dobrze interpretował ten zapis.


(somekind) #4

To nie był błąd Borlanda, tylko Twój, bo to Ty się pomyliłeś i użyłeś nie tej instrukcji, której powinieneś/chciałeś użyć.


(GL1zdA) #5

Formalnie w C++ jest to prawidłowe, ale nowoczesne kompilatory (GCC z -Wall na pewno) generują ostrzeżenie, gdyż niezwykle rzadko jest to operacja, którą rzeczywiście chcemy wykonać.


(Razi) #6

Zależy od ustawień projektu, GCC o tym nie informuje standardowo, ale można włączyć te ostrzeżenie poprzez -Wall (najprościej). clang informuje i bez tego, nawet całkiem ładnie:

razi@acerMint ~ $ clang test.cpp

test.cpp:21:8: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]

  if(id=32){

     ~~^~~

test.cpp:21:8: note: place parentheses around the assignment to silence this warning

  if(id=32){

       ^

     ( )

test.cpp:21:8: note: use '==' to turn this assignment into an equality comparison

  if(id=32){

       ^

       ==

1 warning generated.

Ignoruje to gdy wsadzi się te wyrażenie do nawiasów.