• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Schaltnetz mittles Formularfeldern visualisieren

afoeder

New member
Hallo zusammen,

ich hab' hier 'was ganz krasses vor, aber bin zu blöde dafür und hoffe hier Befruchtung zu finden :)

Abstrakt ausgedrückt möchte ich Boolesche Schaltnetze mittels Radiobuttons und Checkboxen abbilden.

Konkret heißt das: ich habe beispielsweise vier Optionen, A, B, C und D.
Jetzt sollen zum Beispiel A, B und C wahlweise ausgewählt und D optional dazu gesetzt werden.
Also:

( ) A
( ) B
( ) C
[ ] D

sozusagen. Soweit so gut. Das ganze soll aber variabel sein. Ich möchte also die Schaltregeln mittels einer Formel abbilden.

Die wäre im Beispiel

ABC v ABC v ABC

(normalerweise ist die Unterstreichung natürlich als Überstreichung zu sehen :))
Da D in jeder Variante optional ist, kann das getrost weggelassen werden.

Ich möchte aber einfach nur die Formel angeben und der Code soll dann selbst die radiobuttons und checkboxen je nach Notwendigkeit daraus formen. Das schwierigste ist, dass je nach Auswahl die Optionen dann einmal radio- und einmal checkboxen sein können.

Ich hoffe ihr wisst erstmal, was ich meine und möchte und ob ihr eine Idee habt.

Meiner Meinung nach *müsste* das machbar sein, es folgt klaren Regeln, also muss es programmiertechnisch umsetzbar sein.

Habt ihr eine Idee dazu?


//Noch ein Nachtrag...
an sich dürfte es einfacher sein, einfach mal mit dem Rendern von ausschließlich Checkboxen anzufangen und diese dann nach Klicken zu prüfen. Also beim Anklicken einer Checkbox läuft der Code über die Gruppe der Checkboxen und prüft und setzt gegen die Formel. So muss man nicht schon vorher entscheiden, ob und wie man Radiobuttons setzt.
Allerdings leidet die Bedienbarkeit darunter, da der User nicht sehen kann, wie die Schalter zusammenhängen...


Danke und Grüße,
adrian
 
Zuletzt bearbeitet:
ich versteh dein Problem nicht so ganz. Du gibst deinen Script ABC v ... zu fressen und was genau soll es daraus machen?
 
konkret soll das Script dann die Elemente aktivieren bzw. deaktiveren, die unter den "geklickten Umständen" nach Formel eben zu aktivieren oder zu deaktivieren sind.

Wenn ich also B auf 1 klicke, sollen die anderen abhängig davon reagieren und sich entweder auch aktivieren, deaktivieren oder disablen oder beides, was eben angebracht ist.

Die erste Idee wäre, den Wert in die Formel einzusetzen.
setze ich also B = 1 in die Formel, bleibt
!A übrig und ich weiß, dass A dann in diesem Falle deaktiviert sein *muss*. Die Frage ist nur, wie ich das parsen und auslesen kann etc. und ob das der richtige Ansatz ist.

Grüße,
Adrian
 
Hm, also ich kenn diese Schaltnetzformeln eigentlich gar nicht. Und irgendwie kommt mir die Formel "ABC v ABC v ABC" für dein Beispiel nicht logisch vor.
Meinst du im Beispiel, dass entweder (A oder B oder C) und D ausgewählt werden können ? Dann wäre meiner Meinung nach die Formel irgendwie so: "AD ^ BD ^ CD". Aber wie gesagt, ich kenn das nicht.

Eines ist klar du kannst nichts Überstrichenes in einem String schreiben, also brauchst du irgendeine andere Art und Weise wie du das markierst. Etwas so:
A!B!C v !AB!C v !A!BC
 
Hoi Slosd,

zunächst, da Du diese Art der Notation nicht kennst:

Digitale Schaltungstechnik/ Schaltalgebra/ Einleitung - Wikibooks

soll keine Klugscheißerei sein, vielleicht bist Du ja interessiert.


Dass ich keine überstreichungen in Strings verwenden kann ist mir höflich gesagt klar. Für die Anwendung im Programmcode habe ich z.B.
Code:
a&&!b || !a&&b
verwendet.

Ich bin nun schon einmal soweit, zumindest eine "Ist in Ordnung"-Prüfung der Schalter zu haben.
Wer möchte, kann es mal bei sich lokal pasten und ausprobieren:
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head>
	<title>Schaltetzwerk</title>
<script language="JavaScript" type="text/javascript">
function validate()
{
    var theFormula = document.getElementById("formula").value; //String! e.g. "a&&!b || !a&&b"
    
    var a = document.getElementById("a").checked;
    var b = document.getElementById("b").checked;
    var c = document.getElementById("c").checked;
    var q = eval(theFormula);
    
    with(document.getElementById("result")) { //set "traffic light"
        style.color = "white";
        style.backgroundColor = (q ? "green" : "red");
        value = (q ? "OK" : "NOK");
    }
}
</script>
</head>

<body>
<input type="checkbox" name="a" id="a" value="" onClick="validate();" /> A<br />
<input type="checkbox" name="b" id="b" value="" onClick="validate();" /> B<br />
<input type="checkbox" name="c" id="c" value="" onClick="validate();" /> C<br />
<input type="text" name="result" id="result" value="" /><br />
<input type="text" name="formula" id="formula" value="a&&!b || !a&&b" style="font-family:Courier New;font-size:9pt;" /><br /><br />
<a href="javascript:validate();">revalidate</a>


</body>
</html>

Jetzt ist noch die Schwierigkeit, den Checkboxen den Status zuzuweisen, ob sie unter der derzeitigen Schaltsituation geschaltet werden dürfen oder nicht. Ich habe mir überlegt, ob ich nicht nach einem Schaltvorgang über die Schalter grase, die übrig sind, und dann mittels Code *ausprobiere*, ob ein Verändern derer Status das Endergebnis auf "NOK" setzen würde. Wenn das der Fall wäre, würde ich die Checkbox dann disabeln.
Das würde so funktionieren und ist bis auf weiteres die beste Möglichkeit, die mir bisher eingefallen ist...

Viele GRüße,

Adrian
 
Dass ich keine überstreichungen in Strings verwenden kann ist mir höflich gesagt klar. Für die Anwendung im Programmcode habe ich z.B.
Code:
a&&!b || !a&&b
verwendet.
Also ich finde den Ausdruck nicht sonderlich gut lesbar, außerdem würde ich anmerken wollen, dass man sich schon auf eine standardisierte/genormte Schreibweise einschießen sollte. Und das wären Klammern, bzw. sogar Klammerebenen

A!(BC) v !AB!C v !(AB)C

tendentiell würde ich auch eher zur amerikanischen Schreibweise greifen:
A * !(B * C) + !A * B * !C + !(A * B) * C
Dafür kannst Du dann einen Parser schreiben, der die einzelnen Token ausliest und verarbeitet, um daraus einen Baum zu bauen. Diesen Baum kannst Du dann direkt zum Aufbau Deines Schaltbildes verwenden.

Für A!(BC) bzw. A * !(B * C) würde der Baum dann folgendermassen aussehen:
Code:
   *
  /  \
A     !
      |
      *
     /  \
   B     C
Mit Hilfe des Baumes kannst Du dann auch die einzelnen Ergebnisse berechnen.
Das Optimieren nach der Eingabe hin zu einem verkürzten Ausdruck ist natürlich etwas tricky, aber möglich. z.B. eine Konvertierung von
Code:
   *
  /  \
A    * 
     /  \
   B     C
zu
Code:
    *
  / | \
A  B   C
ist möglich, wobei A, B und C jeweils wieder für einen komplexen Teilbaum oder eine Eingangs-Variable (=Blatt) stehen können.
Das hängt aber von der Datenstruktur Deines Baumes ab, ob sowas möglich ist.

