Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Problem mit Zellerscher Algorithmus


The_Tremendous - So 19.06.05 17:51
Titel: Problem mit Zellerscher Algorithmus
Der Algorithmus an sich funktioniert eigentlich richtig.
Nur bei einem Datum nach dem 28.02 eines Jahres rechnet er immer 2 Tage drauf, also ob der Februar 30 Tage hätte. Kann mir einer erklären, wo der Fehler liegt??


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
procedure WochentagBestimmen;
var day, month, century, year, ergebnis : Integer;
    datum, ausgabe : String;
begin
  clrscr;
  write('Bitte geben sie das gewuenschte Datum ein: '); readln(datum);

  // Auslesen des Wochentages, des Monats, des Jahrhunderts und des Jahres aus dem vorgegebenem Datum
  day :=  StrToInt(copy(Datum,1,2));
  month := StrToInt(copy(Datum,4,2));
  century := StrToInt(copy(Datum,7,2));
  year := StrToInt(copy(Datum,9,2));

  // Anpassung der Monate, da laut Zellerschem Algorithmus die Monate Januar und Februar zum Vorjahr gehören
  if month < 3 then begin
    Dec(year);
    month := Succ((month + 9mod 12);
  end;

  // Zellerscher Algorithmus
  ergebnis := (day +((13*month-1)div 5) + year + (year div 4) + (century div 4)
                -2*century) mod 7;

  // Erhöhen des Ergebnisses um 7 Tage, wenn ergebnis negativ ist
  if ergebnis < 0 then begin
    Inc(ergebnis, 7);
  end;

  // Belegung der Tage zu dem jeweiligen Ergebnis
  case ergebnis of
      0:  ausgabe := 'Sonntag';
      1:  ausgabe := 'Montag';
      2:  ausgabe := 'Dienstag';
      3:  ausgabe := 'Mittwoch';
      4:  ausgabe := 'Donnerstag';
      5:  ausgabe := 'Freitag';
      6:  ausgabe := 'Samstag';
   end;

  write('Das Datum ' +Datum+ ' liegt auf einem ' + ausgabe);  readln;
end;



Moderiert von user profile iconChristian S.: Topic aus Sonstiges verschoben am So 19.06.2005 um 17:55


F34r0fTh3D4rk - So 19.06.05 18:02

mach doch ne abfrage, wenn der monat blablabla dann - 2 :?


The_Tremendous - So 19.06.05 18:16

das bringt aber nichts, da zum beispiel der 31.12.04 nur um einen tag verschoben ist, wegen schlatjahr.

Ausserdem ist es ja nicht sinn der sache, solange um fehler rumzuprogramieren, bis es geht. wenn es schon nen algorithmus für gibt, sollte der auch gehen.


Das lustige ist, dass es in einem delphiprogramm, dass ich auch geschrieben hat mit der gleichen prozedur keinen Fehler gibt