Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Was haut bei dieser Wochentagsberechnung nicht hin? (https://www.delphipraxis.net/198357-haut-bei-dieser-wochentagsberechnung-nicht-hin.html)

Ave 26. Okt 2018 18:42

Was haut bei dieser Wochentagsberechnung nicht hin?
 
Hey:hello:,
in der Schule haben wir ein Programm geschrieben, welches ausrechnen sollte, welcher Wochentag an dem angegebenen Datum war/ist/sein wird...
So wie das Programm ist, funktioniert es theoretisch, allerdings hat es irgendwo einen Fehler, welcher dazu führt, dass der Wochentag nicht dem entspricht, welcher er eigentlich sein sollte. Vielleicht findet Ihr ihn ja...
Schon mal, Danke im Voraus!

P.S. Wir arbeiten mit free Pascal, also Lazarus.

Quellcode:

Delphi-Quellcode:
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);

var a,b1,b2,b3,b4,d,d1,m,i:integer;
c:array [1..12] of integer;

begin
   For i:=1 to 12 do  c[i]:=0;  // Vorbelegen des Arrays mit 0
   c[1]:=31;                     // Januar
   c[2]:=c[1]+28;                // Februar
   c[3]:=c[2]+31;                // ...
   c[4]:=c[3]+30;
   c[5]:=c[4]+31;
   c[6]:=c[5]+30;
   c[7]:=c[6]+31;
   c[8]:=c[7]+31;
   c[9]:=c[8]+30;
   c[10]:=c[9]+31;
   c[11]:=c[10]+30;              // November


   a:=strtoint(edit1.Text);      // Wochentag des 01.01.
   b1:=5*((a-1) mod 4)+1;         // nach: Carl Friedrich Gauss
   b2:=4*((a-1) mod 100);
   b3:=6*((a-1) mod 400);
   b4:= (b1+b2+b3) mod 7;
                                   //  ShowMessage (inttostr(b4));
   case b4 of
   0: label3.caption:='Sonntag';
   1: label3.caption:='Montag';
   2: label3.caption:='Dienstag';
   3: label3.caption:='Mittwoch';
   4: label3.caption:='Donnerstag';
   5: label3.caption:='Freitag';
   6: label3.caption:='Samstag';
   end;

   d:=strtoint(edit2.Text); // Tag  // Berechnung der Tagesanzahl
   m:=strtoint(edit3.Text); // Monat

   case m of
   1: d1:=d;
   2: d1:=c[1]+d;
   3: d1:=c[2]+d;
   4: d1:=c[3]+d;
   5: d1:=c[4]+d;
   6: d1:=c[5]+d;
   7: d1:=c[6]+d;
   8: d1:=c[7]+d;
   9: d1:=c[8]+d;
   10: d1:=c[9]+d;
   11: d1:=c[10]+d;
   12: d1:=c[11]+d;
   end;
   ShowMessage (inttostr(d1));
   d1:=d1-1;                   // Minus ein Tag

   d1:= d1 mod 7;              //  Tag des Datums
   ShowMessage (inttostr(d1));
   If ((a mod 4) = 0) and ((a mod 100) = 0) and ((a mod 400) = 0)
        then d1:=d1+1 ;         // ? Schaltjahr


   case d1 of
   0: label6.caption:='Sonntag';
   1: label6.caption:='Montag';
   2: label6.caption:='Dienstag';
   3: label6.caption:='Mittwoch';
   4: label6.caption:='Donnerstag';
   5: label6.caption:='Freitag';
   6: label6.caption:='Samstag';
   end;

end;

end.

DieDolly 26. Okt 2018 18:51

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Hi,

1) Delphi-Tags lassen Code schöner aussehen
2) Code formatieren lässt den Code 2x schöner aussehen
3) Meiner Meinung nach ist der Code ver-kompliziert. Hat Lazurus sowas wie die DateUtils nicht?
Ja es geht irgendwo um den Lerneffekt. Aber der bleibt bei unformatiertem Code wo zusätzlich die Groß- und Kleinschreibung missachtet wird komplett aus.

Delphi ist was Groß- und Kleinschreibung angeht tolerant. Andere Sprachen nicht.

Luckie 26. Okt 2018 18:57

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Bitte benenne die Variablen aussagekräftig. Mit b1 bis b4 kann keiner was anfangen. :roll:

DieDolly 26. Okt 2018 19:02

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Ich werfe mal die DateUtils in den Raum
https://www.freepascal.org/docs-html...s/index-5.html

hoika 26. Okt 2018 20:17

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Hallo,
was funktioniert denn konkret nicht?
Mal ein Beispiel sagen, wo der Wochentag falsch ermittelt wird.

Schon mal F5/F7/F8 benutzt?

"Geht nicht", ist keine Fehlermeldung.

Klaus01 26. Okt 2018 20:23

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
ich verstehen nicht, warum für z.B Februar die Anzahl der Tage des Januars hinzugefügt werden.
Somit hätte der Februar 59 Tage.
Der März dann 90 Tage usw.

Grüße
Klaus

p80286 26. Okt 2018 20:52

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
nö der Letzte Februartag ist der 59 Tag des Jahres, wenn kein Schaltjahr vorliegt.
Der 5. März ist dann der 64. Tag.

Gruß
K-H

DieDolly 26. Okt 2018 20:56

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Zitat:

Zitat von Klaus01 (Beitrag 1416837)
ich verstehen nicht, ...

Die Kommentare die da zu sehen sind, sind absolut nicht aussagekräftig.
Ich glaube hier wurde einfach nur irgendeine 0815 Technik eines Lehrers übernommen.

Techniken von Lehrern übernehmen halte ich für leichtsinnig. Die besten Techniken und Codes entwirft man eigenständig.
Dann versteht man das was da steht auch. Aber einfach irgendwas vom Lehrpersonal übernehmen kann nur schiefgehen.

Kurz gesagt würde ich den gesamten Code über den Haufen werfen und richtig neu beginnen.

Luckie 26. Okt 2018 21:00

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Wartet doch erst mal eine Rückmeldung ab.

OLDIE1950 26. Okt 2018 21:22

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Zitat:

Zitat von hoika (Beitrag 1416836)
"Geht nicht", ist keine Fehlermeldung.

Das Komma ist kein Design-Merkmal.
https://de.wikipedia.org/wiki/Kommaregeln

Luckie 26. Okt 2018 21:25

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Bitte beim Thema bleiben!

Nimmersatt 27. Okt 2018 13:01

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Versuche es doch mal mit folgendem Code.

Delphi-Quellcode:

procedure TForm1.Button1Click(Sender: TObject);

var a,b1,b2,b3,b4,d,d1,m,i:integer;
    c:array [1..12] of integer;

    tag_im_jahr,woche,wochentag: integer;
    ttt: array[1..400] of string;

begin
   For i:=1 to 12 do c[i]:=0; // Vorbelegen des Arrays mit 0
   c[1]:=31; // Januar
   c[2]:=c[1]+28; // Februar
   c[3]:=c[2]+31; // ...
   c[4]:=c[3]+30;
   c[5]:=c[4]+31;
   c[6]:=c[5]+30;
   c[7]:=c[6]+31;
   c[8]:=c[7]+31;
   c[9]:=c[8]+30;
   c[10]:=c[9]+31;
   c[11]:=c[10]+30; // November
   
   d:=strtoint(edit2.Text); // Tag // Berechnung der Tagesanzahl
   m:=strtoint(edit3.Text); // Monat

   case m of
   1: d1:=d;
   2: d1:=c[1]+d;
   3: d1:=c[2]+d;
   4: d1:=c[3]+d;
   5: d1:=c[4]+d;
   6: d1:=c[5]+d;
   7: d1:=c[6]+d;
   8: d1:=c[7]+d;
   9: d1:=c[8]+d;
   10: d1:=c[9]+d;
   11: d1:=c[10]+d;
   12: d1:=c[11]+d;
   end;

   Tag_im_ jahr:=0;

   for woche:=1 to 53 do for wochentag:=1 to 7 do
   begin
     Tag_im_jahr:= Tag_im_jahr+1;

     if wochentag=1 then ttt[tag_im_jahr]:='Montag';
     if wochentag=2 then ttt[tag_im_jahr]:='Dienstag';
     if wochentag=3 then ttt[tag_im_jahr]:='Mittwoch';
     if wochentag=4 then ttt[tag_im_jahr]:='Donnerstag';
     if wochentag=5 then ttt[tag_im_jahr]:='Freitag';
     if wochentag=6 then ttt[tag_im_jahr]:='Sonnabend';
     if wochentag=7 then ttt[tag_im_jahr]:='Sonntag';
   end;

   label6.caption:= ttt[d1];
end;

Dem ersten Tag im Jahr wird der Montag zugewiesen, wenn nicht, dementsprechend anpassen.


mfg Nimmersatt

DieDolly 27. Okt 2018 14:02

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
DateUtils :roll:

Das Label3 hat deine Optimierung wohl wegoptimiert :P
Werft den ganzen Code weg und bauts richtig neu.

ghubi01 27. Okt 2018 14:42

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Hallo Ave,

versuch das mal :wink:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  JahrInt,JahrIntLow,JahrIntHigh,
  b1,b2,b3,b4,
  Day,DayI,
  Monat:integer;
  JahrStr: string;
begin

    JahrInt:=strtoint(edit1.Text); // vierstellige Jahreszahl!
    Day:=strtoint(edit2.Text); // Tag
    Monat:=strtoint(edit3.Text); // Monat

    b1:=5*((JahrInt-1) mod 4)+1; // nach: Carl Friedrich Gauss
    b2:=4*((JahrInt-1) mod 100);
    b3:=6*((JahrInt-1) mod 400);
    b4:= (b1+b2+b3) mod 7;

    case b4 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;

    // Informationsquelle für die nachfolgenden Bererchnungen:
    // https://de.wikipedia.org/wiki/Wochentagsberechnung
    if Monat < 3 then
    begin
      Monat:= Monat + 10;
      dec(JahrInt); // oder JahrInt:= JahrInt - 1;
    end else dec(Monat,2); // oder Monat:= Monat - 2;

    JahrStr:=IntToStr(JahrInt);
    JahrIntHigh:=StrToInt(Copy(JahrStr,1,2));
    JahrIntLow:=StrToInt(Copy(JahrStr,3,2));

    // Unit Math (Lazarus) oder System.Math (Delphi) einbinden
    DayI:=(Day+Floor(2.6*Monat-0.2)+JahrIntLow+Floor(JahrIntLow/4)+Floor(JahrIntHigh/4)-2*JahrIntHigh) mod 7;
    if DayI<0 then DayI:=DayI + 7;

    case DayI of
    0: label2.caption:='Sonntag';
    1: label2.caption:='Montag';
    2: label2.caption:='Dienstag';
    3: label2.caption:='Mittwoch';
    4: label2.caption:='Donnerstag';
    5: label2.caption:='Freitag';
    6: label2.caption:='Samstag';
    end;
end;

OliviaH 27. Okt 2018 18:38

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Hallo,
die Wochentagsberechnung haben wir mit einer Formel von Zeller gemacht.
Ein kleines Beispiel gibt es unter https://mathematikalpha.de/informatik-klasse11 , dort bei Klasse 9 das Beispiel 2.
Ich habe mal kopiiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Tag,Monat,Jahr,W,C,Y: Integer;
(*
Zellersche Formel
Verfahren zur Ermittlung des Wochentages nach Christian Zeller (1882):
T … Tag, M … Monat, J … Jahr, W … Wochentag,
Sa = 0; So = 1, …, Fr = 6,
C … vergangene Jahrhunderte, Y … Jahresnummer im laufenden Jahrhundert, [ ] … ganzzahlige Division
Januar und Februar werden altrömisch als 13. und 14. Monat des Vorjahres gezählt.
Gregorianischer Kalender
   W = (T+[13·(M+1)/5] +Y +[Y/4] +[C/4] -2C) mod 7
Julianischer Kalender
   W = (T + [13·(M+1)/5] + Y + [Y/4] + 5 - C) mod 7
*)
begin
  tag:=strtoint(edit1.text);
  monat:=strtoint(edit2.text);
  jahr:=strtoint(edit3.text);
  if monat<3 then begin
    monat:=monat+12;
    jahr:=jahr-1;
  end;
  y:=jahr mod 100;
  c:=jahr div 100;

  w:=(Tag+ (13*(Monat+1)) div 5 + Y + y div 4 + c div 4 -2*C) mod 7;
  while w<0 do w:=w+7;

  if w=0 then edit4.text:='Sonnabend';
  if w=1 then edit4.text:='Sonntag';
  if w=2 then edit4.text:='Montag';
  if w=3 then edit4.text:='Dienstag';
  if w=4 then edit4.text:='Mittwoch';
  if w=5 then edit4.text:='Donnerstag';
  if w=6 then edit4.text:='Freitag';
end;
Liebe Grüße Olivia

grizzly 27. Okt 2018 19:52

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Zumindest stimmt der Kommentar in der Prozedur nicht mit dem aktuellen Code überein: Bei Berechnung von w ist das erste Paar eckige Klammern falsch umgesetzt, wenn ich mich nicht irre...
oder der Kommentar ist falsch, habe jetzt nicht nachgesehen, ob der zur Zellerschen Formel passt.

EWeiss 27. Okt 2018 20:02

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Na ja dann so ;)
Delphi-Quellcode:
w := (Tag + (13 * (Monat + 1) div 5) + Y + (y div 4) + (c div 4) -2 * C) mod 7;


gruss

OliviaH 27. Okt 2018 20:12

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Die Rechnung ist richtig und das Ergebnis stimmt.

Ich hatte mich gefreut wieder etwas helfen zu können. Wieder wird nur kritisiert. Erst war es dumm und altmodisch jetzt soll es falsch sein, aber es stimmt.
Das macht mir keinen Spaß.

Olivia

Luckie 27. Okt 2018 20:40

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Wo wird deine Lösung als dumm und altmodisch bezeichnet bzw. kritisiert? Und was ist gegen konstruktive Kritik einzuwenden?

EWeiss 27. Okt 2018 20:54

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Zitat:

jetzt soll es falsch sein
Vergleiche doch mal bitte die Klammern innerhalb des Zitat!

Delphi-Quellcode:
// Gregorianischer Kalender
 //W = (T+[13·(M+1)/5] +Y +[Y/4] +[C/4] -2C) mod 7
mit dem von meinem..
Delphi-Quellcode:
w := (Tag + (13 * (Monat + 1) div 5) + Y + (y div 4) + (c div 4) -2 * C) mod 7;


und den deinigen..
Delphi-Quellcode:
w:=(Tag+ (13*(Monat+1)) div 5 + Y + y div 4 + c div 4 -2*C) mod 7;


Es hat niemand gesagt das deine Berechnung falsch ist sondern das dass setzen der Klammern mit dem aus dem Zitat nicht übereinstimmt.
Prüfe es doch bitte selbst nochmal ob dieses zur Zellerschen Formel passt.

Ich habe die Klammern so gesetzt wie im Zitat du hingegen nicht.
Es bleibt also zu klären was nun richtig ist deine Klammern oder diese des Zitat!

gruss

p80286 27. Okt 2018 22:32

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Zitat:

Zitat von EWeiss (Beitrag 1416921)
Zitat:

jetzt soll es falsch sein
Vergleiche doch mal bitte die Klammern innerhalb des Zitat!

Delphi-Quellcode:
// Gregorianischer Kalender
 //W = (T+[13·(M+1)/5] +Y +[Y/4] +[C/4] -2C) mod 7
mit dem von meinem..
Delphi-Quellcode:
w := (Tag + (13 * (Monat + 1) div 5) + Y + (y div 4) + (c div 4) -2 * C) mod 7;


und den deinigen..
Delphi-Quellcode:
w:=(Tag+ (13*(Monat+1)) div 5 + Y + y div 4 + c div 4 -2*C) mod 7;

Wenn meine eingerosteten Mathematikkentnisse mich nicht täuschen (Punkrechnung vor Strichrechnung) sind beide Ausdrücke gleichwertig, aber lieber eine Klammer zuviel als zu wenig.

Gruß
K-H

EWeiss 27. Okt 2018 22:36

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
Zitat:

Wenn meine eingerosteten Mathematikkentnisse mich nicht täuschen (Punkrechnung vor Strichrechnung) sind beide Ausdrücke gleichwertig
Sorry darum geht es nicht sondern um die Frage ob die Gleichung des Zitat mit dem der Zellerschen Formel im Einklang steht.
Denn das war die Verwirrung hier. ;)

gruss

grizzly 27. Okt 2018 23:30

AW: Was haut bei dieser Wochentagsberechnung nicht hin?
 
OliviaH, nicht entmutigen lassen, wenn eine Antwort mal schnoddrig rüber kommt - so war es nicht gemeint. Entschuldige!
Mir ist nur selber schon mit den Klammern oftmals was daneben gegangen, und für mich sah es im ersten Moment so aus, als ob Kommentar und Code nicht zusammen passen. "Gebranntes Kind" und so...
Aber Dein Code funktioniert, hab's gerade eben extra ausprobiert (Wollte nicht nachdenken :oops:). Wegen der Klammern und dem "div" war ich mir nicht sicher, klappt aber.
Und danke für den Link auf den Wikipedia-Artikel, das war mal wieder was Interessantes für den Samstag-Abend :thumb:

Gruß
Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz