- Autor: Krzysztof Molenda
- Wersja: 2019-10-03
-
Utwórz klasę
Pracownikopisującą obiekt, zawierający:Nazwisko(typustring),DataZatrudnienia(typuDateTime),Wynagrodzenie(typudecimal).
-
Dostęp do danych zrealizuj jako publiczne properties (read-write).
- dla
Nazwiskozaimplementuj obcinanie spacji przed i po - dla
DataZatrudnieniazaimplementuj: data zatrudnienia nie później niż dzisiaj, w przeciwnym przypadkuthrow new ArgumentException() - dla
Wynagrodzeniezaimplementuj: przy próbie podstawienia wartości ujemnej, przypisz0.
- dla
-
Przesłoń metodę
ToString()zwracającą tekstową reprezentację obiektu w formie:(Nazwisko, DataZatrudnienia, Wynagrodzenie) -
Zaimplementuj konstruktor (trójargumentowy). Zaimplementuj konstruktor domyślny (bezargumentowy), przyjmując nazwisko
"Anonim", datę przyjęcia dzisiaj oraz wynagrodzenie0PLN. -
Zaimplementuj publiczne property
CzasZatrudnieniazwracające aktualny czas zatrudnienia pracownika w pełnych miesiącach (miesiąc = 30 dni). -
Zmodyfikuj metodę
ToString()tak, aby po dacie zatrudnienia wypisywała czas zatrudnienia w miesiącach podany w nawiasie.(Nazwisko, DataZatrudnienia (CzasZatrudnienia), Wynagrodzenie) -
Aby określić pojęcie "taki sam" zaimplementuj w klasie
PracownikinterfejsIEquatable<Pracownik>. Dwa obiekty typuPracowniksą takie same, jeśli mają takie same nazwiska, daty zatrudnienia i wynagrodzenia. Powinieneś również przesłonić metodęEquals()orazGetHashCode()w taki sposób, aby wyniki wszystkich były spójne. Przeczytaj: -
Zaimplementuj statyczną metodę
Equals(Pracownik p1, Pracownik p2)przesłaniając tę, zdefiniowaną w klasieObject. -
Zaimplementuj przeciążenie operatora
==(równocześnie musisz przeciążyć!=). -
Przetestuj w
Main()poprawność powyższych implementacji.
-
Utwórz listę 5 pracowników:
- dwóch mających te same nazwiska,
- dwóch zatrudnionych w tym samym roku i miesiącu,
- dwóch mających to samo wynagrodzenie.
-
Wypisz tę listę w porządku oryginalnym.
-
Posortuj listę (metoda
Sort<T>zdefiniowana w klasieList<T>). Dlaczego nie można tego zrobić? -
Zadeklaruj implementację przez klasę
PracownikinterfejsuIComparable<Pracownik>i zaimplementuj go. Ustal naturalny porządek w zbiorze pracowników: najpierw według nazwiska, potem według daty zatrudnienia i na końcu według wynagrodzenia - wszystko rosnąco. -
Posortuj listę według naturalnego porządku zdefiniowanego w klasie
Pracownik.
Dla listy utworzonej w poprzednim kroku wykonaj:
-
Posortuj listę najpierw według czasu zatrudnienia (w miesiącach), a później według wynagrodzenia - wszystko rosnąco:
- utwórz klasę o nazwie
WgCzasuZatrudnieniaPotemWgWynagrodzeniaComparerimplementującą interfejsIComparer<Pracownik>, - posortuj listę (przeciążona metoda
Sort<T>zdefiniowana w klasieList<T>wymagająca dostarczenia obiektu typuIComparer), - wypisz listę i sprawdź poprawność sortowania.
- utwórz klasę o nazwie
-
Posortuj listę najpierw według czasu zatrudnienia (w miesiącach), a później kolejno według nazwiska i wynagrodzenia:
- posortuj listę (przeciążona metoda
Sort<T>zdefiniowana w klasieList<T>wymagająca dostarczenia delegata typuComparison), - wypisz listę i sprawdź poprawność sortowania.
- posortuj listę (przeciążona metoda
-
Posortuj listę (metoda z
Comparison) kolejno: malejąco według wynagrodzenia, później rosnąco według czasu zatrudnienia.
Lista pracowników jest typu List<Pracownik>, ale również obiektem typu IEnumerable. Wykorzystaj metodę OrderBy oraz ThenBy z klasy Enumerable do uporządkowania listy według kolejno: wynagrodzenia, nazwiska. Eksperymentuj.
Musisz na początku kodu programu użyć dyrektywy
using System.Linq.
Realizacja tego kroku pozwoli Ci lepiej zrozumieć mechanizmy dostarczania metod generycznych (uniwersalnych) - wykonasz to samo, co programiści bibliotek standardowych C#.
W statycznej klasie Sortowanie napisz statyczną procedurę generyczną Sortuj<T>, sortującą zadaną jako parametr listę obiektów typu T - w trzech wariantach przeciążonych:
-
void Sortuj<T>( this IList<T> lista )- wykorzystująca wewnętrzny porządek w zbiorze -
void Sortuj<T>( this IList<T> lista, IComparer<T> comparer )- wykorzystująca zewnętrzny porządek dostarczony w formie obiektu typuIComparer -
void Sortuj<T>( this IList<T> lista, Comparison<T> comparison )- wykorzystująca zewnętrzny porządek w zbiorze dostarczony w formie delegata.
Wykorzystaj pseudokod dowolnego algorytmu sortującego (np. BubleSort, InsertionSort, SelectionSort, ShellSort, QuickSort, MergeSort) - skorzystaj z Wikipedii lub WikiBooks.
Każdy z algorytmów sortowania (uniwersalny) wymagać będzie porównywania oraz przestawiania elementów. Zatem najpierw napisz generyczną metodę void SwapElements<T>(this IList<T> list, int i, int j) zamieniającą elementy listy miejscami (list[i] ⇆ list[j]).
Użycie interfejsu
IList<T>pozwala na rozszerzenie funkcjonalności Twojego sortowania na dowolne listy (zarównoList<T>jak i np.LinkedList<T>i inne, implementujące ten interfejs). Użycie słowa kluczowegothisprzy pierwszym argumencie (typuIList) powoduje, że tworzysz metodę rozszerzającą.
Sprawdź działanie swoich algorytmów na liście obiektów oraz na liście elementów typu strukturalnego (np. int).
W klasie Array oraz w klasie List<T> zdefiniowana jest metoda BinarySearch efektywnie wyszukująca zadany element.
Zapoznaj się z dokumentacją tej metody. Jakie warunki musi spełniać zbiór, w którym może ona wyszukiwać wystąpienie elementu. Jaka jest jej reakcja w sytuacji, gdy elementu nie ma zbiorze?
Wykonaj stosowne eksperymenty.