W tym etapie zdefiniujesz mechanizmy porównywania ułamków (czyli, dla danych dwóch ułamków, który jest większy, a który mniejszy, a może są równe). Formalnie, są to operatory relacyjne.
Wykonuj zadania w podanej kolejności.
-
W projekcie Class library dodaj nową klasę. Plik nazwij
BigRationalRelations.cs
. -
Zmień nazwę klasy na
BigRationalRelations
. Dodaj słowo kluczowepartial
, zmieńclass
nastruct
. Korzystasz z funkcjonalności dzielenia klasy na wiele plikówpartial class
. Rozbudowę strukturyBigRational
w zakresie tego kroku przeprowadzisz w tym pliku. -
W projekcie z testami jednostkowymi utwórz plik o nazwie
BigRationalRelationsUnitTests.cs
. Możesz to wykonać kolejno poleceniami: Add > New Item .. > Basic Unit Test. testy jednostkowe związane z implementacją równości ułamków zapisz w tym pliku. -
Zaimplementuj interfejs
IComparable
. Jego implementacja powinna być spójna zEquals
. -
Zaimplementuj interfejs
IComparable<Ulamek>
. Jego implementacja powinna być spójna zEquals<Ulamek>
oraz poprzednim krokiem. -
Zdefiniuj przeciążenie operatorów relacyjnych (
<
,<=
,>
,>=
). -
Napisz testy jednostkowe weryfikujące poprawność tych nowych funkcjonalności.
-
Poczytaj na temat
IComparable
orazIComparer
(https://www.c-sharpcorner.com/uploadfile/yougerthen/using-icomparable-and-icomparer-to-compare-objects/). Implementacja interfejsuIComparable<Ulamek>
wprowadza w zbiorze ułamków relację porządku liniowego - wiele algorytmów zewnętrznych z tej relacji korzysta domyślnie (np. sortowanie i wyszukiwanie binarne). -
Implementując metodę
CompareTo()
musisz spełnić następujące warunki (relacja porządku liniowego):For objects
A
,B
andC
, the following must be true:A.CompareTo(A)
must return zero.- If
A.CompareTo(B)
returns zero, thenB.CompareTo(A)
must return zero. - If
A.CompareTo(B)
returns zero andB.CompareTo(C)
returns zero, thenA.CompareTo(C)
must return zero. - If
A.CompareTo(B)
returns a value other than zero, thenB.CompareTo(A)
must return a value of the opposite sign. - If
A.CompareTo(B)
returns a valuex
not equal to zero, andB.CompareTo(C)
returns a valuey
of the same sign asx
, thenA.CompareTo(C)
must return a value of the same sign asx
andy
.
Opracuj stosowne testy jednostkowe wg tych wytycznych.
-
Zwróć uwagę, iż implementując
operator <
musisz również zaimplementować operator komplementarnyoperator >
. Przy implementacji operatorów<=
oraz>=
zadbaj, aby były zgodne zEquals
i operatorem==
. -
Zbadaj - na przykładzie typu
double
- jak zachowuje się porównywanie dodouble.NaN
. Zastosuj identyczną logikę w typieBigRational
. -
Zbadaj, jak w typie
double
działaCompareTo()
dlaBigRational.PositiveInfinity' oraz
BigRational.NegativeInfinity'.