Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Rozwiązywanie równania kwadratowego – implementacja w języku C++

ZaimplementujemyimplementacjaZaimplementujemy w języku C++ wersję stabilną algorytmu rozwiązania równania kwadratowego. Najpierw zdefiniujemy funkcję o nazwie rozwiazRownanie(), która będzie przyjmowała parametry a, b, c (współczynniki równania kwadratowego będące liczbami rzeczywistymi), a następnie zwracała rozwiązanie równania kwadratowego, informowała o braku rozwiązania lub wyświetlała komunikat, że dane równanie nie jest równaniem kwadratowym.

Funkcja ma zwracać łańcuch znaków, dlatego przed jej nazwą należy dodać:

Linia 1. string.

Kolejną rzeczą, o której musimy pamiętać w związku z użyciem łańcucha znaków string, jest dodanie odpowiedniej biblioteki oraz deklaracja przestrzeni nazw:

Linia 1. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 3. using namespace std średnik.

Utworzone ciało funkcji wygląda tak:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 4. using namespace std średnik. Linia 6. string rozwiazRownanie otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. zamknij nawias klamrowy.

Kolejnym krokiem jest zadeklarowanie ciała funkcji rozwiazRownanie() oraz zmiennej łańcuchowej o nazwie wynik. Będzie ona przechowywała rozwiązanie równania kwadratowego lub informację o jego braku.

Linia 1. string rozwiazRownanie 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.

Następnie musimy sprawdzić, czy podane wartości argumentów są poprawne – czy wartość współczynnika a jest różna od 0. W przypadku, gdy wartość współczynnika a jest równa 0, funkcja rozwiazRownanie() powinna zakończyć swoje działanie i zwrócić wynik, że podane wartości współczynników definiują równanie liniowe, a nie kwadratowe.

Linia 1. string rozwiazRownanie 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. if otwórz nawias okrągły a znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. wynik znak równości cudzysłów Nie jest to funkcja kwadratowa przecinek tylko liniowa ponieważ a znak równości 0 cudzysłów średnik. Linia 6. return wynik średnik. Linia 7. zamknij nawias klamrowy. Linia 9. return wynik średnik. Linia 10. zamknij nawias klamrowy.

Wykluczyliśmy przypadek, gdy a = 0. W kolejnych krokach zajmiemy się szukaniem rozwiązania równania kwadratowego.

Linia 1. string rozwiazRownanie 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. if otwórz nawias okrągły a znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. wynik znak równości cudzysłów Nie jest to funkcja kwadratowa przecinek tylko liniowa ponieważ a znak równości 0 cudzysłów średnik. Linia 6. return wynik średnik. Linia 7. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 8. float delta znak równości b asterysk b minus 4 asterysk a asterysk c średnik. Linia 10. zamknij nawias klamrowy. Linia 11. zamknij nawias klamrowy. Linia 13. return wynik średnik. Linia 14. zamknij nawias klamrowy.

Utworzyliśmy zmienną delta, która przechowuje wartość wyróżnika trójmianu kwadratowego.

Linia 1. string rozwiazRownanie 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. if otwórz nawias okrągły a znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. wynik znak równości cudzysłów Nie jest to funkcja kwadratowa przecinek tylko liniowa ponieważ a znak równości 0 cudzysłów średnik. Linia 6. return wynik średnik. Linia 7. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 8. float 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 prawy ukośnik prawy ukośnik BRAK ROZWIĄZAŃ. Linia 11. wynik znak równości cudzysłów Równanie nie ma rozwiązania 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 prawy ukośnik prawy ukośnik JEDNO ROZWIĄZANIE. Linia 13. double x 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 14. wynik znak równości cudzysłów Równanie ma jedno rozwiązanie przecinek x znak równości cudzysłów plus to podkreślnik string otwórz nawias okrągły x zamknij nawias okrągły średnik. Linia 16. zamknij nawias klamrowy. Linia 17. zamknij nawias klamrowy. Linia 19. return wynik średnik. Linia 20. zamknij nawias klamrowy.

Następnie, w zależności od wartości delty, wykonają się kolejne instrukcje. Od jej wartości zależy, czy równanie kwadratowe będzie miało rozwiązanie.

Przypomnijmy zależność:

Jeśli delta jest mniejsza od zera, równanie nie ma rozwiązań. Jeśli jest równa zero, równanie ma jedno rozwiązanie. Jeśli zaś jest większa od zera, równanie ma dwa rozwiązania.

