| Autor |
Beitrag |
MisterAb
Hält's aus hier
Beiträge: 5
|
Verfasst: Mi 20.11.02 11:22
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:
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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 20.11.02 11:45
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:
Quelltext
Gruß
Klabautermann
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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.
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
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Mi 20.11.02 11:53
Hi, versuch mal folgenden Code: (funtzt bei mir einwandfrei)
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 
_________________ Viele Grüße
Jakob
|
|
DataCool
      
Beiträge: 112
|
Verfasst: Mi 20.11.02 11:55
Du mußt bei Kommazahlen nicht 0,2 schreiben sondern 0.2
_________________ DataCool
|
|
DeCodeGuru
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: 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. 
_________________ Viele Grüße
Jakob
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Mi 20.11.02 16:47
jop, das habe ich ca. 10 Minuten nach meinem Posting auch gemerkt.  Habs aber noch nit ausprobiert. Versuchs später aber mal.
_________________ Viele Grüße
Jakob
|
|
Wolff68
      
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: 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. 
_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: 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
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
Wolff68
      
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: 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;
_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: 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.  Wenn ich mal viel, viel Zeit habe (also eigentlich nie  ) werd ich da mal Ordnung schaffen.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|