Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi boolesche Formel ausrechnen (https://www.delphipraxis.net/29658-boolesche-formel-ausrechnen.html)

Dezipaitor 12. Sep 2004 18:47


boolesche Formel ausrechnen
 
hi

gibt es irgendeine Freeware komponente oder Dokumente über Algorithmen, mit denen man Formeln in der Form

F = (A = B) and ((C <> 3) or (D = 'tee'))

bestimmen kann,
ob
F wahr
oder
F falsch
ist?

Man beachte die die Klammerprioritäten und unterschiedliche Datentypen der Variablen.
Wobei der Inhalt der Variablen einfach in einer Liste steht.

thx

Die Muhkuh 12. Sep 2004 18:52

Re: boolesche Formel ausrechnen
 
Ich denke mal:

Delphi-Quellcode:
F := (A = B) and ((C <> 3) or (D = 'tee'));

if F then
  ShowMessage('F ist wahr')
else
  ShowMessage)'F ist nicht wahr');

Dezipaitor 12. Sep 2004 19:00

Re: boolesche Formel ausrechnen
 
:wall:

es war eigentlich so gedacht, dass die formel in einem string steckt,
und dann ausgewertet werden muss.

jfheins 12. Sep 2004 19:14

Re: boolesche Formel ausrechnen
 
Kann man einen String in einen Boolschen Ausdruck casten ???

Dezipaitor 12. Sep 2004 19:22

Re: boolesche Formel ausrechnen
 
wenn es so einfach wäre, hätte ich nicht gefragt :)

xineohp 12. Sep 2004 20:06

Re: boolesche Formel ausrechnen
 
moin,

Bastel dir doch einen Parser. (was fertiges kenn ich nicht)


EDIT: Wobei das mit den unterschiedlichen Datentypen ein Problem darstellen könnte :gruebel:

Nothine 12. Sep 2004 20:13

Re: boolesche Formel ausrechnen
 
naja wieso eigentlich, wenn man die formeln (bzgl. klammersetzung) so auffriemelt das man jeden test auf gleichheit (oder ungleichheit) einzeln hat, müsste man doch im prinzip nur noch linke seite gegen reichte seite machen, das geht auch (oder erstrecht) in strings... stichwort dazu reguläre ausdrücke, damit bringt die formel dann sogar noch richtig was...

aber ma eben in 5 minuten würd ich sowas auch nich proggen :?

woki 12. Sep 2004 20:48

Re: boolesche Formel ausrechnen
 
Hi,

ist vielleicht mit Kanonen auf Spatzen schiessen, aber vielleicht hilft ja:

Free Pascal Script

Nothine 12. Sep 2004 21:31

Re: boolesche Formel ausrechnen
 
ich weiß das sieht bescheuert aus :mrgreen: aber folgendes konstrukt funktioniert:
Delphi-Quellcode:
function CheckTrue(const A,B,C,D): Boolean;
const C2: Integer = 3;
      D2: string = 'tee';
begin
  Result := (Pointer(A) = Pointer(B)) and // (A = B) and ((C <> 3) or (D = 'tee'))
            ((Pointer(C) <> Pointer(C2)) or (Pointer(D) = Pointer(D2)));
end;

procedure TForm1.Button1Click(Sender: TObject);
var A,B,D: string; // man kommt leider nich drumrum es vorher
    C: Integer;   // in eine variable zu schreiben
const F: array[Boolean] of string[5] = ('False','True'); //nur zur anzeige
begin
  A := 'a'; B := 'a'; C := 5; D := 'tee'; //initialisieren
  Edit1.Text := F[CheckTrue(A,B,C,D)]; //das verblüffende ergebnis sehen :-D
end;
vielleicht hilft dir das ja weiter, wenn du es noch allgemeiner umschreiben willst :wink:

xineohp 12. Sep 2004 22:29

Re: boolesche Formel ausrechnen
 
@Dezipaitor: Um was für Datentypen soll es sich hier eigentlich handeln? Nur string, double, integer, etc. oder auch Klassen und records?

@Nothine: funzt das auch mit records?

Nothine 12. Sep 2004 22:34

Re: boolesche Formel ausrechnen
 
Zitat:

Zitat von xineohp
@Nothine: funzt das auch mit records?

nein, bzw. um es richtig zu stellen, nur bei records mit nur einem feld, mehrere felder scheint er nicht mehr zu prüfen, aber z.B.
Delphi-Quellcode:
//in verbindung mit obigem post
var D: string;
    C: Integer;
    A,B: record
      X: string;
    end;
