Podstawy programowania w języku C++ Zadania 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 Kwiecień 2017 Mirosław Głowacki (AGH, UJK) Podstawy programowania - obiektowość 2017 1 / 12
Spis treści 1 Zadania L6 2 Podpowiedzi do zadania L6-5 Obliczanie dnia tgodnia dla konkretnej daty Dostęp do danych prywatnych klasy Mirosław Głowacki (AGH, UJK) Podstawy programowania - obiektowość 2017 2 / 12
Klasy - L6-1 1 Zdefiniuj klasę Student wzorując się na zmieszczonej klasie Osoba, dodając jeszcze tekstową informację o kierunku studiów. class Osoba{ public: string imie; string nazwisko; Osoba(){ imie = "Nemo"; nazwisko = "Nemo";} Osoba(string im, string nzw){ imie = im; nazwisko = nzw;} void PrzedstawSie(){ cout << "Jestem: " << imie << " " << nazwisko << endl;} }; Mirosław Głowacki (AGH, UJK) Podstawy programowania - obiektowość 2017 3 / 12
Klasy - L6-2 2 Utwórz program główny umieszczając w nim instrukcje powodujące kolejno: utworzenie obiektu klasy Student o nazwie stud konstruktorem domniemanym utworzenie obiektu klasy Student o nazwie jk konstruktorem pozwalającym na nadanie wartości Jan polu imie oraz Kowalski polu nazwisko, wypisanie danych zawartych w obu obiektach przy użyciu marody PrzedstawSie, przypisanie danych obiektu jk obiektowi stud. ponowne wypisanie danych zawartych w obiekcie stud. Mirosław Głowacki (AGH, UJK) Podstawy programowania - obiektowość 2017 4 / 12
Klasy- L6-3,L6-4 3 Zdefiniuj klasę UJK, która pozwoli na przechowywanie w tablicy spisu wszystkich studentów: na początek możesz założyć, że liczba studentów nie przekracza 100, zdefiniuj metodę dodawania nowych studentów do UJK, zdefiniuj metodę wypisywania aktualnego spisu studentów, zastanów się, jak rozdzielić odpowiedzialności pomiędzy obie klasy przy tworzeniu obu powyższych metod. 4 Zmodyfikuj powstały wcześniej program tak, aby można było zapamiętać dowolną liczbę studentów bez zbędnej rezerwacji pamięci. Mirosław Głowacki (AGH, UJK) Podstawy programowania - obiektowość 2017 5 / 12
Zadanie L6-5 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) Podstawy programowania - obiektowość 2017 6 / 12
Spis treści 1 Zadania L6 2 Podpowiedzi do zadania L6-5 Obliczanie dnia tgodnia dla konkretnej daty Dostęp do danych prywatnych klasy Mirosław Głowacki (AGH, UJK) Podstawy programowania - obiektowość 2017 7 / 12
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 (1) - 0 dla poniedziałku, 1 dla wtorku,..., 6 dla niedzieli y = (r 1) mod 100 c = (r 1) y g = y + y/4 { d t1 = 5 [ (c/100) mod 4 ] } + g mod 7 (1) Mirosław Głowacki (AGH, UJK) Podstawy programowania - obiektowość 2017 8 / 12
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) Podstawy programowania - obiektowość 2017 9 / 12
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 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 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) Podstawy programowania - obiektowość 2017 10 / 12
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 Mirosław Głowacki (AGH, UJK) Podstawy programowania - obiektowość 2017 11 / 12
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) Podstawy programowania - obiektowość 2017 12 / 12