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:

Quelltext
1:
zw := 2.6*M - 0.2;                    


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