const F: array[Boolean] of string[5] = ('False','True');
begin
  A.X := 'bla'; B.X := 'möp'; C := 5; D := 'tee';
  Edit1.Text := F[CheckTrue(A,B,C,D)];
end;
funktioniert... nur wenn ich beispielsweise noch ein record-feld Y vom typ integer hinzufüge und unterschiedliche werte zuweise, spuckt er trotzdem true aus... [Edit2] da er nur das erste feld prüft, DAS wird aber korrekt ausgewertet... [/Edit2]

//Nachtrag: ich hab es grad mit sowohl einer eigenen von TObject abgeleiteten klasse als auch mit TStringList probiert, aber da bekomm ich nur access violations, dementsprechend dürfte diese (zugegeben merkwürdige :mrgreen:) funktion nur auf einfache datentypen anwendbar sein...

//Und noch ein Edit: der vergleich zwischen A und B kann NUR dann positiv ergeben, wenn sie vom selben typ sind... also A: Byte = 1 und B: Integer = 1 is nich, da sagt er gnadenlos FALSE

Dax 13. Sep 2004 06:24

Re: boolesche Formel ausrechnen
 
Ich habe schon einen boolschen Parser, allerdings funktioniert er nur mit Numeralen Werten, auch Fließkomma. Der ist schon fertig und wäre bereit zur Veröffentlichung, ist aber Teil eines größeren Projekts. Es werden Klammern, not, or, and und xor Unterstützt. Wenn du Interesse daran hast, bitte per PN melden, vielleicht kannst du das ganze ja für deinen Gebrauch umschreiben.

Dezipaitor 13. Sep 2004 09:32

Re: boolesche Formel ausrechnen
 
Hab vergessen zu erwähnen :
ich habe mal an mehrere Stellen im Internet gefragt:

http://spotlight.de/zforen/dlp/m/dlp...425-19161.html
http://www.delphi-forum.de/viewtopic...asc&highlight=

Allerdings gibt es hier derzeit die inhaltlich besten Antworten - Also VIELEN DANK


@Nothine: Danke für dein Bemühen,
allerdings hatte ich dazu gesagt :
Zitat:

es war eigentlich so gedacht, dass die formel in einem [b]string[b] steckt,
und dann ausgewertet werden muss.
Zitat:

Zitat von xineohp
@Dezipaitor: Um was für Datentypen soll es sich hier eigentlich handeln? Nur string, double, integer, etc. oder auch Klassen und records?

Gute frage, und thx dass du sie gestellt hast:
Es geht nur um die einfachsten Datentypen ohne Pointer. Also
String, char, Integer, Boolean

Zitat:

Zitat von xineohp
moin,

Bastel dir doch einen Parser. (was fertiges kenn ich nicht)

EDIT: Wobei das mit den unterschiedlichen Datentypen ein Problem darstellen könnte :gruebel:

Die Ironie ist : Ich habe ja einen Parser gebaut. siehe hier
Allerdings wäre es dann wirklich "mit Kanonen auf Spatzen geschossen", wobei es kein Problem darstellt, die Formel in ihre Bestandteile zu zerlegen : Also (,),A,=,'tee' usw.


Zitat:

Zitat von Nothine
naja wieso eigentlich, wenn man die formeln (bzgl. klammersetzung) so auffriemelt das man jeden test auf gleichheit (oder ungleichheit) einzeln hat, müsste man doch im prinzip nur noch linke seite gegen reichte seite machen, das geht auch (oder erstrecht) in strings... stichwort dazu reguläre ausdrücke, damit bringt die formel dann sogar noch richtig was...

aber ma eben in 5 minuten würd ich sowas auch nich proggen :?

Das Problem besteht auch nicht direkt in der Auswertung der Vergleiche (A = B), sondern in der Klammerung gepaart mit den Operatoren AND , OR und NOT (mehr gibts nicht)

Ich habe ja alle Variablen in einer Liste :
(Pseudocode)
StringList.Objects['A'] = ^record
[Variablenname : String;] (nicht notwendig bei stringlist)
Variablentyp : <enumeration> (typ_integer,t_string usw)
Variableninhalt : String
end;

der inhalt ist immer string, kann aber mit hilfe des angegeben Typs konvertieren.

Zitat:

Zitat von woki
Hi,

ist vielleicht mit Kanonen auf Spatzen schiessen, aber vielleicht hilft ja:

Free Pascal Script

Thx für den Link. Das scheint ja sehr interessant zu sein.

Tatsache ist, dass ich hier noch etwas nicht erwähnt habe:

