Zurück zum Inhaltsverzeichnis - Lösungen und Tipps


Erstellen eines immerwährenden Kalenders

- [F.Seck | F.Seck]

Das folgende #KOPIERE-Programm 'kalender.tf' erstellt einen Kalender zu einem beliebigen Jahr n. Chr.
Für ein Datum vor dem 15. Oktober 1582 wird der Julianische, danach der Gregorianische Kalender zugrunde gelegt. Wird beim Aufruf zusätzlich ALT angegeben, wird der Kalender auch für ein Jahr nach 1582 nach dem Julianischen Kalender erstellt.
Ein TUSCRIPT-Skript zur Erstellung eines immerwährenden Kalenders (zusätzlich mit der Angabe der Sonntagsnamen) finden Sie hier.

Programm-Datei:

kalender.tf [20 KB]


Aufruf:

Gib Kommando >T,kalender.tf,,jahreszahl         führt untenstehendes (KOPIERE-)Programm aus. Das Ergebnis
                                                wird mit #*satz aufbereitet.

oder:

Gib Kommando >T,kalender.tf,,jahreszahl'ALT     (z.B.: #t,programm,,1650'alt für das Jahr 1650 nach
                                                Julianischem Kalender)


Ergebnis bei Angabe 2013 (Ausschnitt):
Kalender_Ausschnitt.jpg

Programm:

#fe,ein
#da,tmp*jahr'tmp*kalender,fr=-
#ko,tmp*jahr,tmp*kalender,+,+,*
par       {}

          Erstes Kopiere: Prüfen, ob Aufruf korrekt
r         goto 12
           0  w  n  j  2  3
