Funkcje – omówienie

FunkcjafunkcjaFunkcja jest wydzielonym fragmentem kodu programu, odpowiedzialnym za wykonywanie określonego zadania – na przykład obliczenie wyniku działań matematycznych. Raz zdefiniowana funkcja może być używana wielokrotnie: wystarczy ją wywołać w odpowiednim miejscu programu, bez konieczności kopiowania tych samych poleceń.

Funkcje w programowaniu przypominają nieco funkcje matematyczne, które przyporządkowują argumentom określone wartości. W programowaniu jest podobnie: funkcja przyjmuje argumentyargumentargumenty, przetwarza je i zwraca pewną wartość. Należy jednak podkreślić, że funkcja zdefiniowana w programie nie musi przyjmować żadnych argumentów – i tym różni się od funkcji matematycznej.

W niektórych językach programowania można zetknąć się również z pojęciem procedura. Jest to konstrukcja podobna do funkcji. Różnica polega na tym, że procedura pobiera dane, które następnie przetwarza, ale nie zwraca żadnej wartości. W dalszej części tekstu będziemy posługiwać się wyłącznie terminem funkcja.

Umiejętność definiowania funkcji i posługiwania się nimi jest bardzo istotna dla każdego programisty. Dzielenie większych i powtarzalnych zadań na funkcje nie tylko skraca kod, ale także ułatwia jego analizowanie.

Błędy obliczeń na przykładzie wyznaczania miejsc zerowych funkcji kwadratowej

Zapewne niejednokrotnie zdarzyło ci się rozwiązywać równanie kwadratowe, czyli znajdować miejsca zerowe funkcji opisanej wzorem:

f ( x ) = a x 2 + b x + c

Współczynniki a, b i c są stałymi, przy czym a0. Gdyby współczynnik a=0, mielibyśmy do czynienia z funkcją liniową.

Równanie kwadratowe ma postać:

a x 2 + b x + c = 0

Znasz wzory służące do wyznaczania liczby rozwiązań takiego równania oraz obliczania wartości pierwiastków:

Δ = b 2 4 a c
  • Dla Δ > 0 istnieją dwa rozwiązania:

x 1 = ( b Δ ) 2 a
x 2 = ( b + Δ ) 2 a
  • Dla Δ = 0 istnieje jedno rozwiązanie:

x = b 2 a
  • Dla Δ < 0 równanie nie ma rozwiązania.

Przedstawione wzory moglibyśmy wykorzystać, pisząc program obliczający pierwiastki równania kwadratowego. Należy jednak pamiętać o ograniczeniach związanych ze sposobem zaokrąglania liczb podczas zapisywania wartości pierwiastka. Jeśli spróbujemy przechowywać go w zmiennej typu całkowitego, utracimy całą część ułamkową.

Błąd taki łatwo jest naprawić – wystarczy użyć typu zmiennoprzecinkowego. Niestety, także i w tym wypadku nie da się wykluczyć, że wynik zostanie zaokrąglony. Błąd tego typu jest nie do usunięcia.

Gdy rozwiązujemy równanie kwadratowe, może również dojść do pojawienia się błędu podczas wykonywania następującego działania:

x 2 = ( b + Δ ) 2 a

Jeżeli licznik ułamka będzie miał wartość bardzo bliską zera, mogą pojawić się błędy zaokrąglenia. Wyeliminujemy je, stosując inny algorytmalgorytmalgorytm obliczeń.

Ważne!

Algorytmy niestabilne są algorytmami, których zastosowanie dla pewnych danych wejściowych skutkuje uzyskaniem niedokładnych wyników. Zastosowanie algorytmów stabilnych eliminuje natomiast wszystkie możliwe do uniknięcia błędy związane z zaokrągleniami.

Stabilny algorytm rozwiązywania równania kwadratowego

W celu wyeliminowania błędów zaokrągleń należy użyć wzoru służącego do obliczania wyróżnika równania kwadratowego (delty) oraz jednego z wzorów Viete'a.

Wzorów tych możemy używać, gdy chcemy obliczyć miejsca zerowe dla funkcji kwadratowej postaci:

f ( x ) = a x 2 + b x + c

Gdzie, aby funkcja była funkcją kwadratową, a !=0.

Wzory te prezentują następujące zależności:

x 1 + x 2 = b + Δ 2 a + b Δ 2 a = 2 b 2 a = b a

Ostatecznie pierwszy przyjmuje postać:

x 1 + x 2 = b a

oraz analogicznie:

x 1 x 2   = b + Δ 2 a b Δ 2 a = ( b ) 2 ( Δ ) 2 ( 2 a ) 2 = b 2 Δ 4 a 2 = b 2 ( b 2 4 a c ) 4 a 2 = 4 a c 4 a 2 =   c a

Natomiast drugi przyjmuje postać:

x 1 x 2 = c a

Skorzystamy z drugiego wzoru. Po przekształceniu zależność ta pozwala obliczyć wartość x2:

x 2 = c ( a x 1 )

Jeśli obliczymy wartość x1, która nie jest obarczona wspomnianym już błędem zaokrąglenia, możemy również wyznaczyć x2, korzystając ze wzoru Viete'a. Pozwoli to uniknąć błędu zaokrąglenia także w przypadku drugiego miejsca zerowego.

Linia 1. a znak równości wprowadź liczbę całkowitą. Linia 2. b znak równości wprowadź liczbę całkowitą. Linia 3. c znak równości wprowadź liczbę całkowitą. Linia 5. delta znak równości b asterysk b – 4 asterysk a asterysk c. Linia 6. jeżeli delta otwórz nawias ostrokątny 0 wykonaj dwukropek. Linia 7. wypisz cudzysłów brak rozwiązań cudzysłów. Linia 8. jeżeli delta znak równości znak równości 0 wykonaj dwukropek. Linia 9. x znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 10. wypisz x. Linia 11. jeżeli delta zamknij nawias ostrokątny 0 wykonaj dwukropek. Linia 12. pomocnicza znak równości c prawy ukośnik a. Linia 13. jeżeli b zamknij nawias ostrokątny 0 wykonaj dwukropek. Linia 14. x1 znak równości otwórz nawias okrągły minus b – pierwiastek 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. Linia 15. x2 znak równości pomocnicza prawy ukośnik x1. Linia 16. jeżeli b otwórz nawias ostrokątny 0 wykonaj dwukropek. Linia 17. x2 znak równości otwórz nawias okrągły minus b plus pierwiastek 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. Linia 18. x1 znak równości pomocnicza prawy ukośnik x2. Linia 19. wypisz x1 przecinek x2.

Słownik

algorytm
algorytm

skończona lista instrukcji prowadzących do zrealizowania pewnego zadania; często przedstawiany jest w postaci schematu blokowego lub listy kroków

argument
argument

wartość, która jest przekazywana funkcji

funkcja
funkcja

wydzielony fragment kodu programu, odpowiedzialny za wykonanie pewnych operacji; funkcja może być wykorzystywana wielokrotnie oraz używać własnych zmiennych lokalnych; funkcje są nazywane również podprogramami lub – gdy nie zwracają żadnej wartości – procedurami