Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   [Erledigt ]Logik-Problem mit and/or-Verknüpfung (https://www.delphipraxis.net/169795-%5Berledigt-%5Dlogik-problem-mit-verknuepfung.html)

Wolfgang Mix 12. Aug 2012 15:26

Delphi-Version: 5

[Erledigt ]Logik-Problem mit and/or-Verknüpfung
 
Habe gerade einen Blackout.

Problem:
Wenn Januar oder Februar im Schaltjahr vorliegt,
soll eine Schaltjahreskorrektur vorgenommen werden (1),
andernfalls 0.

Wörtlich übersetzt:
Delphi-Quellcode:
  //Logikfehler
{  if (monat=1) or (monat=2) and isleapyear(jahr) then
     schaltjahrkorrektur:=1
   else schaltjahrkorrektur:=0; }
Funktioniert so nicht.

Mit einer Hilfskrücke k Klappt es (Dirty Code).


Delphi-Quellcode:
  if (monat=1) or (monat=2) then k:=1 else k:=0;
  if isleapyear(jahr) and (k=1) then
    schaltjahrkorrektur:=1
  else schaltjahrkorrektur:=0;
Wie "denkt" der Compiler?

fkerber 12. Aug 2012 15:29

AW: Logik-Problem mit and/or-Verknüpfung
 
Hi,

auch wenn ich den Sinn der Sache nicht ganz verstehe, vermut ich dass der Fehler in der Klammerung besteht - and klammert stärker als or.

Es steht also aktuell quasi das da:

Delphi-Quellcode:
if (monat=1) or ((monat=2) and isleapyear(jahr)) then
    schaltjahrkorrektur:=1
   else schaltjahrkorrektur:=0;
aber du willst

Delphi-Quellcode:
if ((monat=1) or (monat=2)) and isleapyear(jahr) then
    schaltjahrkorrektur:=1
   else schaltjahrkorrektur:=0;

LG,
Frederic

Popov 12. Aug 2012 15:32

AW: Logik-Problem mit and/or-Verknüpfung
 
Delphi-Quellcode:
if (monat=1) or (monat=2) and isleapyear(jahr) then
Ich versuche sowas zu vermeiden, und mache es so
Delphi-Quellcode:
if ((monat=1) or (monat=2)) and isleapyear(jahr) then
Ist glaube ich verständlicher zu lesen.

Wolfgang Mix 12. Aug 2012 15:35

AW: Logik-Problem mit and/or-Verknüpfung
 
Sorry, auch mit deinen Klammern funktioniert es nicht.

LG

Wolfgang

Wolfgang Mix 12. Aug 2012 15:42

AW: Logik-Problem mit and/or-Verknüpfung
 
@Popov und @fkerber

Ihr hattet recht, es ist ein Klammerproblem.
Mit Popovs Klammern funzt es:

Danke an Euch

LG

Wolfgang

DeddyH 12. Aug 2012 15:53

AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
 
Nur der Vollständigkeit halber:
Delphi-Quellcode:
const
  CORRECTIONVALUE: array[Boolean] of integer = (0, 1);
...
  schaltjahrkorrektur := CORRECTIONVALUE[(monat in (1,2)) and IsLeapYear(jahr)];

Wolfgang Mix 12. Aug 2012 16:00

AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
 
Danke Detlef,

in (1,2) hatte ich auch versucht,
allerdings mit [] :(

DeddyH 12. Aug 2012 16:21

AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
 
Du hast natürlich Recht, das kommt davon, wenn man direkt im Editor tippt. Vielleicht wäre das so aber lesbarer:
Delphi-Quellcode:
const
  CORRECTIONVALUE: array[Boolean] of integer = (0, 1);
  POSSIBLYWRONGMONTHS = [MonthJanuary, MonthFebruary];
...
  schaltjahrkorrektur := CORRECTIONVALUE[(monat in POSSIBLYWRONGMONTHS) and IsLeapYear(jahr)];

Hobby-Programmierer 12. Aug 2012 16:34

AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
 
Hmm, sollte
Delphi-Quellcode:
Result:= ((Month in [1,2]) and IsLeapYear(Year))
nicht ausreichen?

Edit: also mein Delphi führt folgendes korrekt aus
Delphi-Quellcode:
function schaltjahrkorrektur(Month, Year: Integer): Boolean;
begin
  Result:= ((Month in [1,2]) and IsLeapYear(Year));
end;

DeddyH 12. Aug 2012 16:56

AW: [Erledigt ]Logik-Problem mit and/or-Verknüpfung
 
Wieso sollte es auch nicht, ich habe ja zugegebenermaßen einen Syntaxfehler gemacht. Die 2. Konstante habe ich nur eingeführt, um Magic Values zu vermeiden, man kann natürlich auch auf das Set verzichten und gleich die Konstanten nehmen, aber ich habe so etwas lieber zentral, falls man öfter darauf zugreift (DRY).


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.
Seite 1 von 2  1 2      

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