AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language [Erledigt ]Logik-Problem mit and/or-Verknüpfung
Thema durchsuchen
Ansicht
Themen-Optionen

[Erledigt ]Logik-Problem mit and/or-Verknüpfung

Ein Thema von Wolfgang Mix · begonnen am 12. Aug 2012 · letzter Beitrag vom 13. Aug 2012
Antwort Antwort
Seite 2 von 2     12   
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#11

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

  Alt 12. Aug 2012, 18:09
Auch wenn ich deinen Code immer sehr schätze, muss ich zugeben das mich als Amateur deine Hilfsconstanten eher verwirren.
Aber das des funktioniert war eher darauf fokussiert
in (1,2) hatte ich auch versucht, allerdings mit []
Schönen Abend noch
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#12

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

  Alt 12. Aug 2012, 19:29
Nochmal wegen der Lesbarkeit und ohne Hilfskrücken
(unnötige Zusatzvariblen) habe ich es jetzt so
und es funktioniert.


Delphi-Quellcode:
if (monat in[1,2]) and isleapyear(jahr) then
  schaltjahrkorrektur:=1
else schaltjahrkorrektur:=0;
Zitat meines Lehrmeisters:
"Geht nicht" gibt es nicht

LG

Wolfgang
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824

Geändert von Wolfgang Mix (12. Aug 2012 um 19:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#13

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

  Alt 12. Aug 2012, 20:55
Das waren aber weder Variablen noch Krücken, sondern einfache Konstanten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#14

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

  Alt 12. Aug 2012, 23:55
Sorry Detlef,
aber mein Code braucht jetzt weder zusätzliche Variablen,
Konstanten noch externe Funktionen.
Bin eigentlich mit dem jetzigen Code zufrieden
Mein k und Dein CORRECTIONVALUE sind also überflüssig

LG

Wolfgang
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824

Geändert von Wolfgang Mix (13. Aug 2012 um 00:08 Uhr)
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#15

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

  Alt 13. Aug 2012, 01:56
... und if / then brauchst du auch nimmer ROFL
schaltjahrkorrektur:= ((Month in [1,2]) and IsLeapYear(Year));
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#16

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

  Alt 13. Aug 2012, 07:39
Achtung, Klugscheißerkommentar!

Ist kompakter Code strebenswert oder lesbarer? Soll man das noch verstehen, wenn man in ein paar Jahren drüberschaut oder einfach übersehen, weil es ja so herrlich kompakt ist?

Zunächst fällt auf, das Monate durch numerische Werte repräsentiert werden. Das ist ungünstig, denn für welchen Monat steht die 1? Immer für Januar? Was ist, wenn wir mit Fiskaljahren rechnen und der erste Monat des Fiskaljahres ist der Juli? Was bedeutet dann die 1?

Ich würde daher den Monaten eine Enumerationsliste spendieren und den Monat durch seinen Namen repräsentieren. Dann ist das unmißverständlich.

DeddyH ist schon auf dem richtigen Weg, indem er auf magische Konstanten verzichtet, aber stellt sich über seinen 'Correctionvalue' selbst ein Bein: Das macht den Ansatz dann wieder schwerer Lesbar. Wolfgang will doch nur den einfachen Satz ins delphianische übersetzt haben:
"Wenn Januar oder Februar im Schaltjahr vorliegt, soll eine Schaltjahreskorrektur vorgenommen werden (1), andernfalls 0."
In Englisch wäre das
"A correctionvalue should be 1, if and only if the year is a leapyear and the month is a january and 0 otherwise".

Fast am Ziel (Delphi kennt das so ja nicht)
Delphi-Quellcode:
If IsLeapYear() and month in [January, February] Then
  CorrectionValue := 1
else
  CorrectionValue := 0;
Dieser Code liest sich fast so wie Wolfgangs Aufgabenstellung. Fast wortwörtlich, ergo verständlich.

Wenn man nun die Eigenschaft 'Schaltjahr und Januar oder Februar' noch beschreiben möchte (z.B. weil das eine Bedingung ist, die Fred Rembremerdinger in seiner Gleichung aufgestellt hat) dann kann man das noch in eine Funktion auslagern und dieser Funktion einen aussagekräftigen Namen geben. Muss aber nicht.

Das Einzige, was mich noch stören würde, ist der Name dieses Korrekturfaktors. Was korrigiert er? Wenn Wolfgang mehr Code zeigen würde, dann könnte man diesen Faktor noch umbenennen. Aber in dieser Aufgabenstellung reicht diese Bezeichnung aus.

@Hobbyprogrammierer: Ist 1/0 gleichbedeutend mit einem Boolean

Geändert von Furtbichler (13. Aug 2012 um 07:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#17

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

  Alt 13. Aug 2012, 08:52
Find Ich garnicht so klugscheißerisch... hört sich einfach nach Erfahrung an.

Hilfsvariablen oder "Krückenvariablen" heißen eigentlich ungünstig, weil sie Pflicht-Leseverbesserungs-Variablen heißen sollten und man davon soviele erstellen sollte, wie es für ein besseres Verständnis des Codes förderlich ist.

Angenommen du berechnest in einer Funktion:

Delphi-Quellcode:

Border := 10 * Parameter;
Result := Border + Width;

// Könntest du das auch ohne Border und in 1 Zeile abwickeln

Result := (10 * Parameter) + Width
Wenn du jenes allerdings in komplexeren Methoden ohne weitere Bezeichner machst, wird der Code wieder ein Stückchen unübersichtlicher -> schwerer zu warten.

Ich würde Klammern immer setzen, weil sie der Gleichnung verschiedene menschliche Interpretationsmöglichkeiten aberkennen, denn eigentlich ist das Problem, dass du scheinbar nicht genau weißt was passiert wenn sie nicht da sind:

Dazu gibts einen kleinen Bereich in der Referenz:
http://docwiki.embarcadero.com/RADSt....29_Operatoren

Zitat:
Das Kurzschlussverfahren geht streng von links nach rechts vor und wird beendet, sobald das Ergebnis des gesamten Ausdrucks feststeht

Delphi-Quellcode:

If (IsLeapYear()) and (month in [January, February]) Then
Nach unserem Styleguide würde die Bedingung zwanghaft nochmals eingeklammert werden aber das ist was hausinternes.
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!

Geändert von Jonas Shinaniganz (13. Aug 2012 um 09:41 Uhr)
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#18

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

  Alt 13. Aug 2012, 11:54
Es ist etwas OT, aber eine interessante Diskussion.
Ich persönlich verzichte gerne auf Überflüssiges im Code, wobei ich bei der Klammersetzung dazu tendiere, komplexe Ausdrücke durch Funktionen oder Hilfsvariablen verständlich zu machen.

Ich persönlich finde es aber einen Overkill, einen Funktionsaufruf in Klammern zu setzen. Ich setze beim Leser meines Codes voraus, das er Delphi kann.

Was allerdings grenzwertig wäre, wäre ein Konstrukt wie

if not ((a>=1) and (a<=10)) or not((b>=-2) and (b<=15)) then // habe ich Klammern vergessen? .

Das ist zwar schön kompakt, aber man muss schon genauer hinschauen, um zu erkennen, das a und b auf 'außerhalb einer Toleranz' geprüft werden (also eigentlich ja negiertes 'innerhalb der Toleranz' ). Also wieso nicht gleich

Delphi-Quellcode:
if Not InTolerance(a,1,10)) or not InTolerance(b,-2,15) then// garantiert keine Klammer vergessen
// oder nach Umformung (leichter zu lesen????)
if Not (InTolerance(a,1,10)) and InTolerance(b,-2,15)) then
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 13. Aug 2012, 12:43
if Not InTolerance(a,1,10)) or not InTolerance(b,-2,15) then// garantiert keine Klammer vergessen
Doch, da fehlt ein (
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Aug 2012 um 13:04 Uhr)
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#20

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

  Alt 13. Aug 2012, 12:44
:rofl: Aber da fehlt keine, das ist eine zu viel.
Herrlich ins Knie geschossen!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:39 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