----
[[tustep:loesungen:start|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 [[tuscript:loesungen:rechnen|hier]].\\ \\ **Programm-Datei:**
\\
\\ {{files_open:daten:kalender.tf|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):**\\ {{files_open:bilder:Kalender_Ausschnitt.jpg|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 :Kalender für das Jahr 0 0:
eiv 3 i99 i98
xx 3 ~ 0~~ 1~ (alter Stil)~
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 :
@t0 @@0 :
eik 5 :@t:@@:
eiv 5 i7 i1
Text für Sonn- und Feiertage, sonst wie zuvor:
t 6 :
@t0 @@0 :
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 ||
ak2 8 = ek1 8
erg 8 ||@f0|
eik 8 :@f:
eiv 8 i0
"Unechte" Feiertage (Epiphanias, Aschermittwoch) nicht rot:
zf+ 9 |@f21|@f22||@t7*|
xx 9 |||||
Monatsüberschrift (größer und zentriert):
t 10 :m0 0
:
ein 10 ::
eiv 10 i2 i99
rr 10 i8 = i8 - 1
(dieses Datum muss ja noch einmal gerechnet werden)
xxx ~{]}{\0} ~__~{\0}~__{+7=}~
xxx ~{[}f0 ~~{[}@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
----
[[tustep:loesungen:start|Zurück zum Inhaltsverzeichnis - Lösungen und Tipps]]