Fragen zu einer Übungsaufgabe



  • Hallo zusammen,

    es geht um folgende Übungsaufgabe:

    Die Funktion tageBisNeujahr() soll die Anzahl der Tage vom 1.1.2000 bis zum 1. Januar des übergebenen Jahrs berechnen und zurückgeben. Begründen Sie, wieso die folgende Version der Funktion tageBisNeujahr() korrekt ist:

    int tageBisNeujahr(int jahr)
    {
    int tage = 365*(jahr-2000);

    if(jahr <= 2000)
    return 0;

    tage = 365*(jahr-2000);

    tage += (jahr-2001)/4+1; 😕
    tage -= (jahr-2001)/100; 😕
    tage += (jahr-2001)/400; 😕

    return tage;
    }

    Ende des Programms!

    Hier ist die Erklärung der Musterlösung, welche für mich nicht wirklich verständlich ist, was den unteren Teil mit den Zuweisungen betrifft, also der folgende Part:

    tage += (jahr-2001)/4+1;
    tage -= (jahr-2001)/100;
    tage += (jahr-2001)/400;

    Hier verstehe ich nicht, was gemacht wird.

    In der Musterlösung steht Folgendes:

    Gäbe es keine Schaltjahre, dann wäre die Anweisung:

    tage = 365*(jahr-2000);

    ausreichend. Gäbe es alle 4 Jahre ein Schaltjahr, dann müsste zum ersten Mal,
    wenn ein Jahr den Wert 2005 hat, ein Schaltjahr berücksichtigt werden. Entsprechend müsste dann 2009 das zweite Schaltjahr und 2013 das dritte berücksichtigt werden.
    Genau dies wird mit folgender Anweisung erreicht, in der die ganzzahlige Division eine wichtige Rolle spielt:

    tage += (jahr-2001)/4+1; 😕

    Diese Anweisung hätte auch alternativ als:

    tage = tage + (jahr-2001)/4+1;

    geschrieben werden können.

    Für Eingaben nach dem Jahr 2100 machen wir dabei einen Fehler, da 2100 kein Schaltjahr ist. Dies wird korrigiert durch:

    tage -= (jahr-2001)/100; 😕

    Da Jahre, die durch 400 teilbar sind, Schaltjahre sind, brauchen wir eine letzte Korrektur:

    tage += (jahr-2001)/400; 😕

    Wird ein anderes Referenzjahr gewählt, müssen allerdings alle Korrekturtherme angepasst werden.

    Es wäre super, wenn mir jemand erläutern könnte, was bei den unteren Zuweisungen gemacht wird und was passiert, wenn ich zum Beispiel das Jahr 2005 eingeben würde. 🙂

    Generell gilt eigentlich beim Schaltjahr die Bedingung

    (jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0

    welche wahr ist, wenn das Jahr ein Schaltjahr ist.

    Danke im Voraus für eure Unterstützung. 😉





  • Ben_Ni schrieb:

    ...
    Diese Anweisung hätte auch alternativ als:

    tage = tage + (jahr-2001)/4+1;

    geschrieben werden können

    ...

    Es wäre super, wenn mir jemand erläutern könnte, was bei den unteren Zuweisungen gemacht wird und was passiert, wenn ich zum Beispiel das Jahr 2005 eingeben würde.

    ...

    Das ist doch eigentlich eine einfache Rechnung. Du bist doch in der Lage, die obige Anweisung für das Jahr 2005 mal im Kopf durchzurechnen?
    Falls nicht, einfach mal

    printf(%d, (2005-2001)/4+1);
    

    ausführen lassen und sehen, was rauskommt - dann nachdenken, wenn Du dann noch nicht drauf kommst, noch mal nachfragen.



  • ...[/quote]
    Das ist doch eigentlich eine einfache Rechnung. Du bist doch in der Lage, die obige Anweisung für das Jahr 2005 mal im Kopf durchzurechnen?
    Falls nicht, einfach mal

    printf(%d, (2005-2001)/4+1);
    

    ausführen lassen und sehen, was rauskommt - dann nachdenken, wenn Du dann noch nicht drauf kommst, noch mal nachfragen.[/quote]

    Also ich habe ja das Ergebnis von 2 raus bekommen, aber es müsste doch eigentlich bei einem Schaltjahr nur 1 Tag hinzugezählt werden durch den 29. Februar, oder nicht? Deshalb verstehe ich das nicht so ganz. 😞



  • Oder weil das von 2000 dann auch noch dazu gezählt wird, dann würde es wieder passen mit den 2 Tagen.



  • Ben_Ni schrieb:

    Oder weil das von 2000 dann auch noch dazu gezählt wird, dann würde es wieder passen mit den 2 Tagen.

    Jo!


Log in to reply