Linia 1. string rozwiazRownanie 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. if otwórz nawias okrągły a znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. wynik znak równości cudzysłów Nie jest to funkcja kwadratowa przecinek tylko liniowa ponieważ a znak równości 0 cudzysłów średnik. Linia 6. return wynik średnik. Linia 7. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 8. float 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 prawy ukośnik prawy ukośnik BRAK ROZWIĄZAŃ. Linia 11. wynik znak równości cudzysłów Równanie nie ma rozwiązania 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 prawy ukośnik prawy ukośnik JEDNO ROZWIĄZANIE. Linia 13. double x 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 14. wynik znak równości cudzysłów Równanie ma jedno rozwiązanie przecinek x znak równości cudzysłów plus to podkreślnik string otwórz nawias okrągły x zamknij nawias okrągły średnik. Linia 15. zamknij nawias klamrowy else if otwórz nawias okrągły delta zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy prawy ukośnik prawy ukośnik DWA ROZWIĄZANIA. Linia 16. zamknij nawias klamrowy. Linia 17. zamknij nawias klamrowy. Linia 19. return wynik średnik. Linia 20. zamknij nawias klamrowy.

Przejdźmy do wariantu, gdy delta jest większa od 0. Deklarujemy trzy zmienne:

  • double viete = c / a; – zmienna ta wykorzysta zależności wynikające ze wzorów Viète'a (omówionych w e‑materiale Proste projekty i funkcjePgB3dsjkgProste projekty i funkcje);

  • double x1 = 0; – zmienna ta będzie przechowywać pierwsze rozwiązanie równania kwadratowego;

  • double x2 = 0; – zmienna ta będzie przechowywać drugie rozwiązanie równania kwadratowego.

Następnie sprawdzana jest wartość współczynnika b i w zależności od jego znaku wykonywane są operacje wyliczania wartości pierwiastków.

Linia 1. string rozwiazRownanie 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. if otwórz nawias okrągły a znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. wynik znak równości cudzysłów Nie jest to funkcja kwadratowa przecinek tylko liniowa ponieważ a znak równości 0 cudzysłów średnik. Linia 6. return wynik średnik. Linia 7. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 8. float 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 prawy ukośnik prawy ukośnik BRAK ROZWIĄZAŃ. Linia 11. wynik znak równości cudzysłów Równanie nie ma rozwiązania 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 prawy ukośnik prawy ukośnik JEDNO ROZWIĄZANIE. Linia 13. double x 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 14. wynik znak równości cudzysłów Równanie ma jedno rozwiązanie przecinek x znak równości cudzysłów plus to podkreślnik string otwórz nawias okrągły x zamknij nawias okrągły średnik. Linia 15. zamknij nawias klamrowy else if otwórz nawias okrągły delta zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy prawy ukośnik prawy ukośnik DWA ROZWIĄZANIA. Linia 16. double viete znak równości c prawy ukośnik a średnik. Linia 17. double x1 znak równości 0 średnik. Linia 18. double x2 znak równości 0 średnik. Linia 20. if otwórz nawias okrągły b zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 21. x1 znak równości otwórz nawias okrągły minus b minus 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 22. x2 znak równości viete prawy ukośnik x1 średnik. Linia 23. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 24. x2 znak równości otwórz nawias okrągły minus b plus 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 25. x1 znak równości viete prawy ukośnik x2 średnik. Linia 26. zamknij nawias klamrowy. Linia 28. wynik znak równości cudzysłów Równanie ma dwa rozwiązania dwukropek lewy ukośnik nx1 znak równości cudzysłów plus to podkreślnik string otwórz nawias okrągły x1 zamknij nawias okrągły plus cudzysłów lewy ukośnik noraz lewy ukośnik nx2 znak równości cudzysłów plus to podkreślnik string otwórz nawias okrągły x2 zamknij nawias okrągły średnik. Linia 29. zamknij nawias klamrowy. Linia 30. zamknij nawias klamrowy. Linia 32. return wynik średnik. Linia 33. zamknij nawias klamrowy.

Używamy funkcji sqrt(), dlatego musimy pamiętać o dodaniu biblioteki:

Linia 1. kratka include otwórz nawias ostrokątny cmath zamknij nawias ostrokątny.

Funkcja jest gotowa. Należy teraz napisać część kodu odpowiedzialną za interakcję z użytkownikiem oraz wywołać funkcję dla zadanych przez użytkownika parametrów.

