"2+3*3" soll er Summe = 11 geben, wie?



  • Hallo,
    ich wollte meine Kenntnisse in Java ein bißchen auffrischen, stoße aber schon gleich auf ein Problem, dass Problem ist so:

    Ich gebe einen beliebig langen String ein wie 2+3*3...-21.

    Mit StringTokenizer habe ich schon probiert, der liest ja den ganzen String ein. Wie erreiche ich, dass er getrennt nach Zahlen und Zeichen(+,-,*,/) liest??
    Ich habe mir überlegt, dass er falls er eine Zahl liest, diese in einem Array abspeichert, und genauso mit Zeichen aber in anderes Array. Da kann man auch die Syntaxprüfung machen.

    Wenn jemand eine bessere Lösung sieht, dann nur her damit.

    Eine weitere Frage:
    Wie parse ich ein text.charAt(i) in ein int? Mit Integer.parseInt(text.charAt(i)) geht das nicht, da er ein String verlangt.



  • Ich gebe einen beliebig langen String ein wie 2+3*3...-21.

    Mit StringTokenizer habe ich schon probiert, der liest ja den ganzen String ein. Wie erreiche ich, dass er getrennt nach Zahlen und Zeichen(+,-,*,/) liest??
    Ich habe mir überlegt, dass er falls er eine Zahl liest, diese in einem Array abspeichert, und genauso mit Zeichen aber in anderes Array. Da kann man auch die Syntaxprüfung machen.

    Wenn jemand eine bessere Lösung sieht, dann nur her damit.

    Eigentlich kann man mit der StringTokenizer-Klasse eine Zeichenkette ganz ordentlich zerpflücken (z. B. new StringTokenizer("12+4*6", "*/+-")). Für das was du machen willst, müsste das doch ausreichen, oder nicht?

    Eine weitere Frage:
    Wie parse ich ein text.charAt(i) in ein int? Mit Integer.parseInt(text.charAt(i)) geht das nicht, da er ein String verlangt.

    Parsen ist das falsche Wort. Was du suchst ist eine Cast:

    int a = (int) text.charAt(0);
    

    Im Übrigen kannst du, wenn ein String übergeben werden soll, folgendes machen :

    Integer.parseInt("" + text.charAt(i));
    


  • Aha und deswegen ist parsen das falsche Wort wenn man parseInt verwendet - ich verstehe 🙄



  • CengizS schrieb:

    Aha und deswegen ist parsen das falsche Wort wenn man parseInt verwendet - ich verstehe 🙄

    Ich dachte, seine Absicht ist nicht das "Parsen", sondern eher das "casten" von char nach int und er war sich über die Verfahrensweise unsicher (vielleicht auch nicht - is' mir schnuppe). Ansonsten hast du natürlich recht. "Parsen" ist bei einer Operation wie "parseInt" schon das richtige Wort.



  • @kio: Das ist nicht ganz so einfach zu beantworten. Du wirst später auch Klammern nutzen müssen etc. und dann gehen die Probleme eigentlich schon los.

    Prinzipiell ist so etwas über eine Baumstruktur gut zu lösen. Du gibst Operatoren eine gewisse Wertigkeit (denn (2+3)*3 <> 2+(3*3)) und bastelst dir dann einen Baum den du anschließend traversierst. Wenn man dann ganz unten ist, ist in der Regel eine einfache Operation zu finden die man dann ja ausrechnen kann. Das Ergebnis müsste man dann mitschleppen (Rekursion!) usw. usf.

    2+3*3
    würde dann so aussehen

    +
     / \
    2  *
      / \
      3 3
    


  • Hi.

    Wollte mal meinen Senf zu der Sache abgeben.

    Also der Cengiz hat schon recht so kann man das lösen.
    Ist für den anfang eine Sache die Schwer zu implementieren ist.

    Kio falls du dich sehr mit solchen Sachen beschäftigst, dann solltest du dir mal die Theoretischen Grundlagen der Informatik anschauen.

    Was dir hierbei helfen könnte wäre, Kellerautomaten, Kontextsensitive Sprachen oder Kontextfreie Sprachen (würg ich habe dieses Thema gehasssssst).

    Wenn du das Konzept als Theorie verstanden hast, dann ist die Implementierung viel einfacher.

    Also viel spass bei der Theorie.

    bye



  • Hallo,
    danke für eure Antworten.

    Die theoretischen Sachen hatte ich mal drauf, ist schon bißchen her. Wird höchste Zeit sie wieder aufzufrischen.


Anmelden zum Antworten