Wow, ein recht ehrgeiziges Vorhaben, nach einem halben Jahr Erfahrung, aber durchaus umsetzbar.
Dein Problem besteht grob aus 3 Teilen.
Zunächst musst du eine geeignete Datenstruktur finden, auf der man Lösungsalgorithmen einfach anwenden kann. Danach einen parser schreiben, der den eingabestring in die datenstruktur übersetzt und letztendlich noch die Lösungsalgorithmen entwerfen.
Als Datenstruktur geht denk ich ne Klasse Equation, welche wiederum 2 Terme referenziert (links und rechts). Ein Term sollte ne abstrakte Klasse sein, von denen sich diverse n-stellige Operatoren ableiten (z.B. Constant, Variable, Sum, Product, Power, Sin, Cos, ...) und n member vom typ Term haben,. Terme sind also DAG's.
Für Term könnten folgende Methoden sinnvoll sein:
bool equivalent(Term*),
void applyOperator(SingleParameterOperator*),
virtual bool isConstant(),
virtual T calculate(),
virtual Term* removeConstantPart(),
virtual Term* removeVariablePart(),
virtual Term* simplify().
Der Lösungsalgorithmus müsste dann dafür sorgen, das nur der Linke Term isConstant() == true ist (die methode soll feststellen, ob der Term keine Variable enthält, indem er den DAG traversiert). Anfangs ist das natürich nicht so. Also rufst du links extractConstantPart() auf diese Methode liefert dir dann einen einstelligen operator, oder NULL, wenn es nicht möglich ist. Dieser operator muss die konstanten in dem term eliminieren. Du wendest ihn also auf beide terme der gleichung an (applyOperator()).
Das gleiche machst du für die andere seite mit den Variablen. Nun wirst du feststellen, dass es nicht immer ganz einfach ist diesen Operator zu finden. Um das zu erleichtern gibt es die Methode simplify(). Diese soll den term vereinfachen (zum beispiel bei einer summe dafür sorgen einen eqivalenten term finden, bei dem einer der summanden keine variablen enthält) damit der algorithmus in extract es immer mit dem trivialfall zu tun hat.
Ich denke die umsetzung dieses konzeptes ist für gleichungen, die nur aus summen und produkten bestehen noch relativ einfach und es lässt sich durch den rekursiven Ansatz sogar bishin zu komplexer Lösungslogik erweitern.
Das war jetzt nur mal nen kurzes brainstorming, ich hab sowas noch nie implementiert und weiss nicht, wie weit man wirklich damit kommt. Wär nett, wenn hier ne kleine diskussion darüber entsteht
Alternativ könntest du mal schaun, ob du offenen source für das problem fndest, bei dem du abgucken kannst.