Forum: PC-Programmierung Abfrage Schaltjahr mit C++


von BerndS (Gast)


Lesenswert?

Hallo zusammen,

ich möchte die Anzahl an Tagen, die zwischen zwei Daten liegen mit C++ 
berechnen.

Die Bedingungs für ein Schaltjahr lautet:

Ist die Jahrezahl durch 4 (aber nicht durch 100) oder 400 ohne Rest 
teilbar, so liegt ein Schaltjahr vor.

Ich wollte die Abfrage so gestalten:

if (((ein_datum.jahr)%4) && !((ein_datum.jahr)%100) || 
((ein_datum.jahr)%400)))
{
 summe_tage += 29;
}
else
{
 summe_tage += 28;
}

Kommt das so hin, oder habe ich etwas übersehen?

von Werner B. (Gast)


Lesenswert?

Nach Kernighan Ritchie, Kapitel 2.5. hast du nix übersehen. Aber ...

Ausschnitt aus http://home.nordwest.net/hgm/kalender/kal-6.htm (leider 
nicht mehr verfügbar).
[Zitat]
Ein besonderes Problem liegt aber im Jahr 1582 vor, weil in diesem die 
10 Tage zwischen dem 4. und 15. Oktober ausgefallen sind. Um dieses Jahr 
auch korrekt abbilden zu können, muss eine entsprechende Ausnahme 
gebildet werden. Eine analoge Verfahrensweise wie im Februar ist nicht 
möglich, da dann Datum ab dem 21. Oktober nicht mehr zulässig sind. Man 
zieht am besten am Ende der Prozedur zehn Tage ab, wenn die Tagesanzahl 
größer als 287 (4. Oktober 1582) ist. Bei der Rückrechnung eines Datums 
aus der Tageszahl muss dann entsprechend aufgepaßt werden.
[/Zitat]

von Karl H. (kbuchegg)


Lesenswert?

> Kommt das so hin, oder habe ich etwas übersehen?

Ja.
Du hast übersehen, dass in C ein arithmetischer Ausdruck
als TRUE gewertet wird, wenn er ungleich 0 ist.

if( jahre%4 ) {
   irgendwas
}

irgendwas wird also genau dann ausgeführt, wenn jahre%4
ungleich 0 ist. Das heist in allen Jahren, die nicht
ein Vielfaches von 4 sind.

Wenn du nicht sicher bist, dann schreib die Vergleiche
explizit aus. So gibt es keine Missverständnisse:

  if( jahre % 4 == 0 ) {
  }

von BerndS (Gast)


Lesenswert?

Stimmt, beides, die Kalender-Zeitrechnung beginnt erst ab 1582. 
Eigentlich müsste da noch so eine Abfrage rein. Über das Zitat muss ich 
noch mal nachdenken. Das ist mir noch nicht ganz klar.

Karl, du hast recht: Es muss so, nur genau umgekehrt sein.

Der Modulo operator liefert als Ergebnis "Null" oder einen Wert ungleich 
Null (eben den Restwert aus dem Bruch), der if-Ausdruck muss aber 
ungleich Null sein. Die Ausdrücke mussen demnach alle negiert werden, 
also so:

if (!(ein_datum.jahr%4) && (ein_datum.jahr%100) || 
!(ein_datum.jahr%400))
{
 summe_tage += 29;
}
else
{
 summe_tage += 28;
}

Das funktioniert jetzt. Ich kann das Programm ja morgen mal einstellen.

BerndS

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.