- Autor: Krzysztof Molenda
- Wersja: 0.2 (2020-11-08)
- Zagadnienia: projektowanie typu danych, typ strukturalny (
struct
), implementacja interfejsów, przeciążanie operatorów, praca na wielu plikach, testowanie funkcjonalności, properties i auto-properties, zapewnianie niezmienniczości (immutability) zmiennych.
UWAGA: Zadanie ma charakter ćwiczebny. W bibliotekach C# dostępne są gotowe struktury/klasy realizujące (prawdopodobnie lepiej) przedstawione założenia (DateTime
, DateTimeOfset
, TimeSpan
). Jednak realizacja tego zadania pozwala lepiej zrozumieć ich działanie.
Zaprogramuj, korzystając z notatek do wykładów, wzajemnie powiązane ze sobą struktury Time
oraz TimePeriod
, spełniające następujące wymagania:
-
zmienna typu
Time
opisuje punkt w czasie, w przedziale00:00:00 … 23:59:59
(weź pod uwagę arytmetykę modulo w godzinach%24
oraz minutach i sekundach%60
-- wtedy, kiedy to będzie sensowne i wymagane) -
wewnętrzną reprezentacją czasu są pola typu
byte
:Hours
,Minutes
,Seconds
– zrealizuj je jako properties, -
zapewnij niezmienniczość (ang. immutable) tworzonych zmiennych typu
Time
, -
dostarcz różne warianty konstrukcji (między innymi dla trzech parametrów: godzina, minuta, sekunda; dla dwóch parametrów: godzina, minuta i sekundy domyślnie; dla jednego parametru godzina; dla parametru typu
string
o postacihh:mm:ss
i ewentualnie innych, wg uznania), zadbaj o poprawną konstrukcję zmiennych, zgłaszając odpowiedni wyjątek w sytuacji błędnych danych, -
zaimplementuj standardową reprezentację tekstową czasu (w postaci:
hh:mm:ss
) – przeciąż metodęToString()
, -
zaimplementuj interfejsy
IEquatable<Time>
orazIComparable<Time>
dzięki którym zdefiniujesz naturalny porządek w zbiorze „punktów czasowych”, przeciąż operatory relacyjne (==
,!=
,<
,<=
,>
,>=
), -
zapewnij działania arytmetyczne na czasie (modulo 24 godziny) – plus, minus, np. metody
Time Plus(TimePeriod)
,static Time Plus(Time, TimePeriod)
, przeciążenie operatora+
)
-
zmienna typu
TimePeriod
reprezentuje długość odcinka w czasie (odległość między dwoma punktami czasowymi, czas trwania), -
przyjmij wewnętrzną realizację czasu trwania jako liczbę sekund (typ
long
), -
zapewnij „zewnętrzną reprezentację” w postaci
h:m:s
– uwaga: wartość12:25:23
typuTimePeriod
oznacza upływ czasu równy 12 godzin, 25 minut i 23 sekund, zaś ten sam zapis w rozumieniu Time oznacza punkt na osi czasu: godzinę dwunastą dwadzieścia pięć i 23 sekundy. Uwaga: zmienna typuTimePeriod
o wartości29:58:12
ma sens, tzn. oznacza ona odcinek czasowy o długości 29 godzin, 58 minut i 23 sekund, zaś w typieTime
nie ma sensu, -
zapewnij niezmienniczość (ang. immutable) tworzonych zmiennych typu
TimePeriod
, -
dostarcz różne warianty konstrukcji (m. in. dla trzech parametrów: liczba godzin, liczba minut, liczba sekund; dla dwóch parametrów: liczba godzin, liczba minut; dla jednego parametru liczba sekund; dla dwóch parametrów typu
Time
obliczając różnicę punktów czasowych, dla parametru typustring
o postacih:mm:ss
i ewentualnie innych, wg uznania), zadbaj o poprawną konstrukcję zmiennych, zgłaszając odpowiedni wyjątek w sytuacji błędnych danych, -
zaimplementuj standardową reprezentację tekstową upływu czasu (w postaci:
h:mm:ss
) – przeciąż metodęToString()
, dopuszczalny jest zapis 129:58:12, -
zaimplementuj interfejsy
IEquatable<TimePeriod>
orazIComparable<TimePeriod>
, przeciąż operatory relacyjne (==
,!=
,<
,<=
,>
,>=
), -
zapewnij działania arytmetyczne na odcinkach czasowych – plus, minus, np. metody
TimePeriod Plus(TimePeriod)
,static TimePeriod Plus(TimePeriod, TimePeriod)
, przeciążenie operatora+
), oraz inne - wg uznania.
Przetestuj poprawność zaprojektowanych struktur tworząc odpowiednie testy jednostkowe.
-
Wykorzystaj zaprogramowane struktury do realizacji programu typu „zegar” i „stoper”. Mile widziana aplikacja desktopowa (WinForm, WPF, UWP).
-
Zmodyfikuj zaprogramowane struktury tak, aby możliwe było operowanie na milisekundach, czyli tysięcznych częściach sekundy. Taka realizacja może przydać się przy tworzeniu programu typu stoper, gdzie pożądana jest większa dokładność niż na poziomie 1 sekundy.