AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Problem beim berechnen von vergangenen Tagen
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim berechnen von vergangenen Tagen

Ein Thema von DaveMitHut · begonnen am 21. Okt 2010 · letzter Beitrag vom 22. Okt 2010
Antwort Antwort
DaveMitHut

Registriert seit: 19. Okt 2010
Ort: Erkelenz
13 Beiträge
 
Turbo Delphi für Win32
 
#1

Problem beim berechnen von vergangenen Tagen

  Alt 21. Okt 2010, 19:02
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?
David
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Problem beim berechnen von vergangenen Tagen

  Alt 21. Okt 2010, 19:16
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
DaveMitHut

Registriert seit: 19. Okt 2010
Ort: Erkelenz
13 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Problem beim berechnen von vergangenen Tagen

  Alt 21. Okt 2010, 19:47
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 !
David
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Problem beim berechnen von vergangenen Tagen

  Alt 21. Okt 2010, 20:13
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Problem beim berechnen von vergangenen Tagen

  Alt 21. Okt 2010, 20:53
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!

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

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Problem beim berechnen von vergangenen Tagen

  Alt 21. Okt 2010, 21:04
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 (I = (4 or 6 or 9 or 11)) aus, welchen dann (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 Days := Days + 30 -Zweig nie verwendet würde.
> Haltepunkt in Zeile Days := 0; (z.B. mit F5)
> und dann über F7 Befehl für Befehl durchsteppen
> dabei eventuell noch I und 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.
$2B or not $2B
  Mit Zitat antworten Zitat
DaveMitHut

Registriert seit: 19. Okt 2010
Ort: Erkelenz
13 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Problem beim berechnen von vergangenen Tagen

  Alt 22. Okt 2010, 11:59
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 ^^
David
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:15 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