Entwickler-Ecke
Sonstiges (Delphi) - Wochentag
MisterAb - Mi 20.11.02 11:22
Titel: Wochentag
Hallo ich brauche dringends eure Hilfe!
In der Schule müssen wir ein Programm schreiben, das per Gauss-Formel den Wochentag eines bestimmten Datums anzeigt...
Die Formel lautet:
w = [2,6*M - 0,2] + [C/4] - 2*C + J + [J/4] + T
T = Tag
M = Monat
C = Jahrhundert
J = Jahr
Die eckigen Klammern sind Gauss-Klammern, d.h. es ist nur das Ergebnis vor dem Komma relevant...
SO : Ich habe 4 Edits in die man dann Tag, Monat.. etc eingibt, und dann natürlich ein Label...
wenn man auf den Button drückt , soll folgende Procedure gestartet werden:
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: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| procedure TForm1.BitBtn1Click(Sender: TObject); var T,M,C,J,Wo,zw,w : integer; z: real; begin
T := StrToInt (Edit1.Text); M := StrToInt (Edit2.Text); C := StrToInt (Edit3.Text); J := StrToInt (Edit4.Text);
if M < 3 //bei Gauss-Formel Januar = 11.Monat, Februar = 12.Monat then begin if M = 1 then begin M := 11; J := J-1; end else begin M := 12; J:= J-1; end end else M := M-2;
zw := 2,6*M - 0,2; //real in integer zw := trunc (z);
w := z + C Div 4 - 2*C + J + J div 4 + T; // Gauss-Fomel
Wo := w Mod 7; //Ergebnis durch 7
Wo := StrToInt (E_Wochentag.Text);
case Wo of //je nach Rest Wochentag 0 : L_Wochentag.Caption := 'Sonntag'; 1 : L_Wochentag.Caption := 'Montag'; 2 : L_Wochentag.Caption := 'Dienstag'; 3 : L_Wochentag.Caption := 'Mittwoch'; 4 : L_Wochentag.Caption := 'Donnerstag'; 5 : L_Wochentag.Caption := 'Freitag'; 6 : L_Wochentag.Caption := 'Samstag'; end; end;
end. |
So läuft das etwa ab.... Doch da kommen ein Haufen Fehler: z.B.
bei : zw := 2,6*M - 0,2; steht: 'END 'erwartet aber ',' gefunden...
bei : case Wo of steht: ';' erwartet, aber 'case' gefunden;
was ist falsch? Hoffentlich könnt ihr mir helfen...
Gruß Mister[/code]
Klabautermann - Mi 20.11.02 11:45
Titel: Re: Wochentag
Hallo,
| MisterAb hat folgendes geschrieben: |
| bei : zw := 2,6*M - 0,2; steht: 'END 'erwartet aber ',' gefunden... |
Programiersprachen orientieren sich für gewöhnlich an US Standarts was die notationen angeht. Und die Ammis verwenden einen Punkt als Dezimaltrenner. Die Zeile muss also so aussehen:
Gruß
Klabautermann
Udontknow - Mi 20.11.02 11:45
Du solltest anders einrücken, dann siehst du solche Fehler leichter. Auch solltet du if (x) then nicht auseinanderziehen. Begin-Anweisungen werden nicht eingerückt. Keine weiteren Befehle nach begin in dieser Zeile.
Ausserdem hast noch ein paar andere Fehler gemacht, aber siehe selbst.
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: 42: 43: 44: 45: 46: 47: 48:
| procedure TForm1.BitBtn1Click(Sender: TObject); var T,M,C,J,Wo,zw,w : integer; z: real; begin T := StrToInt (Edit1.Text); M := StrToInt (Edit2.Text); C := StrToInt (Edit3.Text); J := StrToInt (Edit4.Text);
//bei Gauss-Formel Januar = 11.Monat, Februar = 12.Monat if M < 3 then begin if M = 1 then begin M := 11; J := J-1; end else begin M := 12; J:= J-1; end end else M := M-2;
//real in integer z := 2.6*M - 0.2; //<- korrigiert : z Wert zugewiesen "," durch "." ersetzt zw := trunc (z);
// Gauss-Fomel w := zw + C Div 4 - 2*C + J + J div 4 + T; //korrigiert: zw
Wo := w Mod 7; //Ergebnis durch 7
//Wo := StrToInt (E_Wochentag.Text); <- Was soll das?
case Wo of //je nach Rest Wochentag 0 : L_Wochentag.Caption := 'Sonntag'; 1 : L_Wochentag.Caption := 'Montag'; 2 : L_Wochentag.Caption := 'Dienstag'; 3 : L_Wochentag.Caption := 'Mittwoch'; 4 : L_Wochentag.Caption := 'Donnerstag'; 5 : L_Wochentag.Caption := 'Freitag'; 6 : L_Wochentag.Caption := 'Samstag'; end;
end; |
Ich habe nur syntaktische Fehler behoben, ob der Algo nun funzt, weiss ich nicht...
Cu, :)
Udontknow
DeCodeGuru - Mi 20.11.02 11:53
Hi, versuch mal folgenden Code: (funtzt bei mir einwandfrei)
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: 42:
| procedure TForm1.Button1Click(Sender: TObject); var w,t,m,c,j: Integer; tmp: real; begin t := StrToInt(Edit1.Text); m := StrToInt(Edit2.Text); c := StrToInt(Edit3.Text); j := StrToInt(Edit4.Text);
if m < 3 then begin if m = 1 then begin m := 11; j := j - 1; end else begin m := 12; j := j - 1; end end else begin m := m-2; end;
tmp := ((2.6 * m) -0.2) + (c / 4) - (2 * c) + j + (j / 4) + t;
w := round(tmp) mod 7;
case w of 0 : Label1.caption := 'Sonntag'; 1 : Label1.Caption := 'Montag'; 2 : Label1.Caption := 'Dienstag'; 3 : Label1.Caption := 'Mittwoch'; 4 : Label1.Caption := 'Donnerstag'; 5 : Label1.Caption := 'Freitag'; 6 : Label1.Caption := 'Samstag'; end; end; |
Der Code funtzt bei mir einwandfrei. Beim Test habe ich 20; 11; 21; 2002 eingegeben und das Ergebnis was Mittwoch und das stimmt meiner Meinung nach :wink:
DataCool - Mi 20.11.02 11:55
Du mußt bei Kommazahlen nicht 0,2 schreiben sondern 0.2
DeCodeGuru - Mi 20.11.02 14:25
ich habe grade meinen Code nochmal getestet und im Februar sind Fehler aufgetreten. Bei anderen Monaten habe ich das noch nicht getestet :? Allerdings hat der andere Code bei mir auch nit gefuntzt. Der hat aufs heutige Datum Dienstag ausgespuckt. :?
Klabautermann - Mi 20.11.02 14:43
Hallo,
| DeCodeGuru hat folgendes geschrieben: |
| Allerdings hat der andere Code bei mir auch nit gefuntzt. Der hat aufs heutige Datum Dienstag ausgespuckt. :? |
wahrscheinlich liegt das an den Eckigen-Klammern [] die du in deinem ersten Posting erwähnt hast. Wenn ich das richtig verstanden habe werden dort die Nachkommastellen abschneiden. In Delphi ist dafür die Funktion Trunc zuständig, aus
w = [2,6*M - 0,2] + [C/4] - 2*C + J + [J/4] + T wird also:
Quelltext
1:
| w := Trunc(2.6 * M - 0.2) + Trunc(C / 4) - 2 * C + J + Trunc(J / 4) + T |
Gruß
Klabautermann
DeCodeGuru - Mi 20.11.02 16:47
jop, das habe ich ca. 10 Minuten nach meinem Posting auch gemerkt. :wink: Habs aber noch nit ausprobiert. Versuchs später aber mal.
Wolff68 - Do 21.11.02 18:47
Mal 'ne Anmerkung zu den ganzen Ifs, die Du da drin hast um Januar und Februar ans Ende zu stellen. Das hier sollte das gleiche bewirken:
Quelltext
1: 2: 3: 4: 5:
| IF m < 3 then begin m := m+10; Dec(j); end else m := m-2; |
Übrigends liefert mir das
w := Trunc(2.6 * m - 0.2) + Trunc(c / 4) - 2 * c + j + Trunc(j / 4) + t; bei den ersten Tagen im Monat negative Werte!
Mit dem hier klappst besser, stimmt aber auch nicht immer.
w := (Trunc(2.6 * m - 0.2) + Trunc(c / 4) - 2 * c + j + Trunc(j / 4) + t + 14) mod 7;
Ich hab das mal mit den Ergebnissen von DayOfWeek() verglichen....
Haut nicht immer hin der Alghi. :cry:
LCS - Fr 22.11.02 11:07
Hi
hier ist mal meine Implementation der Gausschen WT Formel.
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:
| function Wochentag (day, month, year: integer) : string; var ct, yr, dw, dow: integer; begin if month < 3 then begin month := month + 10; year := year -1 end else month := month - 2;
ct := year div 100; yr := year mod 100; dw := (((26*month - 2) div 10)+day+yr+(yr div 4)+ (ct div 4) - (2*ct)) mod 7; if dw < 0 then dow := dw + 7 else dow := dw; case dow of 0: result := 'Sonntag'; 1: Result := 'Montag'; 2: Result := 'Dienstag'; 3: Result := 'Mittwoch'; 4: Result := 'Donnerstag'; 5: Result := 'Freitag'; 6: Result := 'Samstag'; end; end; |
Hat bis jetzt immer funktioniert.
Gruss Lothar
Wolff68 - Fr 22.11.02 19:27
Yeah !
Dein Alghi funzt besser :)
Hab ihn eben mal in einem Testprogramm 1000x mit Zufallswerten getestet.
Er bekommt immer den gleichen Tag wie DayOfWeek().
Danke!
Noch eine frage hierzu:
Quelltext
1: 2: 3: 4:
| if dw < 0 then dow := dw + 7 else dow := dw; |
Warum nicht einfach
IF dw < 0 then dw := dw + 7;
LCS - So 24.11.02 14:19
Warum?? Die Zeilen hab ich vor ungefähr 15 Jahren zum ersten Mal in Cobol geschrieben. Da war mein Programmierstiel auch noch ein bissel anders. Und seitdem hab ich das einfach immer von einer Sprache in die andere Übersetzt. :roll: Wenn ich mal viel, viel Zeit habe (also eigentlich nie :mrgreen:) werd ich da mal Ordnung schaffen.
Gruss Lothar
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!