mikrocontroller.net

Forum: PC-Programmierung Abfrage Schaltjahr mit C++


Autor: BerndS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 ) {
  }

Autor: BerndS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.