M. Pester - LV im SS 2017

Berechnung des Wochentags


Das Datum sei gegeben durch:     d, j     1 ≤ d ≤ 366. Dann berechnet sich der Wochentag

w ∈ {0,1,2,3,4,5,6}
=
 
{So,Mo,Di,Mi,Do,Fr,Sa}
nach folgender Formel:
w = (
(
(
d+105+
|
5* j-1-[ (j-1)/ 100 ]*100
4

|
+
|
j-1
400

|
-2
|
j-1
100

|
)
)
)
mod 7

Beachte:

  • Mit [ x ] wird der ganze Anteil der Zahl x bezeichnet.
  • Das Ergebnis der Division zweier ganzer Zahlen (INTEGER) ist immer ganzzahlig.
  • In Fortran wird der Divisionsrest r = k mod 7 durch die Standardfunktion r = MOD(k,7) berechnet.
  • Komplizierte Ausdrücke lassen sich durch Hilfsvariable für Zwischenergebnisse übersichtlicher formulieren.
  • Kontrolle des Ergebnisses: man vergleiche mit der Ausgabe, die das Unix-Kommando
      cal [-j] <monat> <jahr>  
    liefert, wobei mit -j der laufende Tag im Jahr angezeigt wird, sonst der laufende Tag im Monat
    (oder ein anderer Kalender).

Teil- bzw. Zusatzaufgaben:

  • Datumsangabe Tag,Monat umrechnen in laufenden Tag d des Jahres, z.B. als Funktionsunterprogramm:
          INTEGER FUNCTION lfdtag(tag,mon,jahr)
          INTEGER tag,mon,jahr, ...
          ...
          lfdtag = ...
          return
          END
    Schaltjahre beachten: (durch 4 teilbar) und [(nicht durch 100 teilbar) oder (durch 400 teilbar)]
  • Man überprüfe mit Hilfe dieses Programms die "Theorie" von Prof. Lanckau (Pressemeldungen vom 11.2.98): "Freitag, der 13." ist kein außergewöhnlicher Tag.
    Stellen Sie fest, wie oft in mehreren aufeinanderfolgenden Jahren der jeweils 13. Tag der Monate auf die einzelnen Wochentage fällt. Ausgabe als Tabelle,
      Jahr   Anzahl_So  Anzahl_Mo  ...  Anzahl_Fr  Anzahl_Sa 
    darunter die Summe über alle Jahre,
    oder auch akkumulierend, d.h. Anzahl nach 1, 2, 3, ... Jahren in die Tabelle schreiben,
    oder vereinfacht: nur die Freitage zählen und Prozentsatz ausrechnen.
    Hinweis: Zahlen, die in einer Zeile stehen sollen, müssen mit einer write-Anweisung ausgegeben werden,
    z.B. ein Feld INTEGER anzahl(7) oder anzahl(0:6) vereinbaren (pro Wochentag eine Zählgröße anzahl(w)) und das ganze Feld mit einer Anweisung ausgeben:
          write (*,*) jahr, anzahl
    
    bzw. mit vorgegebener Formatierung der Zahlen:
          write (*,'(I5,7I4)') jahr, anzahl
    
  • Durch geringe Änderungen am Programm kann man feststellen, ob es über viele Jahre hinweg einen Kalendermonat gibt, in dem "Freitag, der 13." bevorzugt auftritt.

File translated from TEX by TTH, version 1.95.