Autor Beitrag
MisterAb
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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:


ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:
ausblenden Quelltext
1:
zw := 2.6*M - 0.2;					


Gruß
Klabautermann
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: Mi 20.11.02 11:53 
Hi, versuch mal folgenden Code: (funtzt bei mir einwandfrei)

ausblenden volle Höhe 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:

_________________
Viele Grüße
Jakob
DataCool
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 112



BeitragVerfasst: Mi 20.11.02 11:55 
Du mußt bei Kommazahlen nicht 0,2 schreiben sondern 0.2

_________________
DataCool
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:
ausblenden Quelltext
1:
w := Trunc(2.6 * M - 0.2) + Trunc(C / 4) - 2 * C + J + Trunc(J / 4) + T					


Gruß
Klabautermann
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: 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.

_________________
Viele Grüße
Jakob
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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:
ausblenden 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:

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Fr 22.11.02 11:07 
Hi
hier ist mal meine Implementation der Gausschen WT Formel.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...