![]() |
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 |
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'); |
Re: boolesche Formel ausrechnen
:wall:
es war eigentlich so gedacht, dass die formel in einem string steckt, und dann ausgewertet werden muss. |
Re: boolesche Formel ausrechnen
Kann man einen String in einen Boolschen Ausdruck casten ???
|
Re: boolesche Formel ausrechnen
wenn es so einfach wäre, hätte ich nicht gefragt :)
|
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: |
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 :? |
Re: boolesche Formel ausrechnen
|
Re: boolesche Formel ausrechnen
ich weiß das sieht bescheuert aus :mrgreen: aber folgendes konstrukt funktioniert:
Delphi-Quellcode:
vielleicht hilft dir das ja weiter, wenn du es noch allgemeiner umschreiben willst :wink:
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; |
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? |
Re: boolesche Formel ausrechnen
Zitat:
Delphi-Quellcode:
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]
//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; //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 |
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.
|
Re: boolesche Formel ausrechnen
Hab vergessen zu erwähnen :
ich habe mal an mehrere Stellen im Internet gefragt: ![]() ![]() 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:
Zitat:
Es geht nur um die einfachsten Datentypen ohne Pointer. Also String, char, Integer, Boolean Zitat:
![]() 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:
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:
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. |
Re: boolesche Formel ausrechnen
Zitat:
|
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 |
Re: boolesche Formel ausrechnen
Zitat:
Freundlichst verbleibt, Nothine //Edit: ich hatte übrigens dazu geschrieben dass es nur eine anregung ist, nur so am rande bemerkt. |
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 |
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.
|
Re: boolesche Formel ausrechnen
ich denke mal es geht über das abarbeiten einer baumstruktur.
Postfix wäre ganz vielversprechend. |
Re: boolesche Formel ausrechnen
Zitat:
Hatte die Entschuldigung übrigens erst beim zweiten Durchblättern gesehen, Sorry meinerseits ^^ |
Re: boolesche Formel ausrechnen
Zitat:
|
Re: boolesche Formel ausrechnen
Zitat:
|
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 |
Re: boolesche Formel ausrechnen
Zitat:
![]() 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