Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Problem beim berechnen von vergangenen Tagen (https://www.delphipraxis.net/155405-problem-beim-berechnen-von-vergangenen-tagen.html)

DaveMitHut 21. Okt 2010 18:02

Problem beim berechnen von vergangenen Tagen
 
Hallo allerseits!

In der Schule schreiben wir zur Zeit ein Programm mit Delphi, dass uns den Wochentag eines eigegebenen Datums nennt, vornehmlich soll es dazu dienen, den Wochentag des eigenen Geburtstages zu erfahren/errechnen.
Dazu haben wir eine Funktion geschrieben, die uns die Anzahl der bisher vergangenen Tage des eingegebenen Jahres errechnet. Heute habe ich aber gemerkt, dass sich das Programm verrechnet und ich daher einen Fehler im Quellcode haben muss.
z.B. wenn man den 30.12. eingibt werden 368(369 im Schaltjahr) vergangene Tage angezeigt, wobei es nur 364 bzw. 365 im Schaltjahr sind.

Delphi-Quellcode:
function TKalender.CalcDays (pTag:integer; pMonat:integer; pSchalt:boolean) : integer;
var I,Days :integer;
begin
     Days := 0;
     for I := 1 to pMonat - 1 do
     begin
        if I=2 then
           if pSchalt then
              Days := Days + 29
           else Days := Days + 28
        else if (I=4 or 6 or 9 or 11) then
           Days := Days + 30
        else Days := Days + 31;
     end;
     Days := Days + pTag;
     result := Days;
end;
Das ist der Quellcode. Könnte mir einer von euch helfen, den Fehler zu finden?

Bummi 21. Okt 2010 18:16

AW: Problem beim berechnen von vergangenen Tagen
 
Delphi-Quellcode:
// falsch: else if (I=4 or 6 or 9 or 11) then
// richtig: else if ((I=4) or (I=6) or (i=9) or (i=11)) then
// besser      
 else if i in [4,6,9,11] then
und bau ab und zu mal eine begin .. end ein
Delphi-Quellcode:
        if I=2 then
           begin
           if pSchalt then
              Days := Days + 29
           else Days := Days + 28
           end

DaveMitHut 21. Okt 2010 18:47

AW: Problem beim berechnen von vergangenen Tagen
 
Danke für die schnelle Antwort !

Das mit dem begin und end war ne Anweisung des Lehrers, er wollte, dass der Code mal kürzer wird als sonst ^^

Und Danke für die Berichtigung !:thumb:

Namenloser 21. Okt 2010 19:13

AW: Problem beim berechnen von vergangenen Tagen
 
Zitat:

Zitat von Bummi (Beitrag 1057025)
und bau ab und zu mal eine begin .. end ein
Delphi-Quellcode:
        if I=2 then
           begin
           if pSchalt then
              Days := Days + 29
           else Days := Days + 28
           end

WTF? Was ist das denn für eine unübersichtliche Einrückung? Also wenn du ihm schon rätst, seinen Code zu formatieren, dann bitte nach dem Styleguide:
Delphi-Quellcode:
        if I=2 then
        begin
          if pSchalt then
            Days := Days + 29
          else
            Days := Days + 28;
        end;
Abgesehen davon finde ich die Formatierung des OP auch so übersichtlich.

shmia 21. Okt 2010 19:53

AW: Problem beim berechnen von vergangenen Tagen
 
Schreibe dir eine Funktion, die die Anzahl der Tage für einen bestimmten Monat liefert:
Delphi-Quellcode:
function TageProMonat(pMonat:integer; pSchalt:boolean):integer;
begin
  // deine Lösung hier
end;
Danach ist deine Funktion CalcDays viel einfacher und klarer zu lesen.

Diese Funktion gibt es mehr oder weniger in der Unit SysUtils.
Aber erst kucken, wenn du die Funktion selbst hingekriegt hast! :warn:

Du (und vielleicht auch manche Mitleser) wirst überrascht sein,
wie elegant und schnell Borland das umgesetzt hat.
Tip: es ist nicht wirklich eine Funktion...

himitsu 21. Okt 2010 20:04

AW: Problem beim berechnen von vergangenen Tagen
 
Die Einrückung geht eigentlich noch.
- es ist wenigstens Eine vorhanden (besser als völliges Chaos)
- und sie scheint (soviel man sieht) halbwegs konsequent zu sein

Und nochmal zur Erklärung:
OR hat Vorrang vor =

Im Endefekt sieht es also so
Delphi-Quellcode:
(I = (4 or 6 or 9 or 11))
aus, welchen dann
Delphi-Quellcode:
(I = 15)
ergibt und so die Fehlberechnung erklärt.

PS: Dieser Fehler wäre aber auch beim Debuggen sofort aufgefallen, wenn man gesehn hätte, wie der
Delphi-Quellcode:
Days := Days + 30
-Zweig nie verwendet würde.
> Haltepunkt in Zeile
Delphi-Quellcode:
Days := 0;
(z.B. mit F5)
> und dann über F7 Befehl für Befehl durchsteppen
> dabei eventuell noch
Delphi-Quellcode:
I
und
Delphi-Quellcode:
Days
in den "Überwachten Ausdrücken" (Strg+Alt+W) kann auch nicht schaden



PSS: Statt der "vielen" IFs würde sich auch ein CASE eignen und ich persönlich würde das FOR und die IFs durch eine Array-Konstante ersetzen.
Aber das lernt ihr eventuell noch irgendwann.

PS³: Dieser Sprachmischmasch (englisch/deutsch) ist auch eher unschön.
Es macht sich gut, wenn man sich für eine Sprache entscheidet.

DaveMitHut 22. Okt 2010 10:59

AW: Problem beim berechnen von vergangenen Tagen
 
Guten Morgen!

Danke auch noch an alle anderen Antworten, das mit der Übersichtlichkeit werd ich nochmal verbesern ^^


Natürlich machen wir das ganze auch noch mit Arrays, aber vor den Ferien haben wir das nicht mehr geschafft und richtig gelernt haben wir das auch nicht. Unser Lehrer hat aber von Anfang an gesagt, dass er das eigentlich mit Arrays machen will ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 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