Abfrage Schaltjahr mit C++

Gast #487228
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?
Gast #487299
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]
#487308
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 ) {
  }
Gast #487462
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.