String ändern



  • hey leute, habe ne kleine frage.

    ich habe einen String sCache und der beinhaltet z. b. "12*12/2*2" eine rechnung, wie kann ich diesen auslesen und einfach ausrechnen und dann die lösung bekommen, in einem string kann man ja nicht rechnen, also muss ich diesen eifach irgendwie anders haben.
    versteht ihr was ich meine?

    thx für eure antworten



  • Du könntest beispielsweise den String splitten und dann die einzelnen Operationen ausführen.
    Dazu seien als Stichworte Infix und Postfix gegeben.
    Musst du dir nur einfallen lassen. wie du das mit den Prioritäten der Rechenoperatione machst.
    Aber so ein Parser ist nicht immer trivial und ich standardmäßig hat Java glaube ich keinen Termparser 😉



  • Im Titel schreibst du "String ändern" willst aber wissen, wie man einen über Terminal eingegebenen Term ausrechnen kann ... da hakts doch, oder nicht?



  • Hi

    du wilst so ne art taschenrechner bastelen? Nach welchen rechenregeln? Grundschule (kettenrechnen) oder richtig mit Punkt vor Strich mit oder ohne klammerregeln.

    ersteres ist eigentlich einfach. Zeichwenweise einlesen und zu einer zahl bauen. dann das rechenzeichen erkennen. und wieder die nächste zahl verzuchen zu erkennen. hast du 2 zahlen und ein rechenzeichen das ganze reduziehren ( sprich ausrechnen) und als erste zahl merken und versuchen wieder ein rechenzeichen und eine zahl zu erkennen. das solange bis nichts mehr da ist oder ein fehler erkannt wurde. z.B. 2 rechenzeichen hintereinander, ungültige zeichen.

    das mit Punkt vor Strich wird komplizierter. ich empfehle mal nach Compilerbau zu Googeln. (Das Script von Copp haben wir zumindest in der Vorlesung verwendet) zumindest die grundlagen wirst du dafür benötigen ggf auch das Thema Automatentheorie.
    1. schritt den string in zerlegen. Zahlen, Rechenzeichen, ggf Variablen. natürlich laut syntax ( was du eigentlich auch bei der ersten lösung brauchst. nur kanst du da gleich ausrechnen)
    2. nach dem du die Knoten hast entsprechend der automaten vorschrift verarbeiten. Ich hab das damals mit einem Kellerautomaten gelöst was eigentlich die kompliziertere lösung war. hatte aber auch ein etwas erweitertes regelwerk. ( konte auch mit variablen arbeiten )

    im prinzip versuchst du immer 2 zahlen und ein rechenzeichen zu einer zahl zu reduziehren. Vorrangig die puntkzeichen. die striche kommen hinterher.
    kurzes beispiel. ( ggf mal nachlesen was ich da mache ist nicht ganz einfach)
    s = start e = ende kennung
    gerechnet wurde 1+2-2*4/8+3

    s1+2-2*4/8+3e // rechts der eingabe sting links der zwischenspeicher
    s          1+2-2*4/8+3e // erstez zeichen auf der linken seite ist das Startzeichen
    s1          +2-2*4/8+3e // 1. zeichen einlesen
    s1+          2-2*4/8+3e // 2. zeichen einlesen
    s1+2          -2*4/8+3e // 3. zeichen einlesen
    s3            -2*4/8+3e // anhand des nächsten zeichens - die reduktion des bisherig 
                            // erkannten durchführen [1+2]
    s3-            2*4/8+3e // 4. zeichen einlesen
    s3-2            *4/8+3e // 5. zeichen einlesen
    s3-2*            4/8+3e // 6. zeichen einlesen Da ein * folgt der kann das bisher 
                            // erkannte nicht reduziehrt werden. als mus weiter erkannt werden.
    s3-2*4            /8+3e // 7. zeichen einlesen
    s3-8              /8+3e // da das nächste zeichen auch eine punkt rechen art ist 
                            // kann die vorige punktrechenart reduziert werden.[2*4]
    s3-8/              8+3e // 8. zeichen einlesen
    s3-8/8              +3e // 9. zeichen einlesen
    s3-1                +3e // da das nächste zeichen niderwertiger ist als die zuletat 
                            // erkannte rechenoperation kann reduzirt werden [8/8]
    s2                  +3e // da das nächste zeichen gleichwertig ist mit dem das als letztes
                            // auf dem stack ligt kann erduziert werden.[3-1]
    s2+                  3e // 10 zeichen erkennen
    s2+3                  e // da das ende ziechen erkannt wurde den stack abbauen und 2+3 
                            // berechnen[2+3]
    s5e                     // e erkennen und ergebnis auslesen.
    

    hab hier jetzt die verwendeten Regel und die Automatenzustände weggelassen, da ich die nicht im Kopf hab.

    gruss Termite



  • thx für eure antworten, habe aber es auf eine andere variante gelöst ohne die ganze rechnung.

    greez


Anmelden zum Antworten