Kapitel 5 - Programm 11 - DATUM.CPP

zurück…

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// Kapitel 5 - Programm 11 - DATUM.CPP

// Diese Datei enthält die Implementation der Klasse Datum.

#include <stdio.h>          // Prototyp für sprintf
#include <time.h>           // Prototypen für das aktuelle Datum
#include "datum.h"

char Datum::Format;         // Definition des statischen Datenelements
char Datum::AusStrom[25];   // Definition der statischen Zeichenkette

// Konstruktor - Setze das Datum auf das aktuelle Datum und das Format
// auf 1
Datum::Datum(void)
{
    time_t ZeitDatum;
    struct tm *AktuellesDatum;

    ZeitDatum = time(NULL);                 // Systemaufruf
    AktuellesDatum = localtime(&ZeitDatum); // Systemaufruf
    Monat = AktuellesDatum->tm_mon + 1;
    Tag = AktuellesDatum->tm_mday;
    Jahr = AktuellesDatum->tm_year + 1900;
    Format = 1;
}

// Setze das Datum auf diese Parameter
//  Rückgabewert = 0 ---> Alle Daten ok
//  Rückgabewert = 1 ---> Etwas außerhalb des Erlaubten
int Datum::SetzeDatum(int EinMonat, int EinTag, int EinJahr)
{
    int Temp = 0;
    int MaxTage;
    // Die Einschränkung beim Jahr ist willkürlich
    if (EinJahr < 1500)     // Sicherstellen, daß das Jahr zwischen
    {   Jahr = 1500;        //  1500 und 2200 liegt
        Temp = 1;
    }
    else
    {
        if (EinJahr > 2200)
        {
            Jahr = 2200;
            Temp = 1;
        }
        else
        {
            Jahr = EinJahr;
        }
    }

    if(EinMonat < 1)        // Sicherstellen, daß das Monat zwischen
    {                       //  1 und 12 liegt
        Monat = Temp = 1;
    }
    else
    {
        if (EinMonat > 12)
        {
            Monat = 12;
            Temp = 1;
        }
        else
        {
            Monat = EinMonat;
        }
    }

    MaxTage = TageImMonat();
    if (EinTag < 1)         // Sicherstellen, daß der Tag zwischen
    {                       //  1 und MaxTage liegt
        Tag = Temp = 1;
    }
    else
    {
        if (EinTag > MaxTage)
        {
            Tag = MaxTage;
            Temp = 1;
        }
        else
        {
            Tag = EinTag;
        }
    }

    return Temp;
}

static char *MonatsName[13] = {" ", "Jan", "Feb",
    "Mar", "Apr", "Mai", "Jun", "Jul", "Aug",
    "Sep", "Okt", "Nov", "Dez"};

// Gib Jan Feb Mar Apr etc. zurück
char *Datum::HoleMonatsName(void)
{
    return MonatsName[Monat];
}

// Gib eine ASCII-Z Zeichenfolge mit dem gespeicherten Fromat zurück
//   Format = 1 Aug 29, 1991
//   Format = 2 29.8.91
//   Format = 3 29.8.1991
//   Format = 4 29 Aug 1991       Militärsiche Zeit
//   Format = ? Alles andere wird als Format 1 interpretiert
char *Datum::HoleFormatiertesDatum(void)
{
    switch (Format)
    {               // Diese Ausgabe nimmt an, dass das Jahr
                    // zwischen 1970 und 2069 liegt
        case 2  : sprintf(AusStrom, "%02d.%02d.%02d",
                          Tag, Monat, Jahr - 1970);
                  break;

        case 3  : sprintf(AusStrom, "%02d.%02d.%04d",
                          Tag, Monat, Jahr);
                  break;

        case 4  : sprintf(AusStrom, "%d %s %04d",
                          Tag, MonatsName[Monat], Jahr);
                  break;

        case 1  : // Weiter zu default
        default : sprintf(AusStrom, "%s %d, %04d",
                          MonatsName[Monat], Tag, Jahr);
                  break;
    }
    return AusStrom;
}

int Tage[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// Da dies im privaten Teil der header-Datei deklariert wurde
//  kann es nur innerhalb der Klasse verwendet werden.
//  Es ist vor der Außenwelt versteckt.
int Datum::TageImMonat(void)
{
    if (Monat != 2)
        return Tage[Monat];

    if (Jahr % 4)       // Kein Schaltjahr
        return 28;
    if (Jahr % 100)     // Schaltjahr
        return 29;
    if (Jahr % 400)     // Kein Schaltjahr
        return 28;
    return 29;          // Schaltjahr
}

zurück…