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.