Forum: Projekte & Code Auswertung eine boolschen Terms in JavaScript


von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Ich weiß nicht, ob das so recht hier her passt (für mich denke ich 
schon), aber es ist ein "Programmierprojekt"

Entstanden (aufgrund der "aktuellen Situation") im "Homework" 
Auszubildender, die grundsätzlich programmieren lernen sollen / müssen.

Um grundsätzliches vermitteln zu können wurde JavaScript gewählt.

Hieraus entstanden ist eine Art "Logikparser" für einen frei eingebbaren 
boolschen Term.

Da der Quelltext auf der Seite komplett mit der rechten Mousetaste 
einsehbar ist, hier nur der Link und ein Screenshot dazu.

http://www.jjflash.de/logic2/logic.htm

Evtl. kann das jemand gebrauchen oder hilft jemandem zum 
"experimentieren" mit logischen digitalen Verknüpfungen.

Viel Spaß und ... bleibt gesund.
1
Logik-Parser
2
-----------------------------------------------------------
3
4
Interpretiert den logischen Term in Eingabezeile <Bool-Term> und
5
erstellt hieraus die Wahrheitstabelle.
6
7
Eingabezeile <Anz. Input> gibt vor, für wieviele Eingänge die
8
Wahrheitstabelle erstellt werden soll.
9
10
Mittels eines Klicks auf die Leuchtdioden können die
11
Zustände an den Eingängen der Logik eingegeben werden, an
12
der Output-Led wird der Ausgang dargestellt
13
14
Ein Klicken auf <step> beendet das Setzen der Logik über das
15
anklicken der Leuchtdioden, stattdessen wird mit jedem weiteren
16
klicken auf <step> die Eingangszustände der Logik weiter geschaltet.
17
Ein Klick auf <manuell> beendet den Step-Zustand
18
19
<refresh> übernimmt die Eingaben in den Eingabezeilen und erneuert
20
die Wahrheitstabelle.
21
22
Der Ausgangspegel kann mit Hilfe der Checkbox <invertierter Output>
23
invertiert werden.
24
25
Erlaubte Zeichen:
26
   für die Eingänge     : a, b, c, d
27
   für AND  Verknüpfung : *,&, kein Zeichen
28
   für OR   Verknüpfung : +, |
29
   für NOT              : /, !
30
31
Reguläre boolsche Ausdrücke wären:
32
33
a /b + /a * b | c & /d
34
35
a /b + /a b + c /d

von Irgendwer (Gast)


Lesenswert?

Eijeijeijei...

Gibt mal im Feld "Anz. Inputs" folgendes ein:
1
     alert("Ich muss noch viel lernen!");

und drück auf den button "refresh".


Und danach lies das hier:

     https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Never_use_eval!

von Ralph S. (jjflash)


Lesenswert?

Irgendwer schrieb:
> Eijeijeijei...
>
> Gibt mal im Feld "Anz. Inputs" folgendes ein:
>      alert("Ich muss noch viel lernen!");
>
> und drück auf den button "refresh".
>
> Und danach lies das hier:
>
> 
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Never_use_eval!

Wäre ich jetzt nicht zu müde, würde ich nicht nur den Kopf schütteln, 
sondern extra für die Leute wie dich das Eingabefeld als String einlesen 
und eine Prüfung auf Gültigkeit vornehmen.

Hier ging es darum, grundsätzlich etwas auf zu setzen, in dem die 
Azubi's etwas ausgeben können.

Wenn man so etwas komfortabel macht, erklärst (und schon gar nicht über 
Videokonferenz und Audio) schon mal überhaupt nichts.

Naaaaaaaaatürlich macht man sich auch nicht den Umstand, einen 
Textbuffer aufzusetzen und alle Ausgaben (wenn man das möchte) in ein 
Stringarray auszugeben nur damit in der Textarea eine einfache 
Positionierung des Cursors erfolgen kann (okay, eine Positionierung im 
Buffer).

Uuuuuund ... das war etwas Funktionales zum Erklären boolscher Algebra 
über geteilte Bildschirme ....

Aber dennoch:

bleibt gesund !

von Irgendwer (Gast)


Lesenswert?

Ralph S. schrieb:
> Wäre ich jetzt nicht zu müde, würde ich nicht nur den Kopf schütteln,

Wegen so wenig Kritik schon gekränkt?


