Zurück zum Inhaltsverzeichnis - Lösungen und Tipps
- [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):
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