Gedankenanstoss zum Verrechnen von verschachtelten Klammern als C Programm
-
Hallo
Ich stehe vor einer kleinen Herausforderung. Ich soll nämlich verschachtelte Klammern vereinfachen und ausrechnen können. Dies soll per C gelöst werden. Ich habe mir ein paar mögliche Kombinationen aufgeschrieben und nach Ähnlichkeiten/Unterschiede gesucht, das ist rausgekommen:
(2+(2+2)) Die Klammer kann aufgrund niederrangigen Operatoren vor der Klammer verrechnet werden (Man beachte dann einfach ein Minus direkt vor der Klammer) (2*(2+2)) Die Klammer muss vor dem Multiplizieren ausgerechnet werden
Nun, das schaffe ich auch alleine, aber das Problem ist zB das hier:
(2+((2+2)+(2+2)))
Die beiden (2+2) sind ja sozusagen gleichgestellt. Ich könnte es ausrechnen, wenn die Klammern gleichmässig verschachtelt sind (In einer Klammer immer nur eine neue Klammer, nicht zwei wie hier).
Hier sind sie ja wie oben geschrieben unregelmässig, heisst im Sinne, es gibt in einer Klammer 2 Unterklammern.Mein Problem ist nun, wie kann ich diese "unregelmässigen" Gebilde behandeln ? Hat mir hier jemand ein paar Tipps ?
Bei regelmässigen mache ich das so:
- Bestimme Anzahl Klammern bis die Hauptendklammer kommt
- Gehe zur Klammer in der Mitte, da sie zuerst ausgerechnet wird
3)Füge diesem Wert links und rechts den Inhalt bis zur vorherigen/nächsten Klammer hinzu, der in der richtigen Rechnung ist - Berechnen
- Gegebenenfalls 3 und 4 wiederholen
Ein Beispiel wäre:
Rechnung: (1+(2+(3+4)+2)) Anfang: (3+4) = 7 (2+7+2) = 11 (1+11) = 12 (Resultat)
Diese Rechnung stellt wie gesagt kein Problem dar, aber ich habe ein Problem hier:
(2+((2+2)+(2+2)))
Das Finden der "Mitte" ist hier mein Problem, da die beiden 2+2 sozusagen gleichgestellt sind (Gleiche Priorität). Ich hoffe, trotz meiner etwas unkonkreten Frage einen Gedankenanstoss zu erhalten.
Gruss
-
Ich gebe mal einen grafischen Tipp, der nicht nur für die Klammerung sondern allgemein zum Parsen von Mathematik gut ist:
1 + ((2 + 3) + ((4 + 5))+ / \ + 1 / \ + + / \ / \ 2 3 4 5
Klingelt da irgendetwas, wenn ich das so schreibe?
-
Hallo
Das Zusammenfassen des Inhaltes einer Klammer oder Bereich stellt kein Problem dar, nur ist mein Problem das Finden bei 2 Unterklammern in einer Klammer (Sozusagen der Startpunkt, da ich in der Klammer mit der höchsten Priorität anfange). Ich könnte natürlich 2 verschiedene Codes schreiben, was ich aber nicht möchte (Auch weil zB beide Arten vorkommen können).
Ich sollte den Weg vom Ausrechnen einer Klammer ohne Unterklammern einschlagen, diese dann der höhergeordneten Klammer anfügen/einfügen und so weiter, bis ich die erste öffnende Klammer erreicht habe
Gruss
-
Kannst du mal beschreiben, was du mit "vereinfachen und ausrechnen" genau meinst? Deine Beispiele kann man auch leicht ausrechnen, ohne sie vorher zu vereinfachen. Das Ausrechnen ist das Vereinfachen.
-
Stichwort: Kellerautomat
-
Hallo
@Bashar
Momentan erfasse ich die Anfang- und Endposition einer Klammer und berechne dann den Inhalt dazwischen. Bei den 4 Grundrechenarten ist das wie Du sagst nicht wirklich schwierig, beachte aber, wenn zB trigonometrische Funktionen, Wurzel oder Potenzen (von Wurzeln) vorkommen.zB wird der Sinus ja auch mit einer Klammer geschrieben. Momentan errechne ich den Klammerinhalt und schaue ob vor der Klammer sin steht, dann wird die Sinusfunktion mit dem Wert aus der Klammer ausgerechnet.@knivil
Ok, tönt interessant, guck ich mir an. Dank dirGruss
-
Threadcore schrieb:
@Bashar
Momentan erfasse ich die Anfang- und Endposition einer Klammer[...]Ich wollte nicht wissen, wie deine Lösung funktioniert, sondern welches Problem du lösen willst.
-
Hallo
@Bashar
Ich wollte eine einfache Möglichkeit, zwischen den gleichgestellten und einzelnen Klammern zu entscheiden. Ich wollte die gleichgestellten in einem Rutsch durchrechnen lassen.Die Lösung ist jetzt, ich lasse die Funktion sich selber neu aufrufen, so kann man zB etwas wie dies rechnen:
sin((45+(((acos(0)-45))*1))) = 1
rechnen
Der Kellerautomat hat dazu auch beigetragen. Danke für den Hinweis.
Gruss
-
Threadcore schrieb:
Ich wollte eine einfache Möglichkeit, zwischen den gleichgestellten und einzelnen Klammern zu entscheiden. Ich wollte die gleichgestellten in einem Rutsch durchrechnen lassen.
Du redest ja immer noch von deiner Lösung.
Aber wie es aussieht, willst du tatsächlich nur Ausdrücke ausrechnen lassen. Das ist ein Standardproblem, für das es viele Lösungen gibt. Hört sich so an, als wärst du jetzt auf Parsen durch rekursiven Abstieg gekommen. Gute Variante.