Wątek przeniesiony 2016-10-29 02:33 z Java przez bogdans.

Błąd w kodzie? Zapewne niejeden.

0

Witam,

Nazywam się Bartek i od wczoraj staram się poszerzać horyzonty jeżeli chodzi o Java. Wcześniej jedynie coś czytałem i układałem informację w głowie. Tak to jest mój pierwszy język w jakim chce pracować. Za pewne z każdym projektem wyjdą jakieś błędy i nie ścisłości z którymi mój mózg sobie nie poradzi, dlatego ten temat będzie taką zbiorówką moich błędów i głupot ;)

Wypadałoby od czegoś zacząć. Otóż mam taki problem, że napisałem program który liczy miejsca zerowe równania kwadratowego. Program sprawdza czy delta jest ujemna i z równania wylicza te miejsca (dwa jeżeli delta>0 / jedno jeżeli delta==0 oraz nadaje tylko komunikat gdy delta<0). Cały problem polega na tym, że gdy delta jest większa bądź równa 0 i poda miejsca bądź miejsce zerowe, program i tak dorzuca komunikat, który zwiastuję deltę ujemną. Gdzie popełniłem błąd?

import java.util.Scanner;

public class RownanieKwadratowe
{

	public static void main(String[] args)
	{
		System.out.println("Parametry równania kwadratowego ax2+bx+c");
		Scanner skaner = new Scanner(System.in);
		double a = skaner.nextDouble();
		double b = skaner.nextDouble();
		double c = skaner.nextDouble();
		double delta = b*b-4*a*c;
		
		if(delta>0)
		{
			delta = Math.sqrt(delta);
			double x1 = (-b - delta)/(2*a);
			double x2 = (-b + delta)/(2*a);
			System.out.println("Parametry równania kwadratowego to " + x1 + " oraz " + x2);
		}
		else if (delta==0)
		{
			double x0 = -b/(2*a);
			System.out.println("Równanie posiada tylko jeden parametr" + x0);
		}
		 if(delta<0);
		{
			System.out.println("Delta jest ujemna więc równanie nie ma rozwiązań");
		}
	}

}

Dziękuję za pomoc!

5

Tutaj masz błąd

if(delta<0);
{
   System.out.println("Delta jest ujemna więc równanie nie ma rozwiązań");
} 

Po warunku if masz średnik, co oznacza, że kończysz tę instrukcję, zatem to co masz w nawiasie dalej jest wykonywane zawsze a nie wtedy, gdy spełniony jest warunek. Jeżeli usuniesz średnik, program będzie działał poprawnie. Aczkolwiek zalecam wersję:

else if(delta<0)
{
   System.out.println("Delta jest ujemna więc równanie nie ma rozwiązań");
} 
1

Nie porównuje sie double przez == ze względu na niedokładną reprezentacje binarną. Zamiast tego robi się porównanie z jakimś epsilonem np. delta< 0.00001 No i zamiast tego drugiego ifa daj po prostu else. I faktycznie wywal średnik bo teraz ten blok wykonuje się zawsze.

0
szarotka napisał(a):

Tutaj masz błąd

if(delta<0);
{
   System.out.println("Delta jest ujemna więc równanie nie ma rozwiązań");
} 

Po warunku if masz średnik, co oznacza, że kończysz tę instrukcję, zatem to co masz w nawiasie dalej jest wykonywane zawsze a nie wtedy, gdy spełniony jest warunek. Jeżeli usuniesz średnik, program będzie działał poprawnie. Aczkolwiek zalecam wersję:

else if(delta<0)
{
   System.out.println("Delta jest ujemna więc równanie nie ma rozwiązań");
} 

Super dziękuję! Nie zauważyłem tego drobnego błędu. Ogólnie używam else if, po prostu zostawiłem tam samo if bo kombinowałem sam co może być nie tak ;)

Shalom napisał(a):

Nie porównuje sie double przez == ze względu na niedokładną reprezentacje binarną. Zamiast tego robi się porównanie z jakimś epsilonem np. delta< 0.00001 No i zamiast tego drugiego ifa daj po prostu else. I faktycznie wywal średnik bo teraz ten blok wykonuje się zawsze.

Jako pre-początkujący myślę, że wystarczy double == 0, ale zawsze lepiej uczyć się dobrze niż później się poprawiać, także dzięki za radę :)

1

Nie no właśnie nie wystarczy bo double == 0 to jest warunek bardzo trudny do spełnienia ;)

0

Jeżeli porównujemy z marginesem błędu, to sprawdzanie należy robić w takiej kolejności:

if (Math.abs(delta) <  epsilon)
   //jeden pierwiastek
else if (delta > 0)
   //dwa pierwiastki
else
   //brak pierwiastków

(Drugie z trzecim można przestawić).

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