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?
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]
> 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 ) {
}
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.