Funkcję kwadratową nazywamy funkcję zadaną wzorem f(x) = ax2 + b·x + c, gdzie a, b, c to współczynniki rzeczywiste. W funkcji kwadratowej a ≠ 0.
Wyróżnik funkcji kwadratowej dany jest wzorem Δ = b2 - 4ac. Po jego wyliczeniu możliwe jest wyliczenie pierwiastków równania kwadratowego. Problem ten rozwiązuje poniższy kod:
Napiszemy teraz funkcję, która na podstawie wyróżnika wypisze na ekran rozwiązania lub komunikat o braku rozwiązań:
2.) Wyliczamy wyróżnik i zapisujemy go do zmiennej delta. (3.) Jeśli delta < 0 to (4.) wypisujemy, że brak rozwiązań. Jednak jeśli nie to to (5.) sprawdzamy czy delta = 0. Jeśli tak to (6.) Obliczamy jedyny, podwójny pierwiastek funkcji kwadratowej. (7.) Jednak, gdy oba warunki są nieprawdziwe to delta > 0, więc (8., 9.) wyliczamy obydwa pierwiastki x1, x2.
Takie rozwiązanie jest niestabilne, a wszystko z powodu błędów zaokrągleń komputera. Mianowicie wyliczamy obydwa pierwiastki niezależnie od siebie. Błędy zaokrągleń mogą spowodować, że rozwiązania nie będą spełniać innych założeń funkcji kwadratowej - np. wzorów Viete'a.
Za wzory Viete'a przyjmujemy następujące wzory: oraz
Wykorzystując wzór na iloczyn pierwiastków równania można uzyskać stabilne rozwiązanie. Pozwoli to nam zredukować błąd zaokrąglenia - błąd oszacowania pierwszego pierwiastka wpłynie na błąd drugiego. Można się zastanawiać czy wtedy chociaż jeden pierwiastek będzie "prawidłowy". W przypadku liczb całkowitych i niektórych liczb rzeczywistych jest to prawdziwe, ale nie zapisując wyniku w formie ułamków (z ewentualnymi pierwiastkami) to nigdy błędy przybliżenia się nie pozbędziemy.
Takie rozwiązanie wprowadza poprawki w linijkach (8., 9.):
(8.) Na początek wyliczamy jeden z pierwiastków i zapisujemy do zmiennej x1. (9.) Na ekran wypisujemy kolejno wartość wyliczonego pierwiastka, a wartość drugiego wyliczamy z przekształconego wzoru Viete'a: . Funkcję wyliczająca pierwiastki w ten sposób nazywamy stabilną.
Poniższa funkcja main() poprosi użytkownika o wprowadzenie punktu do osiągnięcia, a następnie wypisze na ekran czy punkt można osiągnąć i w ilu krokach.
Na wejściu otrzymamy ciąg znaków, który będzie zapisem liniowym funkcji kwadratowej. Na wyjście powinny zostać wypisane jego pierwiastki oraz postać kanoniczna. Przykładowo po wpisaniu f(x)=x^2+6x+9 program wypisze na ekran pierwiastki (lub pierwiastek lub brak) oraz postać kanoniczną.
Za punkt odniesienia będziemy przyjmować liczbę. Jeśli znak przed nią to minus "-" to będziemy wiedzieli, że dany współczynnik ma ujemną wartość. Który współczynnik odczytujemy stwierdzimy po tym czy po liczbie stoi x i jeśli tak to jaką ma potęgę. Zakładamy, że funkcja może mieć dowolną postać tj. współczynnik c może mieć postać np. 2 + 3.
Odczytywanie wyrażenia rozpoczniemy od wczytana wprowadzonej linijki tekstu:
(2.) Deklarujemy bufor, aby przechować wprowadzone wyrażenie. (3.) Wczytujemy wyrażenie. (4.) Deklarujemy zmienną i, która będzie wskazywała, który znak teraz rozpatrujemy. (5.) Przesuwamy wskaźnik na znak po znaku "=".
(6.) Deklarujemy współczynniki. (7.) Rozpoczynamy pętle wczytującą składniki dopóki nie znajdziemy znaku \0. (8.) Sprawdzamy jaki znak ma składnik. (9.) Deklarujemy zmienną liczba do której będziemy wczytywać wartość współczynnika.
(10.) Jeśli aktualnie wczytywany znak to cyfra to (11.) ustawiamy liczba na 0 i (12. - 16.) wczytujemy liczbę z tekstu.
(17.) Jeśli jednak wczytany znak to nie liczba to oznacza to, że jest to współczynniki przy x lub x^2, więc ustalamy liczba na 1. (20.) Jeśli wcześniej ustaliliśmy, że znak jest minus to mnożymy liczba razy -1.
W zależności od rozpoznanych znaków dalej w tekście odpowiednio przesuwamy indeks, zwiększamy odpowiedni współczynnik (a, b, c).
(32.) Na koniec pętli przesuwamy wskaźnik o 1 dalej. (34.) Wypisujemy miejsca zerowe oraz (35.) postać kanoniczną.
Do wypisywania postaci kanonicznej stworzymy funkcję pomocniczą postac_kakoniczna(), aby ułatwić wypisywanie współczynników. Dzięki niej możemy przekazać wartość do przekazania i czy powinien zostać wypisany znak plus "+" oraz czy wypisana powinna być liczba kiedy wynosi 1 (chcemy uniknąć wypisania 1 kiedy stoi przy x lub x2).
Wypisanie postaci kanonicznej to kwestia odpowiedniego wywoływania funkcji writeNumber() oraz używania cout <<.
Wszystkie zadania, które zwykle znalazłyby się w funkcji main() realizuje funkcja read_data().
Dopisz funkcję wierzcholek(), która poda gdzie znajduje się wierzchołek funkcji i go wypisze na ekran.