Scenariusz na lab 4: Proszę zaimplementować klasę dla liczb wymiernych. Klasa powinna nazywać się Rational i mieć następujące metody: (1) statyczne metody zero() : Rational i one() : Rational, które zwracają zero i jedynkę. (2) metody arytmetyczne - add(Rational x) : Rational, - subtract(Rational x) : Rational, - multiply(Rational x) : Rational, - divide(Rational x) : Rational, - opposite() : Rational, - inverse() : Rational, które wykonują odpowiednie operacje arytmetyczne: dodawanie, odejmowanie, mnożenie, dzielenie, branie liczby przeciwnej oraz odwrotności. Każda operacja ma zwracać wynik jako nowy obiekt. (3) akcesory: - sign() : int, - numerator() : int, - denominator() : int, które zwracają odpowiednio znak (-1, 0 lub +1), licznik, i mianownik danej liczby, w postaci nieskracalnej (ze względnie pierwszym licznikiem i mianownikiem). (4) metoda compare(Rational x) : int, która zwraca -1, 0 lub +1 w zależności czy (this) jest mniejsze, równe, czy większe od x. (5) metoda toString() : String, która zwraca string z reprezentacją liczby w postaci nieskracalnej w formacie "[znak](licznik)/(mianownik)", np. "-1/2", "2/3", "-101/10", "0/1". (6) konstruktory Rational(int n) oraz Rational(int p, int q) tworzące odpowiednio n/1 oraz p/q (dla dowolnych p i q, być może ujemnych). Przy implementacji zacznij najpierw od określenia, w jaki sposób Twoja klasa będzie przechowywała wewnętrzne dane, w szczególności kiedy będzie następować normalizacja do postaci nieskracalnej. Zwróć uwagę, żeby określić jak najmniejszy zbiór krytycznych metod potrzebny do zaimplementowania całej funkcjonalności, tzn. implementuj niektóre metody przy użyciu złożeń innych. Dzielenie przez zero należy zignorować (tzn. pozwolić na odpalanie się standardowych wyjątków arytmetycznych). Proszę też napisać funkcję main, w której będzie kilka prostych testów sprawdzających, że funkcjonalność działa. Zadanie powyższe jest trzecim zadaniem domowym z laboratorium; należy je oddać mailem do środy 6-ego kwietnia, do godziny 14:15. Zadania z gwiazdką (bez bonusów, oprócz satysfakcji): - Naucz się z internetów jak się przeładowuje metody equals oraz hashCode, i odpowiednio uzupełnij swój projekt o to. - Naucz się z internetów jak działają wyjątki w Javie, i zdefiniuj wyjątek DivisionByZero podnoszony przy próbie dzielenia przez zero (przy dzieleniu, odwrotności, albo drugim konstruktorze). - Naucz się z internetów jak działa w Javie interfejs Comparable i zrób tak, by Twoja klasa implementowała ten interfejs do porównywania.