spr   1    8  8 21 13 11  9  Jahr nach #T,, angegeben?
spr   2    8  8  9 23  9  9  Fehler: negatives Jahr angegeben
t     1   |?1|
zf+   1   |?{#1}|
mld   1   |@@@@@@@@ Kein Jahr angegeben! Aufruf des Kalenderprogramms:|
mld   1   |@@@@@@@@ #$T,KALENDER,,jahr|
mld   1   |@@@@@@@@ oder, für julianischen Kalender (alten Stil) nach 1581:|
mld   1   |@@@@@@@@ #$T,KALENDER,,jahr,ALT|
ta+   2   |-|
mld   2   |@@@@@@@@ Kalenderfunktion nur für Jahre n.Chr. programmiert!|
*eof
#ko,tmp*jahr,tmp*kalender,+,+,*
par       {}
r         i99 = ?1; h1 = 1; h2 = 2; h3 = 3; goto 11
           0  w  n  j  2  3  4
spr   1    8  8  8  8 14  8 21 Angaben beim Aufruf in den Text übernehmen
spr   2    8  8 32 22 32  8    alter Stil verlangt?
spr   3    8  8  8  8 33 40    Kolumnentitel bilden und ausgeben
spr   4   42  8  8  8 102 8    Tagesnummern der Festtage berechnen
spr   5   52  8  8  8 72 50    Jahr Tag für Tag durchgehen
spr   6    8  8  8  8 72  8    Wochentag, Tagesdatum (Sonn- und Feiertage)
spr   7    8  8  8  8 53  8    Feiertag? dann weiter, sonst gleich ausgeben
spr   8    8  8  8  8 91  8    Feiertagsnamen einsetzen
spr   9    8  8 53 92 53  8    unechte Feiertage nicht rot
spr  10    8  8  8  8 53  8    Monatswechsel
els       2000
t     1   |?1 ?2|
zf+   2   |alt|
rr    2   h1 = -1; h2 = -2; h3 = -3; if (i99.gt.1581) i98 = 1
          Kolumnentitel:
t     3   :<kolein/><kl><center/>Kalender für das Jahr 0 0</kl>:
eiv   3   i99 i98
xx    3   ~ 0</kl>~</kl>~ 1</kl>~ (alter Stil)</kl>~
          Absolutes Anfangs- (i8) und Enddatum (i9) für das eingelesene Jahr:
rr    4   h0 = id (1,1,i99,i8,h1);
rr    4   h0 = id (31,12,i99,i9,h1);
          1. Januar:
rr    4   i20 = i8;
          6. Januar (Epiphanie):
rr    4   i21 = i8+5;
          Osterdatum:
rr    4   h0 = id (i1,i2,i99,i3,h3);
          Aschermittwoch:
rr    4   i22 = i3 - 46;
          Karfreitag:
rr    4   i23 = i3 - 2;
          Ostersonntag, Ostermontag:
rr    4   i24 = i3; i25 = i3 + 1;
          Himmelfahrt:
rr    4   i26 = i3 + 39;
          Pfingstsonntag, Pfingstmontag:
rr    4   i27 = i3 + 49; i28 = i3 + 50;
          Fronleichnam:
rr    4   i29 = i3 + 60;
          1. Mai:
rr    4   h0 = id (1,5,i99,i30,h1);
          Allerheiligen:
rr    4   h0 = id (1,11,i99,i31,h1);
          Weihnachten:
rr    4   h5 = id (25,12,i99,i36,h1); i37 = i36+1;
          Adventssonntage:
rr    4   i35 = i36 - h5; i34 = i35 - 7; i33 = i35 - 14; i32 = i35 - 21;
          Jetzt das Jahr tageweise durchgehen;
          auf i12 den Monat merken, um Monatswechsel festzuhalten
rr    4   i2 = 1;
rr    5   i12 = i2;
          schon fertig (Jahresende erreicht)? Dann 9 = Programmende
rr    5   if (i8 .eq. i9) goto 9;
          nein: nächster Tag
rr    5   i8 = i8 + 1;
rr    5   i7 = id (i1,i2,i99,i8,h2);
          war es ein Monatswechsel?
rr    5   if (i2 .ne. i12) goto 102;
          war es ein Feiertag?
rr    5   i0 = 20;
rr    5   loop;
rr    5   if (i8 .eq. i(i0)) goto 62;
rr    5   i0 = i0 + 1;
rr    5   if (i0 .gt. 37) exit;
rr    5   endloop;

          war es ein Sonntag?
rr    5   if (i7 .eq. 7) goto 62;
          Text für Wochentag und Tagesdatum:
t     5   :<br/><u1>@t0 <ez2/>@@0 <right/></u1>:
eik   5   :@t:@@:
eiv   5   i7 i1

          Text für Sonn- und Feiertage, sonst wie zuvor:
t     6   :<br/><red><u1>@t0 <ez2/>@@0</red> <right/></u1>:
eik   6   :@t:@@:
eiv   6   i7 i1

          jetzt nur noch Feiertage, um Namen einzusetzen:
rr    7   if (i8 .eq. i(i0)) goto 82

          Position und Kennung zum Einsetzen der Festtagsnr. ergänzen:
ek1   8   |<right/>|
ak2   8 = ek1       8
erg   8   ||<ez4/>@f0|
eik   8   :@f:
eiv   8   i0

          "Unechte" Feiertage (Epiphanias, Aschermittwoch) nicht rot:
zf+   9   |@f21|@f22||@t7*|
xx    9   |<red>||</red>||

          Monatsüberschrift (größer und zentriert):
t    10   :<column/><h2><center/>m0 0</h2>:
ein  10   :<center/>:
eiv  10   i2 i99
rr   10   i8 = i8 - 1
          (dieses Datum muss ja noch einmal gerechnet werden)

xxx       ~<ez2/>{]}{\0} ~<ez2/>__~<ez2/>{\0}</red>~<ez2/>__{+7=}</red>~
xxx       ~<ez4/>{[}f0 ~~<ez4/>{[}@f8 ~Neujahr~
xx       ~@t1~Mo~@t2~Di~@t3~Mi~@t4~Do~
xxx       ~@t5~Fr~@t6~Sa~@t7~So~@@~~@f0~~
xxx       ~m1~Januar~m2~Februar~m3~März~m4~April~m5~Mai~
xxx       ~m6~Juni~m7~Juli~m8~August~m9~September~
xxx       ~m10~Oktober~m11~November~m12~Dezember~
xxx       ~@f20~Neujahr~
xxx       ~@f21~Epiphanias~
xxx       ~@f22~Aschermittwoch~
xxx       ~@f23~Karfreitag~
xxx       ~@f24~Ostersonntag~
xxx       ~@f25~Ostermontag~
xxx       ~@f26~Himmelfahrt~
xxx       ~@f27~Pfingstsonntag~
xxx       ~@f28~Pfingstmontag~
xxx       ~@f29~Fronleichnam~
xxx       ~@f30~Maifeiertag~
xxx       ~@f31~Allerheiligen~
xxx       ~@f32~1. Advent~
xxx       ~@f33~2. Advent~
xxx       ~@f34~3. Advent~
xxx       ~@f35~4. Advent~
xxx       ~@f36~1. Weihnachtstag~
xxx       ~@f37~2. Weihnachtstag~
*eof

#= Kalender steht jetzt in Datei tmp*kalender: jetzt noch 3-spaltig
   setzen und drucken

#*satz,tmp*kalender,s,a43spalt,opt=nospaus
#fe,aus


Erläuterungen zur Datumsfunktion ID des Kommandos #KOPIERE und zu den verwendeten Variablen:

Die Datumsfunktion id des Kommandos KOPIERE:
          id (tag,monat,jahr,nummer,modus)
                Tagesnummer: die Tage werden, beginnend mit dem 1.1.1 n.Chr., fortlaufend nummeriert (Argument nummer)
                modus=1 Berechnung der Tagesnummer aus dem Tagesdatum
                modus=2 Berechnung des Tagesdatums aus der Tagesnummer
                modus=3 Berechnung des Osterdatums
                Weiteres in der Beschreibung des Programms KOPIERE

Numerische Variablen:
          i0    Hilfsvariable für Feiertage, durchläuft in Schleifen die Werte 20-37 = Tagesnummern der Feste
          i1    Tagesdatum des Ostersonntags
          i2    Monatsnummer des Ostersonntags; dann: aktuelle Monatsnummer
          i3    Tagesnummer des Ostersonntags
          i7    Wochentagsnummer (1=Mo, 2=Di usw.; vgl. h0)
          i8    Tagesnummer des 1. Januar
          i9    Tagesnummer des 31. Dezember
          i12   Merkvariable für die Monatsnummer
          i20   Tagesnummer des 1. Januar
          i21   Tagesnummer des 6. Januar
          i22   Tagesnummer des Aschermittwochs
          i23   Tagesnummer des Karfreitags
          i24   Tagesnummer des Ostersonntags
          i25   Tagesnummer des Ostermontags
          i26   Tagesnummer des Himmelfahrtstages
          i27   Tagesnummer des Pfingstsonntags
          i28   Tagesnummer des Pfingstmontags
          i29   Tagesnummer des Fronleichnamtages
          i30   Tagesnummer des 1. Mai
          i31   Tagesnummer des 1. November (Allerheiligen)
          i32-35 Tagesnummer des 1. bis 4. Advent
          i36   Tagesnummer des 1. Weihnachtstages
          i37   Tagesnummer des 2. Weihnachtstages
          i99   Die in die Datei 'jahr' eingetragene Jahreszahl
          h0    Hilfvariable für Wochentag, wenn nicht ausgewertet (vgl. i7)
          h5    Wochentag des 1. Weihnachtstages

Zurück zum Inhaltsverzeichnis - Lösungen und Tipps