Programowanie Obiektowew języku C++ Zadania L2 Mirosław Głowacki 1,2 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania 2 Uniwersytet im. Jana Kochanowskiego w Kielcach Wydział Matematyczno-Przyrodnmiczy Instytut Fizyki Zakład Informatyki Październik 2016 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 1 / 9
Spis treści 1 Zadanie 2 Podpowiedzi do zadania L2-1 Obliczanie dnia tgodnia dla konkretnej daty Podpowiedzi Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 2 / 9
Zadanie L2-1 Zdefiniować klasy data i osoba tak, aby wykonanie programu głównego: int main(){ osoba JK("Jan", "Kowalski", data(5,4,1987)); osoba AN("Anna", "Nowak", data(23,11,2001)); cout << JK; cout << AN; } spowodowało wygenerowanie strumienia wyjściowego: Jan Kowalski - data ur.: Niedziela 5-4-1987 Anna Nowak - data ur.: Piatek 23-11-2001 UWAGA: Dzień tygodnia urodzin powinien być generowany automatycznie na podstawie daty urodzenia Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 3 / 9
Spis treści 1 Zadanie 2 Podpowiedzi do zadania L2-1 Obliczanie dnia tgodnia dla konkretnej daty Podpowiedzi Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 4 / 9
Algorytm obliczania dni tygodnia Algorytm pozwala na szybkie obliczenie dnia tygodnia dla podanej daty dzień-miesiąc-rok. Wszystkie przedstawione operacje dzielenia są operacjami dzielenia całkowitego - (np. 5/2 = 2). Na wtępie wyznaczymy dzień tygodnia (d t1 ) dla pierwszego stycznia podanego roku (r) wg równania (4) - 0 dla poniedziałku, 1 dla wtorku,..., 6 dla niedzieli y = (r 1) mod 100 (1) c = (r 1) y (2) g = y + y/4 (3) ( (((c/100) ) ) ) d t1 = mod 4 5 + g mod 7 (4) Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 5 / 9
Tabela pierwszych dni miesięcy Teraz zdefiniujemy pomocniczą tabelę określającą wartość d p, tzn. liczbę dni roku do końca miesiąca poprzedzającego miesiąc bieżący. Tabela zdefiniowana jest dla roku nieprzestępnego. Miesiąc d p styczeń 0 luty 31 marzec 59 kwiecień 90 maj 120 czerwiec 151 Miesiąc d p lipiec 181 sierpień 212 wrzesień 243 październik 273 listopad 304 grudzień 334 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 6 / 9
Algorytm obliczania dni tygodnia Następnie wyznaczymy dzień roku d r jako sumę d p i bieżącego dnia miesiąca d m d r = d p + d m (5) Liczbę d r należy zwiększyć o 1 dla marca i następnych miesięcy roku przestępnego d rp = d r + d d (6) gdzie: d d = 1 dla marca i następnych miesięcy roku przestępnego, d d = 0 dla pozostałych mniesięcy Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 7 / 9
Rok przestępny Rok jest przestępny, gdy: 1 jest podzielny przez 4 i równocześnie nie jest podzielny przez 100 - np. rok 2012, 2 jest podzielny przez 400 - np. rok 2000. z powyższego wynika, że lata 1900, 2001, 1998 nie są przestępne. Indeks dnia tygodnia (d t ) z zakresu (0, 1,..., 6) wyznaczamy z zależności: d t = (d t1 + d rp 1) mod 7 (7) Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 8 / 9
Podpowiedzi 1 W celu umożliwienia dostępu do danych prywatnych klasy data przeciążanemu operatorowi operator«należy go zaprzyjaźnić z tą klasą - może to wyglądać tak: class data{ friend ostream& operator<<(ostream&, const data&); unsigned short d, m, r;... }; 2 Analogiczne zaprzyjaźnienie powinno się pojawić w klasie osoba - tym razem dla operatora: ostream& operator<<(ostream& str, const osoba& os); 3 operator«klasy osoba powinien skorzystać z usług operatora klasy data Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2016 9 / 9