    sofia (Thinice) | Mittwoch, den 29. Mai, 2002 - 00:37  ihr guten leute, bitte helft mir möglichst schnell bei folgendem: ich soll in turbo pascal einen ewigen kalender erstellen, der nach manueller eingabe von tag, monat und jahr (abfrage) den entsprechenden wochentag ausgibt. mit einbezogen soll natürlich das kriterium der schaltjahre werden. (dort rücken die wochentage entsprechend auf.) zu diesem zweck soll ich in der programmstruktur folgende allgemeingültige regel einbauen: ein jahr ist ein schaltjahr, wenn es sich durch vier teilen lässt. ausnahme: ein jahr ist kein schaltjahr, wenn es sich zusätzlich zwar noch durch 100, aber NICHT durch 400 teilen lässt. bsp.: das jahr 2000 ist ein schaltjahr. die variablen 'trunc' , 'fraq' , und 'inc' sollten -wenn möglich- benutzt werden. bitte helft mir und schreibt mir die struktur, denn ich hab leider keine ahnung. ganz ganz lieb wäre es, wenn ihr noch ein klein wenig dazu erläutern könntet. vielen dank schon mal im voraus! sofia |
    J | Donnerstag, den 30. Mai, 2002 - 11:31  Hi sofia, zunächst eine vorbemerkung: Einsolches programm, wie du es skizziert hast, wird nur für Daten korrekt arbeiten, die nach der gregorianischen kalenderreform liegen. Bei dieser Reform wurdden 10 tage gestrichen: Auf Donnerstag, den 4. Oktober 1582 folgte Freitag, der 15. Oktober 1582. Vor diesem Datum war die Schaltjahresregelung anders. Wenn du noch weiter zurückrechnen willst, musst du ausserdem beachten, das es das jahr 0 nicht gegeben hat. auf das jahr -1 (1 vChr) folgt direkt das Jahr 1 (1 nach Chr). Eine mögliche Struktur für ein Programm, dass für alle Tage ab dem 15.10.1582 den Wochentag angibt, könnte so aussehen: Zuerst eine boolsche Funktion IstSchaltjahr FUNCTION IstSchaltjahr(jahr:intger):BOOLEAN; BEGIN IF (jahr MOD 400) = 0 THEN IstSchaltjahr := TRUE ELSE IF (jahr MOD 100) = 0 THEN IstSchaltjahr := FALSE ELSE IF (jahr MOD 4) = 0 THEN IstSchaltjahr := TRUE ELSE IstSchaltjahr := FALSE; END; Als nächstes bestimmst du die Anzahl der Tage seit dem 15.10.1582(dieser Tag war ein Freitag) Für die Daten vom 15.10.1582 bis zum 31.12.1582 ist eine Soderbehandlung sinnvoll (oder du lässt erst Daten ab dem 1.1.1583 zu) Zunächst addierst du die Tage aus den ganz abgelaufenen Jahren seit 1583 Beispiel: Das Datum sei der 18.1.2004 folgender Programmausschnitt: AnzahlTage := 77 {restl Tage in 1582} For i:= 1583 TO jahr-1 do if IstSchaltjahr(i) THEN AnzahlTage := AnzahlTage +366 ELSE AnzahlTage := AnzahlTage * 365; Zu dieser Zahl addierst du die Tage der abgelaufenen Monate im Jahr, aus dem das Datum stammt. Du addierst 31, falls das Datum im Februar liegt, 31+23, falls das Datum im März liegt, 31+28+31 falls das Datum im April liegt usw. Falls das Jahr selbst ein Schaltjahr ist, musst du statt 28 die Zahl 29 nehmen (Fallunterscheidung!) Dazu kommen noch die Tage des laufenden Monats Wenn du die Tage seit dem 15.10.1582 bestimmt hast, dann bestimmst du als letztes AnzahlTage MOD 7 Wenn dieser Wert 0 ist, so ist der tag ein Freitag, bei 1 ein Samstag usw... bis .bei 6 ein Donnerstag. Hinweis: da die Anzahl der Tage in der Regel größer als 2^15 ist, musst du als Datentyp LONGINT verwenden. Gruß J |