> sondern extra für die Leute wie dich das Eingabefeld als String einlesen
> und eine Prüfung auf Gültigkeit vornehmen.

Warum so umständlich?


> Hier ging es darum, grundsätzlich etwas auf zu setzen, in dem die
> Azubi's etwas ausgeben können.

Azubis sollte man ein Vorbild sein.


Auszüge aus Deinem Code:
1
   function set_infeld(nr, val)
2
   {
3
     var zahl;
4
5
     if (nr == 1)
6
       window.document.smallcon.infeld1.value= val;
7
     if (nr == 2)
8
       window.document.smallcon.infeld2.value= val;
9
     if (nr == 3)
10
       window.document.smallcon.infeld3.value= val;
11
     if (nr == 4)
12
       window.document.smallcon.infeld4.value= val;
13
   }
14
15
   function read_infeld(nr)
16
   {
17
     var zahl;
18
19
     if (nr == 1)
20
       zahl= eval(window.document.smallcon.infeld1.value);
21
     if (nr == 2)
22
       zahl= eval(window.document.smallcon.infeld2.value);
23
     if (nr == 3)
24
       zahl= eval(window.document.smallcon.infeld3.value);
25
     if (nr == 4)
26
       zahl= eval(window.document.smallcon.infeld4.value);
27
28
     return zahl;
29
   }
30
31
   function read_str_infeld(nr)
32
   {
33
     var str;
34
35
     if (nr == 1)
36
       str= window.document.smallcon.infeld1.value;
37
     if (nr == 2)
38
       str= window.document.smallcon.infeld2.value;
39
     if (nr == 3)
40
       str= window.document.smallcon.infeld3.value;
41
     if (nr == 4)
42
       str= window.document.smallcon.infeld4.value;
43
44
     return str;
45
   }
------------------------------------------------------------

Diesen Sermon kann man z.B eindampfen zu:

------------------------------------------------------------
1
function infeld(nr) {
2
  return window.document.smallcon["infeld" + nr];
3
}
4
5
function read_infeld(nr) {
6
  return parseFloat(read_str_infeld(nr));
7
}
8
9
function read_str_infeld(nr) {
10
  return infeld(nr).value;
11
}

von Irgendwer (Gast)


Lesenswert?

Ach set_infeld() hab' ich noch vergessen:
1
function set_infeld(nr, val) {
2
  infeld(nr).value = val;
3
}

von Ralph S. (jjflash)


Lesenswert?

Meine meine Güte,

hier geht es darum, jemanden, der noch nie etwas mit Computern zu tun 
hatte, ohne Vorbereitungszeit, Programmierung nahe zu bringen.

Du siehst weder den Auszubildenden, die Kommunikation ist schwierig, 
geht nur per Skype von statten und sie sind z.T. auch in der deutschen 
Sprache nicht sicher.

Ohne Vorbereitungszeit soll man einen Computerkurs abhalten. Du kennst 
die Rechnersysteme nicht, du konntest die Rechner auch nicht 
vorbereiten. Du brauchst etwas, das allen zu Verfügung steht und aus 
diesem Grunde fiel die Wahl auf JavaScript.

Hier geht es darum absolut grundsätzliches zu vermitteln. Die zu 
Unterweisenden kennen wirklich absolut nichts.

Also mußt du erst einmal erklären, was Variable sind... und du mußt 
erklären was eine bedingte Ausführung ist.

Du kannst denen nicht mit Objekten kommen und auch die HTML-Tags waren 
nicht so einfach zu vermitteln (weil das "Spiel" mit den Tabellen, deren 
Rahmen du nicht sehen kannst, verwirrend sind).

Also braucht es etwas, in das du etwas hinein programmieren kannst. Und 
es braucht für den Anfang etwas, um das zu erklären.

Im Normalfall würde man die Objekte schon gar nicht "kapseln", sondern 
ein neues davon ableiten (um nicht immer die genaue Methode oder 
Variable mit dem Overheat, der Klasse bla bla bla schreiben zu müssen).

Wenn du also erklärst, was If - Else ist... ist ein Beispiel gefragt.

Nächste Woche wird Switch-Case gemacht.

JavaScript hätte ich normalerweise für die Aufgabenstellung nicht 
gewählt. Das unsägliche eigentständige Casten der Typen bringt Fehler. 
Der Debugger aus Firefox ist umständlich zu bedienen... es liese sich 
vieles aufzählen.