Die Operatoren AND, OR, NOT sowie die Vergleichsoperatoren =,<> müssen austauschbar sein durch
"&", "|", "!" sowie "==","!=" und
"==","/="

Das geht wohl am besten, wenn man diese als Konstanten definiert.

Dezipaitor 13. Sep 2004 09:41

Re: boolesche Formel ausrechnen
 
Zitat:

Zitat von Dax
Ich habe schon einen boolschen Parser, allerdings funktioniert er nur mit Numeralen Werten, auch Fließkomma. Der ist schon fertig und wäre bereit zur Veröffentlichung, ist aber Teil eines größeren Projekts. Es werden Klammern, not, or, and und xor Unterstützt. Wenn du Interesse daran hast, bitte per PN melden, vielleicht kannst du das ganze ja für deinen Gebrauch umschreiben.

wenn das funkz, dann wäre es meine rettung.

negaH 13. Sep 2004 11:36

Re: boolesche Formel ausrechnen
 
@Nothine, ?????? was soll das bringen die Speicheradressen der Variablen zu vergleichen um deren Inhalte zu vergleichen ? Dein Code lösst rein garnichts und kann nur falsche Resultate bringen. Wer sagt das bei einem Vergleich wie A <> B, beides distinct Integer Variablen, das in A und auch B nicht 3 drinnenstehen darf. Sie sind also gleich, aber bei Vergleich @A <> @B, also der Speicheradressen, wird natürlich TRUE rauskommen müssen.

Zudem wenn man nun eine ganz andere Formel auswerten möchte so nützt deine Ponter Methode wiederum nichts.
Deinen Beitrag halte ich für unkonstruktiv und im Grunde falsch.

Gruß Hagen

Nothine 13. Sep 2004 13:40

Re: boolesche Formel ausrechnen
 
Zitat:

Zitat von negaH
@Nothine, ?????? was soll das bringen die Speicheradressen der Variablen zu vergleichen um deren Inhalte zu vergleichen ? Dein Code lösst rein garnichts und kann nur falsche Resultate bringen. Wer sagt das bei einem Vergleich wie A <> B, beides distinct Integer Variablen, das in A und auch B nicht 3 drinnenstehen darf. Sie sind also gleich, aber bei Vergleich @A <> @B, also der Speicheradressen, wird natürlich TRUE rauskommen müssen.

Zudem wenn man nun eine ganz andere Formel auswerten möchte so nützt deine Ponter Methode wiederum nichts.
Deinen Beitrag halte ich für unkonstruktiv und im Grunde falsch.

Gruß Hagen

ich danke dir für diese netten worte und möchte dich freundlichst darauf hinweisen dass ich den oben geposteten code, von dem ich auch, wie oben nachzulesen, selber gesagt habe das er merkwürdig ist, natürlich vorher getestet habe, wobei ich dich, auch wenn dich das verwundern mag, darauf hinweisen möchte, dass dieser code bei mir funktioniert! du brauchst mir nicht zu erzählen das ein pointer auf eine speicheradresse und nicht auf den inhalt einer variablen verweist, dennoch ergibt der code, unter verwendung von lokalen variablen, ein FALSE bei z.B. A=3 und B=2 und ein TRUE bei A=3 und B=3. anstatt den fakt, das ich es selber ausprobiert habe, zu ignorieren, und von vornherein zu sagen, dass mein beitrag unkonstruktiv und im Grunde falsch sei, könntest du es lieber selber testen und mir danach verraten, warum es so ist wie es ist, denn du hast wesentlich mehr ahnung von delphi und asm als ich.

Freundlichst verbleibt,
Nothine

//Edit: ich hatte übrigens dazu geschrieben dass es nur eine anregung ist, nur so am rande bemerkt.

negaH 15. Sep 2004 23:08

Re: boolesche Formel ausrechnen
 
Jay, ich sagte ja nicht das dein Code so wie er im speziellen ist Falsche Resultate liefert. Nur das bringt uns nicht weiter, da er nur und ausschlieslich nur mit ganz exakt diesen Zahlen und Variablen funktioniert. Über gibt man der Testfunktion von anderer Programstelle her andere Variablen so wird diese Methode immer fehlschlagen. Somit stellt es Code dar der sinnlos wird da er nicht wiederverwendbar geschweige denn merhfachverwendbar ist.

Sorry das ich das so hart ausdrücken musste, aber fakt ist das er sinnlos ist und in diesem Thread eher verwirrend in eine ganz andere Richtung lenkt. D.h. meine unkorrekten Worte dir gegenüber ändern rein garnichts an dieser Tatsache.