Mein Post ist nur sehr oberflächlich/allgemein gehalten, das beschriebene Vorgehen mit einem Parser und einer Baumstruktur ist der informatische Ansatz. Du kannst sicherlich auch eine "Schätzlösung" entwickeln, die die Ausdrücke in 50-90% der Fälle korrekt erkennt und ein entsprechendes Schaltbild erzeugt, aber Du wirst sehen, dass die Abfragen kompliziert und verschachtelt sein werden, wohingegen ein Baum klar und einfach ist. Auch ist mein Vorschlag nicht auf eine bestimmte Anzahl an Eingangsvariablen gebunden, es könnten mehrere hunderte oder mehr sein, in wie weit das sinnvoll ist, ist eine andere Frage.
 
ich hatte schon gehofft, Albu, dass Du Dich auch einmal des Themas annimmst, da ich schon einge verwandte Posts von Dir gesehen habe und ich mir denken konnte, dass Du dazu etwas interessantes zu sagen hast :)


Prinzipiell eine coole Sache mit dem Baum, ich wusste garnicht, dass man das auch so darstellen kann.
Da die Programmier-Schreibweise mit && und ! und || tatsächlich nicht sehr schön ist, habe ich mir in der Tat überlegt, vorher einen Umwandler zu schreiben, der die US-Syntax oder eine Eigen-Syntax entgegennimmt und eben Maschinenparser-Syntax draus macht.

Eigen-Syntax wäre zum Beispiel
^ für Und
v (vau) für Oder
° für Not (dann wäre aber / oder ! genausogut)


Nichtsdestotrotz möchte ich nochmal sichergehen, dass meine eigentliche Problematik lediglich die ist, dass ich in HTML Checkboxen miteinander vernetzen möchte, mit Hilfe einer zugrundeliegenden Formel. Ich glaube irgendwie, das ist ein wenig aus den Augen verloren...


Danke und GRüße,

adrian
 
Nur, damit ich das richtig verstehe: die Checkbox- und Radio Buttonelemente sollen die Eingangsparameter darstellen, die Du dann bei den verschiedenen Experimenten und mit unterschiedlichen booleschen Ausdrücken setzen oder löschen möchtest, um zu sehen, was hinten, bzw. in den einzelnen Zwischenschritten rauskommt?

Um das zu erreichen, d.h. die Eingabeelemente (Checkboxen, Radiobuttons, oder was auch immer) miteinander zu vernetzen und anhand eines variablen booleschen Ausdrucks anzusteuern, musst Du Deinem Programmcode als erstes beibringen den Ausdruck in maschinenlesbare und -verwertbare Form zu bringen. Der erste Schritt ist also der Parser und die Baumstruktur.
Wenn Du das hast, dann ist der Rest quasi ein Kinderspiel, weil Du aus der Baumstruktur direkt die einzelnen Primitiv-Schaltbilder (UND, ODER oder NICHT-Gatter) und ihre Verbindungen auslesen kannst. Die Berechnung des Ergebnisses auf Wunsch auch Teilergebnisse) bei vorgegebenen Eingangsvariablen ist ebenfalls eine einfache, rekursive Funktion.
Das einzigste, was ein bißchen tricky wird, ist das Anordnen der einzelnen Primitiv-Schaltbilder zu einem großen Schaltbild, so dass alle Verbindungen korrekt gezeichnet werden.

Wenn z.B. jeder Knoten (d.h. ein Eintrag im Baum mit mindestens einem Anhang) den Namen des zuständigen DIVs erhält, so kann er dieses bei der Berechnung auf das aktuelle (Teil-)Ergebnis setzen. Die Eingangsvariablen können nach dem Parsen direkt aus dem Baum abgerufen werden, es sind die Blätter (d.h. Eintrag im Baum ohne Nachfolger, sprich ganz unten im Baum). So kann man die Liste der benötigten Eingangsvariablen dynamisch halten.
 
Zurück
Oben