Aber darum geht es nicht.

Die sind erst so weit, halbwegs IF, FOR und WHILE zu verwenden und dafür 
braucht es Beispiele (ob die in der Programmierpraxis so angewendet 
würden ist eine andere Fragestellung).

Es geht darum, was Logik ist (und das war ein Unterrichtsthema)... 
Daraus entstanden ist diese boolsche Algebra.

Wenn du hier sowas tust:
1
------------------------------------------------------------
2
3
Diesen Sermon kann man z.B eindampfen zu:
4
5
------------------------------------------------------------
6
7
function infeld(nr) {
8
  return window.document.smallcon["infeld" + nr];
9
}
10
11
function read_infeld(nr) {
12
  return parseFloat(read_str_infeld(nr));
13
}
14
15
function read_str_infeld(nr) {
16
  return infeld(nr).value;
17
}

Versteht kein Mensch dass hier:

  return window.document.smallcon["infeld" + nr];

dem Interpreter ein Cast bei nr selbst überlassen wird und nur dadurch, 
dass "infeld" ein String ist, wird nr hier zum String, auch wenn du der 
Funktion ein Integer übergeben hast.

Ich habe hier grundsätzlich das Problem zu erklären was Typen sind, 
sogar ein Problem damit, dass für den Computer alles Zahlen sind und ein 
Char "0" mit Ascii-Code 48 eben als solcher behandelt wird.

Ich habe die Seite eingestellt gehabt der Seite wegen... und nicht des 
Codes. Um aufzuzeigen wie boolsche Algebra funktioniert.

Als nächste Unterrichtseinheit habe ich Zahlensysteme auf dem Plan und 
weiß jetzt schon, dass das schwierig ist. Manche können noch nicht 
einmal verstehen, dass im Hexadezimalen "F", kein Buchstabe, sondern 
eine Ziffer ist.

Und dann habe ich unterschiedlichen Lernfortschritt, einer versteht 
bspw. das hier:
1
    /*  --------------------------------------------------------
2
                              printf
3
4
          ermoeglicht eine Ausgabe, aehnlich der, die in C#
5
          und nicht ganz in C gegeben ist. printf erlaubt
6
          bei der Uebergabe eine variable Anzahl Argumente
7
8
          Benutzung
9
10
          printf("Term: {0} * {1} = {2}",5, 2.1, 5*2.1);
11
12
          Ausgabe ist:  5 * 2.1 = 10.5
13
14
          {0} im Text wird durch das erste Argument nach
15
          dem Text (hier 5) ersetzt, {1} durch das zweite
16
          und {2} durch das dritte.
17
        -------------------------------------------------------- */
18
   printf = function()
19
   {
20
     var s = arguments[0];
21
22
     for (var i = 0; i < arguments.length - 1; i++)
23
     {
24
       var reg = new RegExp("\\{" + i + "\\}", "gm");
25
       s = s.replace(reg, arguments[i + 1]);
26
     }
27
     if (printf_use_buffer)
28
       txb_write(s);
29
     else
30
       write(s);
31
   }

Andere noch nicht einmal die Syntax wie man das verwendet (und aus 
diesem Grunde gibt es im Code auch ein "writeln")

Diese Seite ist eine Zusammenarbeit von 9 Auszubildenden die 
unterschiedliche Fortschritte machen.

Sie wurde erstellt um boolsche Logik "sichtbar" zu machen und zu zeigen 
was eine Wahrheitstabelle ist.

Andere könnten sie evtl. auch gebrauchen um zu sehen was mit 
Logikgattern passiert.

Sie ist nicht dazu da, den Code auseinander zu nehmen (das könnte man in 
der Tat eleganter machen, aber - und das ist das üble in der Zeit - 
niemand macht sich Gedanken darüber, wie bestimmte Grundzüge sind).

Wie man etwas eleganter machen kann ... oder besser machen kann. Kommt 
viel viel später.

Du hast schon ein Problem damit, dass Funktionen nicht aus einem 
Programmfluss heraus gestartet werden, sondern dass das eventgesteuert 
ist.

Aber es wird immer wieder welche geben, die sich freuen, wenn sie etwas 
"besser" können sie wie ein Aasgeier darauf zu stürzen und zu sagen, das 
kann man (also du selbst) bessr machen.

