Frage von Dieter987, 30

C-Funktion zur korrekten Datumseingabe?

Guten Abend,

ich habe versucht eine C-Funktion zu schreiben, welche falsche Eingaben beim Datum verhindern soll. Allerdings ist dies sehr komplex aufgrund von 30er und 31er Monaten sowie Schaltjahr. Ich erhalte manchmal eine Fehlermeldung (Debug Assertion Failed). Vielleicht kann mir jemand helfen oder mir einen anderen Vorschlag zur Datumseingabe machen.

int korrekt(char *tag, char*mon, char *jahr)

{ char cht = tag; char chm = mon; char chj = jahr; int a, b, c, e; a = atoi(tag); b = atoi(mon); c = atoi(jahr); if (c % 4 == 0) { if (c % 100 == 0) { if (c % 400 == 0) e = 1; } else e = 0;

    while ((cht = *tag++) != '\0') {
        while ((chm = *mon++) != '\0') {
    if ((!isdigit(cht)) || (!isdigit(chm)) || (!isdigit(chj)) || (((b > 12) || (b < 0)) || (((b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12)) && ((a <= 0) || (a > 31))
    || (((b == 4) || (b == 6) || (b == 9) || (b == 11)) && ((a <= 0) || (a > 30))) || 
    (((b == 2) && (e == 1)) && (a <= 0) || (a > 29))) || (((b == 2) && (e == 0)) && (a <= 0) || (a > 28))))
    return 0;
        }
    }
    if (((b > 0) || (b < 13)) || (((b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12)) && ((a > 0) || (a < 32))
        || (((b == 2)) || (b == 4) || (b == 6) || (b == 9) || (b == 11)) && (((a > 0) || (a < 31))) || 
        (((b == 2) && (e == 1)) && ((a > 0) || (a < 30))) || (((b == 2) && (e == 0)) && (a > 0) || (a > 29))))
        return 1;
}

}

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Tschoo, 16

Hallo!

Heutzutage würde ich das mit den eingebauten Datumsfunktionen machen, aber die erste Programmieraufgabe im Studium war auch sowas (aber 30 Jahre her), durch kurzes überlegen bin ich aber nicht auf die Lösung gekommen -- war damals ein dreizeiler, etwas übersichtlicher würde ich es aber trotzdem machen, dies ist Pseudocode, muss also erst in C umgesetzt werden -- Ich benuzte nur positive natürliche Zahlen ( dies sollte vor Funktionsaufruf geprüft werden)

if((month > 12) || (month < 1) return false; 
if(day <= 28) return true; /* Tag ist immer richtig */
if((day == 29) && (month != 2)) return true; /* Tag 29 und nicht Monat 2/Febuar ist immer richtig) */
else if (mod(year/400)== 0) return true; /* Schaltjahr */
else return false; /* monat 2, Tag 29 falsch (Schaltjahr schon abgefragt)
if(day == 30) && month != 2) return true; /* Tag 30 ist immer richtig, ausser Febuar */
if((day == 31) && (month in (1,3,5,6,9,12))return true;

so ähnlich sollte es gehen, vielleicht gibt es durch >Umstellen der Abfragen weitere Vereinfachungen -- im Prinzip erst d8i wahrscheinlichsten Sachen Abfragen und dann zum eher unwahrscheinlichen kommen (habe ich oben schon falsch gemacht -- Abfrage 28/29 sollte später kommen)

Gruß

Kommentar von Dieter987 ,

Ich bekomm dies nicht auf die Reihe. Ich glaube ich mache grundsätzlich mit den Verschachtelungen etwas falsch. 

int korrekt(char *tag, char*mon, char *jahr)

{
char cht = tag;
char chm = mon;
char chj = jahr;
int a, b, c, e;
a = atoi(tag);
b = atoi(mon);
c = atoi(jahr);

if (c % 4 == 0)
{
if (c % 100 == 0)
{
if (c % 400 == 0)
e = 1;
}
}

else e = 0;

while ((cht = *tag++) != '\0') {
while ((chm = *mon++) != '\0') {
if ((b > 12) || (b < 1)) {
return 0;
if (a <= 28) {
return 1;
if ((a == 29) && (b != 2))
return 1;
else if (e == 1)
return 1;
else return 0;
if ((a == 30) && (b != 2)) {
return 1;
if ((a == 31) && (b == 1) || (b == 3) || (b == 5) || (b == 7) || (b == 8) || (b == 10) || (b == 12)) {
return 1;
}
}
}
}
}
}
}
Antwort
von Dieter987, 6

So ich habe nun eine halbwegs passende Lösung gefunden:

int datum(int t, int m, int j) {

int s;
int TM[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },
{ 31,29,31,30,31,30,31,31,30,31,30,31 } };

if ((j % 100 != 0 && j % 4 == 0) || j % 400 == 0)
s = 1;
else
s = 0;

if (((m>0) && (m<13) && (s == 0) && (TM[0][m - 1] >= t) && (t > 0)) || (((m>0) && (m<13) && (s == 1) && (TM[1][m - 1] >= t) && (t > 0))))
return 1;
else return 0;

}

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten