AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Was haut bei dieser Wochentagsberechnung nicht hin?

Was haut bei dieser Wochentagsberechnung nicht hin?

Ein Thema von Ave · begonnen am 26. Okt 2018 · letzter Beitrag vom 28. Okt 2018
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 26. Okt 2018, 22:25
Bitte beim Thema bleiben!
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Nimmersatt

Registriert seit: 14. Feb 2014
86 Beiträge
 
#12

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 14:01
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
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.173 Beiträge
 
#13

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 15:02
DateUtils

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

Geändert von DieDolly (27. Okt 2018 um 15:05 Uhr)
  Mit Zitat antworten Zitat
ghubi01

Registriert seit: 18. Nov 2017
121 Beiträge
 
Delphi 12 Athens
 
#14

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 15:42
Hallo Ave,

versuch das mal

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;
  Mit Zitat antworten Zitat
OliviaH

Registriert seit: 4. Okt 2017
3 Beiträge
 
#15

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 19:38
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
  Mit Zitat antworten Zitat
grizzly

Registriert seit: 10. Dez 2004
150 Beiträge
 
Delphi XE4 Professional
 
#16

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 20:52
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#17

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 21:02
Na ja dann so
w := (Tag + (13 * (Monat + 1) div 5) + Y + (y div 4) + (c div 4) -2 * C) mod 7;

gruss

Geändert von EWeiss (27. Okt 2018 um 21:05 Uhr)
  Mit Zitat antworten Zitat
OliviaH

Registriert seit: 4. Okt 2017
3 Beiträge
 
#18

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 21:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#19

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 21:40
Wo wird deine Lösung als dumm und altmodisch bezeichnet bzw. kritisiert? Und was ist gegen konstruktive Kritik einzuwenden?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

AW: Was haut bei dieser Wochentagsberechnung nicht hin?

  Alt 27. Okt 2018, 21:54
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..
w := (Tag + (13 * (Monat + 1) div 5) + Y + (y div 4) + (c div 4) -2 * C) mod 7;

und den deinigen..
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

Geändert von EWeiss (27. Okt 2018 um 22:33 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 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