Mathe-Term-Parser
non js-master
- programmiertechnik
Hallo zusammen,
ich möchte für meine Internetseite mathematische Terme per Zufall Übungsblätter zu bestimmten Themen erstellen. Ein Thema wäre Potenzrechnung. Da ich aber nicht nur die Aufgabe, sondern auch die Lösung (noch besser wäre der Weg) anzeigen möchte, stoße ich auf Probleme.
Bis jetzt erzeuge ich per Zufall Terme.
http://www.ingo-bartling.de/mathe/klasse10/html/terme/intro.html
Der Term ist ein String, der einfach immer länger wird. Die Idee war dabei: aktTerm = aktTerm + neueOperation() + neuerTerm.
Der Term ließe sich zwar noch auswerten, wenn nur "Mal genommen" wird, aber bei Verschachtelungen der Art a^2:(b^3:c^4) stoße ich schon an Probleme. Ich werde also irgendwie den Term anders aufbauen müssen und nur für die Ausgabe in einen String umwandeln. Die Frage ist jetz nur: Wie speichere ich den aktuellen String? Naheliegend wäre eine Baumstruktur. Jetzt weiß ich zwar, dass man Graphen mit Matrizen speichern kann und damit natürlich auch einen Baum, aber bei der konkreten Umsetzung hapert es, denn die Knoten des Baums bestehen aus kleinen Bäumen: (Operation, Term1, Term2).
Kann mir jemand eine Tipp geben? Vielleicht hat jemand so eine Matheparser schon mal geschrieben oder weiß wo es so etwas gibt, oder kennt die Theorie hinter solchen Parsern.
Denn eigentlich kann das doch nicht so schwierig sein, da mathematische Ausdrücke doch sehr strukturiert sind.
Hallo,
Jetzt weiß ich zwar, dass man Graphen mit Matrizen speichern kann und damit natürlich auch einen Baum, aber bei der konkreten Umsetzung hapert es, denn die Knoten des Baums bestehen aus kleinen Bäumen: (Operation, Term1, Term2).
Kann mir jemand eine Tipp geben? Vielleicht hat jemand so eine Matheparser schon mal geschrieben oder weiß wo es so etwas gibt, oder kennt die Theorie hinter solchen Parsern.
Denn eigentlich kann das doch nicht so schwierig sein, da mathematische Ausdrücke doch sehr strukturiert sind.
Vielleicht hilft dir der Artikel unter http://aktuell.de.selfhtml.org/artikel/javascript/squarematrix/ ?
Grüße
Thomas
Sieht sehr interessant aus. Ich werde es bestimmt auch mal brauchen.
http://aktuell.de.selfhtml.org/artikel/javascript/squarematrix/ ?
Für den Moment habe ich allerdings versucht alles über Objekte zu machen. Dabei schaffe ich es aber nicht einmal über ein Problem hinweg zu kommen: "too much recursion"
Woher kommt die?
Folgender Code liegt bislang vor:
/*******************************/
function Term() {
this.firstOperand = null;
this.secondOperand = null;
this.operation = "";
}
Term.prototype.getFirstOperand = function() {return this.firstOperand;};
Term.prototype.setFirstOperand = function(sOperand) {this.firstOperand = sOperand};
Term.prototype.getSecondOperand = function() {return firstOperand;};
Term.prototype.setSecondOperand = function(sOperand) {this.secondOperand = sOperand};
Term.prototype.getOperation = function() { return firstOperand;};
Term.prototype.setOperation = function(sOperation) {this.operation = sOperation};
Term.prototype.build = function() {
//alert(typeof this.firstOperand );
if (typeof this.firstOperand == "object") var sFirst = this.firstOperand.build(); else var sFirst = this.firstOperand;
if (typeof this.secondOperand == "object") var sSecond = this.secondOperand; else var sSecond = this.secondOperand;
return sFirst+this.operation+sSecond;
};
/*******************************/
Damit erzeuge ich ein Termobjekt.
Jetzt erzeuge ich den Ausdruck.
/*******************************/
function rnd(u,o) {
return Math.floor(Math.random()*(o-u+1))+u;;
}
function getNumber() {
var newNumber = rnd(0,20);
if (rnd(0,100)>60 && params['type']=='fraction') {
newNumber *= -1;
}
return newNumber;
}
function getVariable() {
var posssibleVariables = "abcmn";
return posssibleVariables.split("")[rnd(0,posssibleVariables.length-1)]
}
function getSimpleTerm() {
return getVariable()+"^"+getNumber();
}
function getCalc() {
var resultString = "*";
return resultString;
}
function buildTerm() {
var curString = new Term();
curString.setFirstOperand(getSimpleTerm());
curString.setSecondOperand(getSimpleTerm());
curString.setOperation(getCalc());
curString.setFirstOperand(curString);
curString.setSecondOperand(getSimpleTerm());
curString.setOperation(getCalc());
return curString.build();
}
/*******************************/
Wieso kann ich den Term nicht rekursiv ausgeben?
Shame on me,
ich habe meine Klassendefinition fehlerhaft gehabt. korrekt lautet sie:
function Term() {
this.firstOperand = null;
this.secondOperand = null;
this.operation = "";
}
Term.prototype.getFirstOperand = function() {return this.firstOperand};
Term.prototype.setFirstOperand = function(sOperand) {this.firstOperand = sOperand};
Term.prototype.getSecondOperand = function() {return this.secondOperand};
Term.prototype.setSecondOperand = function(sOperand) {this.secondOperand = sOperand};
Term.prototype.getOperation = function() { return this.operation};
Term.prototype.setOperation = function(sOperation) {this.operation = sOperation};
Term.prototype.build = function() {
var sFirst = null;
var sSecond = null;
if (typeof this.firstOperand == "object") {
sFirst = this.firstOperand.build();
} else {
sFirst = this.firstOperand;
}
if (typeof this.secondOperand == "object") {
sSecond = this.secondOperand.build();
} else {
sSecond = this.secondOperand;
}
return sFirst+this.operation+sSecond;
};
Mein Problem ist, dass wenn der erste Operand ein Object ist, dass das aufrufende Objekt wieder für den Aufruf genommen wird und nicht das Objekt, dass als erster Operand definiert. Daher kommt meine Endlosschleife. Allerdings verstehe ich nicht, wo ich den Fehler gemacht habe.
Hi,
Kann mir jemand eine Tipp geben? Vielleicht hat jemand so eine Matheparser schon mal geschrieben oder weiß wo es so etwas gibt, oder kennt die Theorie hinter solchen Parsern.
Denn eigentlich kann das doch nicht so schwierig sein, da mathematische Ausdrücke doch sehr strukturiert sind.
Ich befuerchte da einen Irrtum Deinerseits :-)
Selbst ein einfacher Mathematikparser ist schon recht kompliziert.
so short
Christoph Zurnieden