Liczby Harmoniczne są to sumy odwrotności pierwszych n liczb naturalnych. Wzór na n-tą liczbę harmoniczną ma postać:
Najprostsza funkcja wyliczająca n-tą liczbę Harmoniczną można zapisać przy pomocy pojedynczej pętli for. Należy oczywiście pamiętać, że kolejne ułamki muszą zostać dodane do zmiennej double:
(1.) Funkcja harmoniczna() wylicza dla podanego argumentu n wartość n-tej liczby harmonicznej. (2.) Zadeklarowanie zmiennej w. (3.) Wyliczanie kolejnych wyrazów sumy i (4.) ich dodanie do w. Na koniec (5.) program zwraca wartość zmiennej w.
Taka implementacja posiada znaczącą wadę - wszystkie wyliczone wartości mogą być obarczone błędem zaokrąglenia czego przyczyną jest przechowywanie danych. Przykładem, który ma wpływ na wynik jest np. ułamek .
W przypadku liczb Harmonicznych lepszym pomysłem jest napisanie funkcji harmoniczna(), która zwróci ułamek. Oczywiście, aby to osiągnąć potrzebny będzie nowy typ danych. Każdy ułamek składa się z licznika i mianownika, dlatego zadeklarowana struktura będzie miała dwie zmienne typu int:
Następny krok polega na napisaniu dodatkowej funkcji, która pozwoli dodać dwa ułamki, ponieważ dla C++ jest to całkowicie nowy typ i nie potrafi takiej operacji wykonać. Dla ułatwienie można skorzystać z poniższego wzoru na dodawanie:
(1.) Funkcja dodająca dwa ułamki przyjmie dwie zmienne a i b typu ulamek. Wynikiem będzie typ ulamek, który będzie wynikiem a + b. (2.) Do nowej zmiennej przypisz wynik a + b i (3.) zwróć nową zmienną.
Ze względu na nowy typ danych potrzebne są zmiany w oryginalnym kodzie funkcji harmoniczna():
(1.) Funkcja harmoniczna() zwraca typ ulamek dla podanego argumentu n. Zadeklarowanie zmiennej (2.) w której będzie przechowywany wynik oraz (3.) ulamek, który w każdej pętli zmieniany i dodawany. (4.) Dla każdego składnika prócz pierwszego: (5.) utwórz i-ty ułamek i (6.) sumą zmiennych w i a dodaj do w. Na koniec (8.) zwróć wynik zmiennej w.
W celu wykorzystania napisanego kodu potrzebna jest jeszcze funkcja, która wypisze wartości przechowywane w zmiennej typu ulamek. Jej postać może wyglądać następująco:
(1.) Funkcja wypiszUlamek() przyjmuje jeden argument a na podstawie którego (2.) wypisany jest ułamek oraz jego wartość dziesiętna.
Pierwsze dziesięć liczb Harmonicznych wypisuje poniższa wartość main():
Napisz program na podstawie obecnego kodu źródłowego tak, aby spełniał poniższe punkty:
Przykładowo dla argumentu n = 4 zostanie wypisane na konsoli: