2017-11-25 4 views
2

Ich habe Probleme mit Umsetzung einer Reihenfolge der mathematischen Operationen Regel in meinem Code. Ich habe 2 Arrays. Array von Matrizen (bis zu 100 Matrizen) und Array von Operationen (bis zu 99 Operationen). Die Operationen sind nur Addition, Subtraktion und Multiplikation von Matrizen (dargestellt durch + - *).Algorithmus für die Reihenfolge der Operationen in Mathematik

Meine Matrizen sind eine Struktur, aber das ist nur ein Detail. Ich habe funktionierende Funktionen für alles, was sie betrifft.

Ich habe auch eine Funktion zum Ausführen der Operationen.

struct Matrix compute(struct Matrix mat1, struct Matrix mat2, char op) 

Die Funktion hat einen Schalter, der die Operation bestimmt und die richtige ausführt.

Das Stück Code, den ich verbessern muss, ist dieser.

// counter = number of matrices in the array 
// therefore there's also counter-1 operations 

struct Matrix temp = compute(matrices[0], matrices[1], operations[0]); 
for(int j = 1; j < counter; ++j) 
{ 
    temp = compute(temp, matrices[j+1], operations[j]); 
} 
get_matrix(temp); //outputs the matrix to stdout 

Im Moment wertet dieser Code korrekt alle Sequenzen von Matrizen und Operationen, die Multiplikation nicht enthalten (vorausgesetzt, die Eingabe korrekt war und Operationen ausgeführt werden können).

Was brauche ich? Ich brauche einen Tritt in den Hintern in die richtige Richtung.

+0

Wollen Sie sagen, dass Sie eine Möglichkeit benötigen, die Reihenfolge der Operationen in einem Ausdruck zu erzwingen, in dem Operanden Matrizen sind? Und gegenwärtig versagt es für die Multiplikation z.B. '1 + 2 + 4 * 0' ergibt" 0 ", wenn die Operanden Zahlen sind? – Miket25

+0

@ Miket25 Ja, genau das sage ich. Offensichtlich gibt es auch ein Speicherleck in diesem Teil des Codes (Matrizen werden dynamisch zugewiesen), obwohl ich die Temperaturmatrix nur 2 Zeilen unter dem gezeigten Code freigebe. Aber das ist ein Problem, das ich später lösen kann. – Welsy

+0

Forschungsgebäude ** abstrakte Syntaxbäume **. Knoten in diesem Baum sind Matrizen und Operanden. Sie evakuieren dann rekursiv diesen Baum, wodurch die Reihenfolge der Operationen erreicht wird. Ich empfehle ** rekursives Abstiegs-Parsing **; es ist leicht zu lernen. Sie können gute Beispiele online auf Bestellung von Operationsrechnern durch rekursives Sinkflug analysieren und für dieses Problem anwenden. – Miket25

Antwort

2

Ein einfacher Ansatz besteht darin, einmal durch die Sequenz von Matrizen zu gehen und nur Multiplikationen auszuführen. Erstellen Sie eine neue Sequenz aus Matrizen, nachdem Multiplikationen angewendet wurden. Zum Beispiel ist, wenn die Anfangssequenz wie diese

|A| * |B| + |C| * |D| * |E| - |F| + |G| * |H| 

der Sequenz Multiplikationen nach der Verarbeitung würde wie folgt aussehen:

|A*B| + |C*D*E| - |F| + |G*H| 

Dies würde alle Multiplikationen aus der Sequenz entfernen, Sie zu einem Problem mit sich bringt, dass Sie weiß schon, wie man es löst.

Anmerkung: Der Code hat eine Off-By-One-Error: Wenn j bis counter, matrices[j+1] Referenzen ein Element einen über das Ende des matrices[] Array gleich ist.

Sie können dies beheben, indem Sie j+1 < counter innerhalb der Schleife überprüfen. Ein anderer Ansatz besteht darin, matrices[0] in temp zu kopieren, anstatt die anfängliche Operation außerhalb des Bereichs auszuführen. Auf diese Weise können Sie j bei Null starten, um sicherzustellen, dass der Code auch für den "entarteten" Fall einer einzelnen Matrix funktioniert.

+0

Danke, die erste Speicherlösung hat den Trick gemacht, es gibt kein Speicherleck mehr, daher bleibt nur das ursprüngliche Problem - die Reihenfolge der Operationen :) – Welsy

+0

Auch - das ist eine schlaue Idee, wie habe ich darüber nicht nachgedacht. Ich denke, ich werde versuchen, das zuerst zu implementieren, bevor ich die oben vorgeschlagenen Lösungen erforsche. – Welsy

+0

@Welsy Abstrakte Syntaxbäume würden benötigt, wenn Sie Klammern hätten. Da Ihr Fall so einfach ist, sollte die einfache Multiply-First-Lösung funktionieren. – dasblinkenlight

Verwandte Themen