Linia 1. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. double a przecinek b przecinek c średnik. Linia 5. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj wartość współczynnika a dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 6. cin zamknij nawias ostrokątny zamknij nawias ostrokątny a średnik. Linia 7. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj wartość współczynnika b dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 8. cin zamknij nawias ostrokątny zamknij nawias ostrokątny b średnik. Linia 9. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj wartość współczynnika c dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 10. cin zamknij nawias ostrokątny zamknij nawias ostrokątny c średnik. Linia 12. cout otwórz nawias ostrokątny otwórz nawias ostrokątny rozwiazRownanie otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 14. return 0 średnik. Linia 15. zamknij nawias klamrowy.

Oto cały kod programu:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 3. kratka include otwórz nawias ostrokątny cmath zamknij nawias ostrokątny. Linia 5. using namespace std średnik. Linia 7. string rozwiazRownanie otwórz nawias okrągły double a przecinek double b przecinek double c zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. string wynik znak równości cudzysłów cudzysłów średnik. Linia 10. if otwórz nawias okrągły a znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 11. wynik znak równości cudzysłów Nie jest to funkcja kwadratowa przecinek tylko liniowa ponieważ a znak równości 0 cudzysłów średnik. Linia 12. return wynik średnik. Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 14. float delta znak równości b asterysk b minus 4 asterysk a asterysk c średnik. Linia 16. if otwórz nawias okrągły delta otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy prawy ukośnik prawy ukośnik BRAK ROZWIĄZAŃ. Linia 17. wynik znak równości cudzysłów Równanie nie ma rozwiązania cudzysłów średnik. Linia 18. 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 prawy ukośnik prawy ukośnik JEDNO ROZWIĄZANIE. Linia 19. double x 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 20. wynik znak równości cudzysłów Równanie ma jedno rozwiązanie przecinek x znak równości cudzysłów plus to podkreślnik string otwórz nawias okrągły x zamknij nawias okrągły średnik. Linia 21. zamknij nawias klamrowy else if otwórz nawias okrągły delta zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy prawy ukośnik prawy ukośnik DWA ROZWIĄZANIA. Linia 22. double viete znak równości c prawy ukośnik a średnik. Linia 23. double x1 znak równości 0 średnik. Linia 24. double x2 znak równości 0 średnik. Linia 26. if otwórz nawias okrągły b zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 27. x1 znak równości otwórz nawias okrągły minus b minus 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 28. x2 znak równości viete prawy ukośnik x1 średnik. Linia 29. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 30. x2 znak równości otwórz nawias okrągły minus b plus 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 31. x1 znak równości viete prawy ukośnik x2 średnik. Linia 32. zamknij nawias klamrowy. Linia 34. wynik znak równości cudzysłów Równanie ma dwa rozwiązania dwukropek lewy ukośnik nx1 znak równości cudzysłów plus to podkreślnik string otwórz nawias okrągły x1 zamknij nawias okrągły plus cudzysłów lewy ukośnik noraz lewy ukośnik nx2 znak równości cudzysłów plus to podkreślnik string otwórz nawias okrągły x2 zamknij nawias okrągły średnik. Linia 35. zamknij nawias klamrowy. Linia 36. zamknij nawias klamrowy. Linia 38. return wynik średnik. Linia 39. zamknij nawias klamrowy. Linia 41. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 43. double a przecinek b przecinek c średnik. Linia 45. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj wartość współczynnika a dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 46. cin zamknij nawias ostrokątny zamknij nawias ostrokątny a średnik. Linia 47. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj wartość współczynnika b dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 48. cin zamknij nawias ostrokątny zamknij nawias ostrokątny b średnik. Linia 49. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj wartość współczynnika c dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 50. cin zamknij nawias ostrokątny zamknij nawias ostrokątny c średnik. Linia 52. cout otwórz nawias ostrokątny otwórz nawias ostrokątny rozwiazRownanie otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 54. return 0 średnik. Linia 55. zamknij nawias klamrowy.

Wyjście konsoli:

Linia 1. Podaj wartość współczynnika a dwukropek. Linia 2. 2. Linia 3. Podaj wartość współczynnika b dwukropek. Linia 4. 1. Linia 5. Podaj wartość współczynnika c dwukropek. Linia 6. minus 3. Linia 7. Równanie ma dwa rozwiązania dwukropek. Linia 8. x1 znak równości minus 1 kropka 500000. Linia 9. oraz. Linia 10. x2 znak równości 1 kropka 000000. Linia 11. Program ended with exit code dwukropek 0.

Słownik

implementacja
implementacja

realizacja algorytmu w konkretnym języku programowania

parametr
parametr

zmienna zdefiniowana przy deklaracji metody lub funkcji