# Taschenrechner - Aufgabenstring umwandeln und ausrechnen



## badewanne (14. Dez 2008)

Hallo,

gibt es eine Methode mit der ich den inhalt eines Arrays bzw. seiner Zellen auf ein bestimmtes Zeichen untersuchen kann? Ich möchte für einen Taschenrechner der Punkt- vor Strichrechnung können soll einen Aufgaben-String wie 
"1+1*2+3+4/5-6" z.B. zunächst am "+" Zeichen mit string.split zerhacken und anschließend die einzelnen Zellen des Arrays auf weitere Rechenzeichen untersuchen um sie gegebenenfalls weiter zu zerhacken bzw. rauszuschnieden.

Mein Ansatz sieht bis jetzt so aus:

```
public class StringSplitExample 
{
	public static void main(String[] args) 
    {
    String aufgabe = "1+1*2+3+4/5-6";
   
    String[] summanden = aufgabe.split("\\+");
   
    	for(int i= 0, length = summanden.length; i < length; i++) 
    	{
        System.out.println(summanden[i]);
        }
    }    
}
```

In den Zellen von "summanden" steht ja dann folgendes:

summanden[0] : 1
summanden[1] : 1*2
summanden[2] : 3
summanden[3] : 4/5-6

Jetzt weis ich nicht genau wie ich weiter machen soll, theoretisch würde ich als nächstes alle "-" raussuchen und sie in einem weiteren Array abspeichern...ich weis ich bin noch nicht wirklich weit...brauche dringend Hilfe vielleicht bin ich ja auch auf dem Holzweg, freue mich über jeden Tipp!


Gruß*Badewanne


----------



## SlaterB (14. Dez 2008)

erfolgsversprechender halte ich ich die Variante,
den String der Reihe nach einzulesen und auf jedes aktuelles Element zu reagieren

siehe z.B. in
http://www.java-forum.org/de/viewtopic.php?t=13378
Klasse Parser, Methode tokenize( String formula )


----------



## Landei (15. Dez 2008)

Mit +-*/ bekommt man es vielleicht noch so hin, wenn es aber später erweiterbar sein sollte, dann rennst du vor eine Mauer. Also 
-entweder einen kleinen Parser schreiben (JavaCC, SableCC, ANTLR...)
- oder den Code von anderen klauen (für Taschenrechner gibt es wohl tausende Java-Implementierungen)
- oder (als einfachste Lösung) eine Scriptsprache einbinden(Beanshell, pnuts, rhino), weil du dann einfach nur so was wie eval("1+2*3") oder so aufzurufen brauchst.


----------



## badewanne (15. Dez 2008)

Hallo,

erstmal Danke für eure Tipps. Das mit dem Parser hab ich mir mal angeschaut, so ungefähr hatte ich mir das ursprünglich vorgestellt. Für mich leider nicht mal kurz dahingecoded und ich hab grad natürlich Zeitdruck. Das
mit dem Einbinden einer Skriptsprache klingt schon vielversprechend, mal sehen ob ich dazu ein gutes Tut finde...

*die Badewanne


----------



## ARadauer (15. Dez 2008)

http://blog.radauer.com/?p=7 ;-)


----------



## badewanne (15. Dez 2008)

@ARadauer:
Danke, das hilft mir grad schon weiter, vielleicht kannst Du mir ja auch noch beim einbinden helfen... (s.u.)

@alle:
Könnt Ihr mir vielleicht noch sagen ob der Code von ARadauer alles ist was ich brauche?
Ein paar Probleme konnte ich schon lösen in dem ich einfach den Code hier eingefügt habe, da die Anführungszeichen nicht richtig übernommen wurden...  :lol:   -  Muss ich mir vielleicht noch die RhinoScriptEngine installieren?  
Bekomme jetzt einen Haufen Exceptions, die da wären:

Das war wohl nix (das spuckt der catch-Block aus)

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: illegal character (<Unknown source>#1) in <Unknown source> at line number 1
	at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source)
	at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source)
	at javax.script.AbstractScriptEngine.eval(Unknown Source)
	at BackEnd.nextCommand(BackEnd.java:58)
	at CalcService.actionPerformed(CalcService.java:25)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

hier mal mein Code, an der Stelle wo das "=" Zeichen kommt möchte ich jetzt den String der ScriptEngine übergeben:

```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;


public class BackEnd 
{
	private double   x, y, ergebnis;
	private String eingabeString ="";
	private String ausgabeString ="";

	public BackEnd() 
	{	
		ergebnis=0;  
	    ausgabeString="";
	    eingabeString="";
	}

	public void nextCommand(String inString)
	{
		
		eingabeString += inString;
		
		//Alles löschen
		if(inString.equals("ac"))
		{
			ergebnis = 0.;
			eingabeString = "";
		}
		
		
		//Zeichen löschen Funktion
		if(inString.equals("delete"))
		{
			if(eingabeString.equals("delete"))
				eingabeString="";
			else
			eingabeString = eingabeString.substring(0, eingabeString.length()-7);
		}
	
		//Ergebnis vom JavaSkript
		
		if(inString.equals("="))
		{
			eingabeString = eingabeString.substring(0, eingabeString.length()-1); //Gleichzeichen sofort wieder rausschneiden 
			
			String formel = eingabeString;
			
			ScriptEngineManager factory = new ScriptEngineManager();
	        ScriptEngine engine = factory.getEngineByName("JavaScript");

	        
	        try {
	            engine.eval("var v = eval(’"+formel+"‘)"); //
	            double b =(Double) engine.get("v");
	            
	            ergebnis = b;

	                  System.out.println("Ergebnis: "+b);
	           } catch (ScriptException e) {
	            System.out.println("Das war wohl nix");
	            e.printStackTrace();
	           }       
	                
	             }				
	}
	
	
	

	public String getEingabeString() 
	   {
			System.out.println("\nEingabe-String = "+eingabeString); 
			return eingabeString;
	   }

/*	public String setEingabeString(String inString) 
	   {
			
			System.out.println("\nEingabe-String = "+eingabeString); 
			return eingabeString;
	   }
*/	
	   public String getErgebnisString() 
	   {	
		    //ergebnis = 32.0; // nur für Tests 
		   
		   	// Ergebnis runden
		   	int stellen = 8; 						//Stellen auf die das Ergebnis gerundet wird
		    double factor = Math.pow(10, stellen);	//Faktor für die Rundung
		    //System.out.println((int)factor); //
		    boolean keinKommaNull;

		    // Zahl mit 100 multiplizieren, dann runden, anschliessend wieder durch 100 teilen

		    double gerundeteZahl = Math.round(ergebnis * factor) / factor;
		   
		    String erg = String.valueOf( gerundeteZahl );
		   	System.out.println("\nErgebnis-String = "+erg.toString()); 
		   	ausgabeString = erg;
		   	if(keinKommaNull = ausgabeString.endsWith(".0"))
		   		{
		   		ausgabeString = ausgabeString.substring(0, ausgabeString.length()-2);
		   		return ausgabeString;
		   		}
		   		else return ausgabeString;
	   }
	   
}
```


----------



## badewanne (15. Dez 2008)

Hallo nochmal,

habe den Fehler gefunden, beim copy und paste wurden nicht nur die ( " )-Zeichen sondern auch das ( ' ) falsch übernommen. Die SkriptEngine läuft jetzt super!

@ARadauer:
Thx a lot!!!


----------

