eval string Minuszeichen

Dafür erzeuge ich strings wie im obigen Beispiel.
Wenn ich das lese, vermute ich dass dir die Zahlen und die Operatoren am Anfang getrennt und die Zahlen in numerischer Form bereit stehen. Dann sollte es kein Problem sein, die Berechnung ohne den Umweg über den String und eval in einer Schleife auszuprogrammieren?
 
Genau, @Sempervivum hat Recht! Der Algorithmus muss nur über 3 Zustände Bescheid wissen:
  1. Erster Operand wird erwartet (eine Zahl)
  2. Operator wird erwartet (+, -, *, /)
  3. Zweiter Operand wird erwartet (eine Zahl)
In Zustand 1 liest du solange, bis das nächste Zeichen keine Ziffer mehr ist und speicherst dann den gelesenen Operanden als Integer (siehe parseInt) irgendwo. In Zustand 2 liest du nur ein einzelnes Zeichen und speicherst, welche Operation du durchführen möchtest. Das muss im Prinzip in eine Variable gespeichert werden, dessen Typ vierwertig ist, weil du +, -, * und / hast. Du könntest da z. B. einfach Strings verwenden: "operator = '*'". (Für Fortgeschrittene: speichere es als Funktion.) In Zustand 3 machst du dasselbe wie in Zustand 1, aber nach dem Einlesen führst du nun die Operation durch und gehst danach wieder in Zustand 1.

Ich hoffe du kannst erkennen, dass das zu einem größeren Switch-Case oder If-Else ausarten wird ;)
 
Hi,

letztendlich bediene ich mich genau den Zuständen, die @ComFreek beschrieben hat. Ich handel diese lediglich in einem ternären Operator ab. Weiterhin nutze ich aus, dass eine einzelne Zahl ebenfalls mit eval ausgewertet werden kann. Die Reduktion auf einen einzelnen Wert (hier der Ergebnisstring bzw. das Ergebnis) erfolgt über die Array-Methode reduce.

Vielleicht kannst du mit dem kommentierten Quellcode mehr anfangen:

Javascript:
"3 + 4 *5 - 6 +2 "
    // teilt den String mit Hilfe eines regulären Ausdrucks in ein Array,
    // dessen Komponenten zwischen Zahl und Operator wechseln: ["3", "+", "4", "*", "5", "-", "6", "+", "2"]
    .match(/(\d+)|([\+\*\-\/\:])/g)
    // reduce reduziert ein Array auf einen einzigen Wert (siehe: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)
    .reduce((accu, curr) => {
        return isNaN(curr)  // Handelt es sich beim aktuellen Element NICHT um eine Zahl
            ? (accu + (curr === ':' ? '/' : curr)) // keine Zahl => Operator an aktuellen String anhängen
            : eval(accu + curr)                    // aktuelle Zahl an String anhänen und auswerten (eval)
    });

Ciao
Quaese
 
Hallo Sempervivum,

es ist so wie du den Ausgangszustand beschrieben hast. Ich würde gerne dazu lernen wie das so einfach erledigt wird. OHNE Schleife.

GuG

Joachim
 
Dann beschreibe doch mal, in welcher Form die Zahlen und Operatoren vorliegen. Ich hatte vermutet, in einem oder zwei Arrays, aber wenn Du schreibst "ohne Schleife", dann in getrennten Variablen?
 
Weiterhin nutze ich aus, dass eine einzelne Zahl ebenfalls mit eval ausgewertet werden kann.
Aber darf ich fragen warum? :) Das ist unsicher*, langsam, macht den Code schwerer lesbar und ist semantisch inkorrekt.

*) Auch wenn du vorher mit regulären Ausdrücken zusicherst, dass es nur Zahlen sind, so kann ein verunglücktes Refactoring immer Bugs einführen, die doch dazu führen, dass andere Daten in das eval gelangen könnten.
 
Ich erzeuge den String in einer Schleife.
In der generiere ich eine Abfolge per Zufall : Zahlt, Operand, Zahl, Operand, Zahl....

ich könnte auch zunächst ein Array mit Zahlen und ein Array mit Operanden erzeugen, und dann den String erstellen ich hätten dann so etwas wie
zahlen = [5,5,8,2,6,9,3]
operand=["+", "+", "**,"*","-"],.
wenn es mir dann hilft.
GzG
Joachim
 
Wenn Du ohnehin die Parameter in einer Schleife erstellst, kannst Du auch gleich die Berechnungen durchführen, etwa so:
Code:
Ergebnis = Zufallszahl
Schleife
    Zufallszahl erzeugen
    Zufallsoperator erzeugen
    Ergebnis und aktuelle Zufallszahl entspr. akt. Operator verknüpfen
 
Zurück