Wieviele absolute Anfänger hast du denn schon unterrichtet?

Bist du überhaupt noch in der Lage dich auf Anfängerniveau herab zu 
begeben.

Nächste Woche werden Zahlensysteme (um Farben für RGB zu mischen) dran 
genommen.

Ich weiß jetzt schon, dass etws in der Art:

r = 0xff;

r = r << 16;

extrem schwierig werden wird (vor allem hab ich hier von einem 
interessierten, der vorab gelesen hat, eine Frage in der Art, warum 
manchmal #ffffff davor geschrieben wird und im Programmcode dan 0x ... 
und warum 0x kein Text ist).

Und dann hast du das Problem, zu erklären, dass der Computer nicht mal 
in dezimal, mal binär, oder in hex rechnet (oder gar mit Texten), 
sondern dass er immer in binär rechnet).

Was mich extrem ärgert ist das hier:

Irgendwer schrieb:
> Azubis sollte man ein Vorbild sein.

Ein Vorbild im Programmieren erstellt einen Programmcode, der super ist. 
Aber von keiner Sau auf den ersten Blick zu durchschauen ist.

Ein Vorbild für Azubis ist, wer sich so weit herunterläßt, bis es - auf 
welcher Ebene auch immer - klick macht und ein Verständnis dazu kommt.

Wenn dann ein Satz in der Art kommt: ich habe hier immer wieder den 
gleichen Code, kann man daraus eine Funktion machen.

Dann ... freut es dich, weil du dann zu Funktionen kommst.

Für dich ist es vielleicht nicht ersichtlich, aber für einen Newbie ist 
es bisweilen schwierig zu verstehen warum:

function eins(nr)
{
  nr = 4;
}

function zwei();
{
  var nr;

  eins(nr);
}

Warum in Funktion zwei nr nicht den Wert 4 hat.

Wenn irgendwann einmal Corona vorbei ist... wird man sich mit C und dann 
mit C++ auseinandersetzen.

Du hier hast aber gezeigt, dass dich die Funktion der Seite einen sch*** 
kümmert, du bist jemand, der auch keine Spiele braucht, denn dein Spiel 
ist es (ich unterstelle noch nicht einmal böse Absicht) zu schauen, wo 
etwas nicht ganz hasenrein ist um dich selbst zu erhöhen und sich zu 
sagen: ich würde das besser machen.

Im Programmcode vielleicht ... (aber glaube mir, das kann ich dort auch 
besser), in der Ausbildung auch ?

Also verkneife dir etwas in der Art: Man sollte Vorbild sein, du bist es 
nicht !

von Ralph S. (jjflash)


Lesenswert?

Ach so, ja:

im Normalfall würde es auch nicht heißen:

read_infeld
set_infeld
read_str_infeld


das war der "Normalen Sprache" geschuldet. Im Normalfall (wenn es keine 
objektorientierte Sprache ist), würde man das so benennen:

infeld_read
infeld_set
infeld_read_str

Um zu verdeutlichen, dass hier alles zu "infeld" gehört... man das auch 
dann so tut, wenn es nur eine einzelne Funktion ist, um gleich zu sehen, 
zu welchem "Pseudoobject" sie gehört.

Für diejenigen des Kurses, die weiter waren, gab es deshalb:

txb_init
txb_show
txb_write

etc.

Du siehst, dass deshalb auch schon die Namenswahl einer Funktion 
problematisch sein kann !

Du kannst denen noch nicht erklären, dass man das so macht, damit, 
sollte da mal irgendwo anderst hin portiert werden, daraus ein

txb.init

gibt.

Das es Variable gibt, die nur zu diesem Objekt dann gehören... und 
Variable eines Objektes nicht direkt angesprochen werden, sondern du zum 
manipulieren einer Variable wieder eine externe Methode schreibst.

Diese Art und Weise ist der visuellen objektorientierten Programmierung 
geschuldet, bei dem du nur auf ein Objekt klickst und dann die 
Funktionalität reinprogrammierst.

Hierbei hast du dann so überhaupt gar nichts gelernt.

Didaktisch gehts vom Einfachen zum Komplexen ... von : super dass das 
geklappt hat und jetzt sehen wir mal, ob man das optimieren kann.

Das hast du scheinbar vergessen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.