Rozwiązywanie równania kwadratowego – implementacja w języku Java
Specyfikacja problemu:
Dane:
a – liczba rzeczywista; różna od zera; współczynnik przy
b – liczba rzeczywista; współczynnik przy
c – liczba rzeczywista; wyraz wolny
Wynik:
Program, na standardowym wyjściu, wypisuje odpowiedni komunikat:
Rownanie nie ma rozwiązań,
Rownanie ma jedno rozwiazanie x1 = X1, gdzie w miejscu X1 powinna znajdować się wyznaczona wartość miejsca zerowego,
Rownanie ma dwa rozwiazania: x1 = X1 x2 = X2, gdzie w miejscu X1, X2 powinny znajdować się wyznaczone wartości miejsc zerowych.
Zaimplementujmy stabilny algorytm rozwiązywania równania kwadratowego. Pierwszym krokiem jest zadeklarowanie funkcji statycznejfunkcja statycznafunkcji statycznejobliczRownanie(), która zwróci łańcuch znaków wynik. Będzie on wyświetlał obliczone wartości pierwiastków równania kwadratowego lub informację o braku rozwiązań.
Linia 1. static String obliczRownanie otwórz nawias okrągły double a przecinek double b przecinek double c zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. String wynik znak równości cudzysłów cudzysłów średnik.
Linia 4. return wynik średnik.
Linia 5. zamknij nawias klamrowy.
Tworzymy blok instrukcji warunkowej, która obsłuży przypadki: ∆ > 0, ∆ = 0, oraz ∆ < 0.
Pierwszym przypadkiem, którym się zajmiemy, jest ∆ < 0. W takiej sytuacji zwracamy komunikat, że równanie kwadratowe nie ma rozwiązań.
Linia 1. static String obliczRownanie otwórz nawias okrągły double a przecinek double b przecinek double c zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. String wynik znak równości cudzysłów cudzysłów średnik.
Linia 3. double delta znak równości b asterysk b minus 4 asterysk a asterysk c średnik.
Linia 5. if otwórz nawias okrągły delta otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. wynik znak równości cudzysłów Rownanie nie ma rozwiazan cudzysłów średnik.
Linia 7. zamknij nawias klamrowy else if otwórz nawias okrągły delta znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. zamknij nawias klamrowy.
Linia 11. return wynik średnik.
Linia 12. zamknij nawias klamrowy.
Kolejny rozpatrywany przypadek, to sytuacja, kiedy ∆ = 0. W takiej sytuacji równanie ma jedno rozwiązanie.
Linia 1. static String obliczRownanie otwórz nawias okrągły double a przecinek double b przecinek double c zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. String wynik znak równości cudzysłów cudzysłów średnik.
Linia 4. double delta znak równości b asterysk b minus 4 asterysk a asterysk c średnik.
Linia 6. if otwórz nawias okrągły delta otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. wynik znak równości cudzysłów Rownanie nie ma rozwiazan cudzysłów średnik.
Linia 8. zamknij nawias klamrowy else if otwórz nawias okrągły delta znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. double x1 znak równości 0 średnik.
Linia 10. x1 znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów Rownanie ma jedno rozwiazanie x1 znak równości cudzysłów plus x1 zamknij nawias okrągły średnik.
Linia 12. zamknij nawias klamrowy.
Linia 13. return wynik średnik.
Linia 14. zamknij nawias klamrowy.
Następnym przypadkiem jest sytuacja, gdy wyróżnik trójmianu kwadratowego jest większy niż 0 (blok else). Deklarujemy zmienne, które będą przechowywały oba pierwiastki: double x1 oraz double x2.
Linia 1. static String obliczRownanie otwórz nawias okrągły double a przecinek double b przecinek double c zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. String wynik znak równości cudzysłów cudzysłów średnik.
Linia 4. double delta znak równości b asterysk b minus 4 asterysk a asterysk c średnik.
Linia 6. if otwórz nawias okrągły delta otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. wynik znak równości cudzysłów Rownanie nie ma rozwiazan cudzysłów średnik.
Linia 8. zamknij nawias klamrowy else if otwórz nawias okrągły delta znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. double x1 znak równości 0 średnik.
Linia 10. x1 znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów Rownanie ma jedno rozwiazanie x1 znak równości cudzysłów plus x1 zamknij nawias okrągły średnik.
Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 14. double x1 znak równości 0 średnik.
Linia 15. double x2 znak równości 0 średnik.
Linia 17. zamknij nawias klamrowy.
Linia 19. return wynik średnik.
Linia 20. zamknij nawias klamrowy.
Rozpoczynamy implementację kodu wyliczającego wartości pierwiastków na podstawie wzorów Viète'a. Tworzymy instrukcje warunkową. Sprawdzamy w niej wartość zmiennej b. Jeżeli jest ona mniejsza od zera, wówczas pod zmienną x2 zapisujemy wartość obliczoną ze wzoru: . Z kolei drugi pierwiastek, x1, z wyrażenia: .
Linia 1. static String obliczRownanie otwórz nawias okrągły double a przecinek double b przecinek double c zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. String wynik znak równości cudzysłów cudzysłów średnik.
Linia 4. double delta znak równości b asterysk b minus 4 asterysk a asterysk c średnik.
Linia 6. if otwórz nawias okrągły delta otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. wynik znak równości cudzysłów Rownanie nie ma rozwiazan cudzysłów średnik.
Linia 8. zamknij nawias klamrowy else if otwórz nawias okrągły delta znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. double x1 znak równości 0 średnik.
Linia 10. x1 znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów Rownanie ma jedno rozwiazanie x1 znak równości cudzysłów plus x1 zamknij nawias okrągły średnik.
Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 14. double x1 znak równości 0 średnik.
Linia 15. double x2 znak równości 0 średnik.
Linia 17. if otwórz nawias okrągły b otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 18. x2 znak równości otwórz nawias okrągły minus b plus Math kropka sqrt otwórz nawias okrągły delta zamknij nawias okrągły zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 19. x1 znak równości c prawy ukośnik otwórz nawias okrągły a asterysk x2 zamknij nawias okrągły średnik.
Linia 20. zamknij nawias klamrowy.
Linia 22. zamknij nawias klamrowy.
Linia 24. return wynik średnik.
Linia 25. zamknij nawias klamrowy.
Jeżeli zmienna b przechowuje wartość większą bądź równą 0, wówczas do zmiennej x1 zapisujemy wartość wyliczoną ze wzoru: . Wartość zmiennej x2 liczymy za pomocą wyrażenia: . Do zmiennej wynik zapisujemy informacje o rozwiązaniu.
Linia 1. static String obliczRownanie otwórz nawias okrągły double a przecinek double b przecinek double c zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. String wynik znak równości cudzysłów cudzysłów średnik.
Linia 4. double delta znak równości b asterysk b minus 4 asterysk a asterysk c średnik.
Linia 6. if otwórz nawias okrągły delta otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. wynik znak równości cudzysłów Rownanie nie ma rozwiazan cudzysłów średnik.
Linia 8. zamknij nawias klamrowy else if otwórz nawias okrągły delta znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. double x1 znak równości 0 średnik.
Linia 10. x1 znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów Rownanie ma jedno rozwiazanie x1 znak równości cudzysłów plus x1 zamknij nawias okrągły średnik.
Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 14. double x1 znak równości 0 średnik.
Linia 15. double x2 znak równości 0 średnik.
Linia 17. if otwórz nawias okrągły b otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 18. x2 znak równości otwórz nawias okrągły minus b plus Math kropka sqrt otwórz nawias okrągły delta zamknij nawias okrągły zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 19. x1 znak równości c prawy ukośnik otwórz nawias okrągły a asterysk x2 zamknij nawias okrągły średnik.
Linia 21. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 22. x1 znak równości otwórz nawias okrągły minus b minus Math kropka sqrt otwórz nawias okrągły delta zamknij nawias okrągły zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 23. x2 znak równości c prawy ukośnik otwórz nawias okrągły a asterysk x1 zamknij nawias okrągły średnik.
Linia 24. zamknij nawias klamrowy.
Linia 26. wynik znak równości cudzysłów Rownanie ma dwa rozwiazania dwukropek lewy ukośnik nx1 znak równości cudzysłów plus x1 plus cudzysłów lewy ukośnik noraz lewy ukośnik nx2 znak równości cudzysłów plus x2 średnik.
Linia 27. zamknij nawias klamrowy.
Linia 29. return wynik średnik.
Linia 30. zamknij nawias klamrowy.
Należy jeszcze pobrać od użytkownika wartości współczynników funkcji kwadratowej (a, b oraz c). Zrobimy to, korzystając z klasy Scanner i funkcji nextDouble(), ponieważ współczynniki a, b i c są właśnie typu double.
Ważne!
Ponieważ w programie użyta została zewnętrzna klasa Scanner, należy pamiętać o dodaniu instrukcji:
Linia 1. import java kropka util kropka Scanner średnik.
Linia 1. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. double a przecinek b przecinek c średnik.
Linia 4. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik.
Linia 6. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj wartosc wspolczynnika a dwukropek cudzysłów zamknij nawias okrągły średnik.
Linia 7. a znak równości scanner kropka nextDouble otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 8. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj wartosc wspolczynnika b dwukropek cudzysłów zamknij nawias okrągły średnik.
Linia 9. b znak równości scanner kropka nextDouble otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 10. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj wartosc wspolczynnika c dwukropek cudzysłów zamknij nawias okrągły średnik.
Linia 11. c znak równości scanner kropka nextDouble otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 13. System kropka out kropka println otwórz nawias okrągły obliczRownanie otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 15. zamknij nawias klamrowy.
Program jest gotowy. Oto cały kod:
Linia 1. import java kropka util kropka Scanner średnik.
Linia 3. public class RownanieKwadratowe otwórz nawias klamrowy.
Linia 5. static String obliczRownanie otwórz nawias okrągły double a przecinek double b przecinek double c zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. String wynik znak równości cudzysłów cudzysłów średnik.
Linia 8. double delta znak równości b asterysk b minus 4 asterysk a asterysk c średnik.
Linia 10. if otwórz nawias okrągły delta otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. wynik znak równości cudzysłów Rownanie nie ma rozwiazan cudzysłów średnik.
Linia 12. zamknij nawias klamrowy else if otwórz nawias okrągły delta znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. double x1 znak równości 0 średnik.
Linia 14. x1 znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 15. System kropka out kropka println otwórz nawias okrągły cudzysłów Rownanie ma jedno rozwiazanie x1 znak równości cudzysłów plus x1 zamknij nawias okrągły średnik.
Linia 17. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 18. double x1 znak równości 0 średnik.
Linia 19. double x2 znak równości 0 średnik.
Linia 21. if otwórz nawias okrągły b otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 22. x2 znak równości otwórz nawias okrągły minus b plus Math kropka sqrt otwórz nawias okrągły delta zamknij nawias okrągły zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 23. x1 znak równości c prawy ukośnik otwórz nawias okrągły a asterysk x2 zamknij nawias okrągły średnik.
Linia 25. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 26. x1 znak równości otwórz nawias okrągły minus b minus Math kropka sqrt otwórz nawias okrągły delta zamknij nawias okrągły zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły średnik.
Linia 27. x2 znak równości c prawy ukośnik otwórz nawias okrągły a asterysk x1 zamknij nawias okrągły średnik.
Linia 28. zamknij nawias klamrowy.
Linia 30. wynik znak równości cudzysłów Rownanie ma dwa rozwiazania dwukropek lewy ukośnik nx1 znak równości cudzysłów plus x1 plus cudzysłów lewy ukośnik noraz lewy ukośnik nx2 znak równości cudzysłów plus x2 średnik.
Linia 31. zamknij nawias klamrowy.
Linia 33. return wynik średnik.
Linia 34. zamknij nawias klamrowy.
Linia 36. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 38. double a przecinek b przecinek c średnik.
Linia 39. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik.
Linia 41. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj wartosc wspolczynnika a dwukropek cudzysłów zamknij nawias okrągły średnik.
Linia 42. a znak równości scanner kropka nextDouble otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 43. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj wartosc wspolczynnika b dwukropek cudzysłów zamknij nawias okrągły średnik.
Linia 44. b znak równości scanner kropka nextDouble otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 45. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj wartosc wspolczynnika c dwukropek cudzysłów zamknij nawias okrągły średnik.
Linia 46. c znak równości scanner kropka nextDouble otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 48. System kropka out kropka println otwórz nawias okrągły obliczRownanie otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 50. zamknij nawias klamrowy.
Linia 51. zamknij nawias klamrowy.
Słownik
algorytm numerycznie stabilny
algorytm numerycznie stabilny
algorytm, który gwarantuje rozwiązania (dla dowolnego zadania rozważnej klasy) z błędem tego samego rzędu, co optymalny poziom błędu rozwiązania danego zadania
funkcja statyczna
funkcja statyczna
funkcja, do użycia której nie jest wymagane tworzenie obiektu