zadanie nr 3 termin realizacji: 14 marzec 2005

C++

kalendarz gregoriański (klasa ze składowymi statycznymi) studia dzienne

Zdefiniuj klasę Data, która będzie służyć do zapamiętywania daty zgodnie z kalendarzem gregoriańskim. Klasa ta powinna zawierać trzy pola chronione całkowitoliczbowe do pamiętania roku (typ int), miesiąca (typ wyliczeniowy Miesiac) i dnia (typ wyliczeniowy DzienMiesiaca), inicjalizowane zadanymi wartościami w konstruktorze. Przed inicjalizacją tych pól w kostruktorze, sprawdzić poprawność danych (między innymi, czy data nie jest sprzed piątku 15 października 1582 roku, kiedy to papież Grzegorz XIII odpowiednim dekretem zarządził wpowadzenie współcześnie obowiązującego kalendarza).

Klasa Data powinna być wyposażona w metody odczytujące dzień, miesiąc, rok oraz metodę podającą dzień tygodnia (typ wyliczeniowy DzinTygodnia). Poza tym, metoda opis() ma służyć do prezentacji daty w postaci łańcucha znakowego (na przykład: sroda, 9 marca 2005 ).

Klasa Data musi umieć okeślać odległości czasowe (mierzone w dniach) od innych dat — ma temu służyć metoda odleglosc(); metoda ta może zwrócić liczbę ujemną, gdy paramtr jest datą wcześniejszą od daty pamiętanej w obiekcie. Do obliczania odległości pomiędzy datami wykorzystaj statyczną tablicę dwuwymiarową dniMiesOdPoczRoku[2][13], w której trzymane będą liczby określające ilość dni, które upłynęły od początku roku do końca danego miesiąca (w pierwszej podtablicy dla lat zwykłych, w drugiej dla przestępnych); przykładowo, w zwykłym roku liczby te utworzą ciąg 0, 31, 59, 90, …, 365. W obliczeniach tych można jeszcze wykorzystać funkcję czyPrzestepny(int r) (rok jest przestępny, gdy dzieli się przez 4 i nie dieli się przez 100, z wyjątkiem lat podzielnych przez 400, które są przestępne).

class Data
{
public:
    static const Data poczatekKalendarza ;
protcted:
    DzienMiesiaca dzien ;
    Miesiac miesiac ;
    int rok ;
prvate:
    static const int dniMiesOdPoczRoku[2][13] ;
prvate:
    bool czyPrzestepny (int r) ;
    bool sprawdzeniePoprawnosci (DzienMiesiaca d, Miesiac m, int r) ;
public:
    Data (DzienMiesiaca d, Miesiac m, int r) ;
public:
    DzienMiesiaca ktoryDzien () ;
    Miesiac ktoryMiesiac () ;
    int ktoryRok () ;

    DzinTygodnia ktoryDzienTygodnia () ;
    int odleglosc (Data d) ;
    string opis () ;
// ...
} ;

Program powinien się składać z trzech plików: pliku nagłówkowego Data.hpp z definicją klasy Data, pliku źródłowego Data.cpp z definicjami metod oraz definicjami pól statycznych tej klasy, oraz pliku main.cpp z programem. Sam program ma odczytać z parametrów wywołania dzień, miesiąc i rok (mogą być podane w formie liczb), utworzyć obiekt reprezentujący tą datę i wypisać ją na standardowym wyjściu dla błędów z podaniem dnia tygodnia (metoda opis), a na standardowym wyjściu wydrukować tabelkę dla całego miesiąca pogrupowaną kolumnami według dni tygodnia i zawierającej wczytaną datę. Przydładow wydruk dla 14 marca 2005 roku wyglądłby następująco:

+----------------------------------------------------------------------------+
|                               marzec  2005                                |
+----------+----------+----------+----------+----------+----------+----------+
| poniedzi | wtorek   | sroda    | czwartek | piatek   | sobota   | niedziel |
+----------+----------+----------+----------+----------+----------+----------+
|          |        1 |        2 |        3 |        4 |        5 |        6 |
+----------+----------+----------+----------+----------+----------+----------+
|        7 |        8 |        9 |       10 |       11 |       12 |       13 |
+----------+----------+----------+----------+----------+----------+----------+
|       14 |       15 |       16 |       17 |       18 |       19 |       20 |
+----------+----------+----------+----------+----------+----------+----------+
|       21 |       22 |       23 |       24 |       25 |       26 |       27 |
+----------+----------+----------+----------+----------+----------+----------+
|       28 |       29 |       30 |       31 |          |          |          |
+----------+----------+----------+----------+----------+----------+----------+

Aby wydrukować liczbę lub łańcuch znaków na określonej liczbie miejsc, należy się posłużyć manipulatorem setw(), dołączjąc wcześniej do programu plik nagłówkowy <iomanip>. Przykładowo:

int d=15 ; //                                   --12345678--
cout<<"| "<<setw(8)<<d<<" |" ; // wydruk napisu "|       15 |"

Uniwersytet Wrocławski Paweł Rzechonek Instytut Informatyki ul. Przesmyckiego 20 PL-51-151 Wrocław