Aber du hast Recht, und ich entschuldige mich bei dir, ich hätte es wesentlich netter, und mit größerer Rücksicht auf deine leicht verletzbaren Gefühle, formulieren sollen.

Gruß Hagen

Hansa 15. Sep 2004 23:33

Re: boolesche Formel ausrechnen
 
Ich glaube, ihr habt da noch was vergessen. 8) @Nothine : bei deinem Code würde ich mal den Rechner ausmachen, neu starten und sehen, ob er noch korrekt ist, glaube das nämlich nicht so recht.

Dezipaitor 16. Sep 2004 11:17

Re: boolesche Formel ausrechnen
 
ich denke mal es geht über das abarbeiten einer baumstruktur.

Postfix wäre ganz vielversprechend.

SubData 16. Sep 2004 12:42

Re: boolesche Formel ausrechnen
 
Zitat:

Zitat von negaH
Deinen Beitrag halte ich für unkonstruktiv und im Grunde falsch.

Gruß Hagen

Ich möchte mal erwähnen, dass in meinen Augen der gute Wille zählt und nicht die Tatsache ob der Beitrag wirklich nützlich ist :)

Hatte die Entschuldigung übrigens erst beim zweiten Durchblättern gesehen, Sorry meinerseits ^^

Hansa 16. Sep 2004 16:51

Re: boolesche Formel ausrechnen
 
Zitat:

Zitat von SubData
...Ich möchte mal erwähnen, dass in meinen Augen der gute Wille zählt und nicht die Tatsache ob der Beitrag wirklich nützlich ist :) ...

Allerdings darf nicht nur der gute Wille allein zählen. Es gibt genug Analphabeten hier. :lol: Wenn jemand sich durch Richtigstellung seiner Aussagen beleidigt fühlt, dann soll er eben bleiben wo er ist. Gegen konstruktive Kritik, die einen destruktiven Sachverhalt klar stellt, habe zumindest ich nichts. :stupid:

woki 19. Sep 2004 10:16

Re: boolesche Formel ausrechnen
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von SubData
...Ich möchte mal erwähnen, dass in meinen Augen der gute Wille zählt und nicht die Tatsache ob der Beitrag wirklich nützlich ist :) ...

Allerdings darf nicht nur der gute Wille allein zählen. Es gibt genug Analphabeten hier. :lol: Wenn jemand sich durch Richtigstellung seiner Aussagen beleidigt fühlt, dann soll er eben bleiben wo er ist. Gegen konstruktive Kritik, die einen destruktiven Sachverhalt klar stellt, habe zumindest ich nichts. :stupid:

Die inhaltliche Kritik an einem gutgemeinten, sachlichen aber inhaltlich fehlerhaften Beitrag sollte halt die Grenze zum persönlich diffamierenden nicht überschreiten, und wenn dann die Entschuldigung gleich weitere Beleidigungen enthält....

negaH 23. Sep 2004 13:08

Re: boolesche Formel ausrechnen
 
@Woki, du hast aber schon die einzelnen Beiträge GENAU gelesen und auch auf die Authoren der Postings geachtet ?

Ich für meinen Teil meine das ich in keinster Weise herabsetzend reagiert, oder persönliche Angriffe gestartet habe. Ganz im Gegenteil habe ich eine sehr objektive und knappe Einschätzung des Postings getroffen, eben einfach die Aussage: falsch. Zudem folgte dann sehr schnell eine Entschuldigung meinerseits ohne wenn und aber, auch wenn man der Meinung sein könnte das diese garnicht nötig ist.

Gruß Hagen

Nothine 23. Sep 2004 15:46

Re: boolesche Formel ausrechnen
 
Zitat:

Zitat von woki
Die inhaltliche Kritik an einem gutgemeinten, sachlichen aber inhaltlich fehlerhaften Beitrag sollte halt die Grenze zum persönlich diffamierenden nicht überschreiten, und wenn dann die Entschuldigung gleich weitere Beleidigungen enthält....

Es muss nicht noch breiter getreten werden, Hagen hat durchaus recht mit seiner Kritik, mein eh nur nach dem motto "schau mal ob du was damit anfangen kannst" posting war nicht sehr konstruktiv, dementsprechend hier nochmal eine entschuldigung meinerseits, und vielleicht noch die anmerkung das ich bei torry.net ein paar open-source-parser gesehen habe die die aufgabenstellung erfüllen dürften.

MfG
Nothine


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz