# Taschenrechner mit Klammerrechnung



## Smeagollum (13. Jan 2005)

Komm einfach net weiter mit der Klammerrechnung, hab auch noch nix diesbezüglich in nem Forum gefunden, hoffe ihr könnt mir helfen!



```
if(cmd.equals("="))
				{
					vector.insertElementAt("(",0);
					vector.addElement(label.getText());
					vector.addElement(")");
					
					if(klammerncounter>0)
						for (int i=0; i<klammerncounter;i++)
						{
							vector.addElement(")");
						}
						
						
					for (int j=0; j<=vector.size(); j++)
					{
						for (int i=vector.lastIndexOf("("); i<vector.indexOf(")"); i++)
						{
							if (vector.elementAt(i).equals("*"))
							{	
								Double zw_erg =     Double.parseDouble(vector.elementAt(i-1)+"")*Double.parseDouble(vector.elementAt(i+1)+"");
								vector.removeElementAt(i);
								vector.removeElementAt(i);
								vector.set(i-1,zw_erg);
								i=0;
							}	
							
							if (vector.elementAt(i).equals("/"))
							{
								Double zw_erg = Double.parseDouble(vector.elementAt(i-1)+"")/Double.parseDouble(vector.elementAt(i+1)+"");
								vector.removeElementAt(i);
								vector.removeElementAt(i);
								vector.set(i-1,zw_erg);
								i=0;
		
							}
						}
						
						for (int i=vector.lastIndexOf("("); i<vector.indexOf(")"); i++)
						{
		
							if (vector.elementAt(i).equals("+"))
							{
								Double zw_erg = Double.parseDouble(vector.elementAt(i-1)+"")+Double.parseDouble(vector.elementAt(i+1)+"");
								vector.removeElementAt(i);
								vector.removeElementAt(i);
								vector.set(i-1,zw_erg);	
								i=0;
							}
							
							if (vector.elementAt(i).equals("-"))
							{
								Double zw_erg = Double.parseDouble(vector.elementAt(i-1)+"")-Double.parseDouble(vector.elementAt(i+1)+"");
								vector.removeElementAt(i);
								vector.removeElementAt(i);
								vector.set(i-1,zw_erg);
								i=0;
							}
						}
						
						if((Double.parseDouble(vector.indexOf(")")+"")-(Double.parseDouble(vector.lastIndexOf("(")+"")))==2)
						{
							vector.removeElementAt(vector.indexOf(")"));
							vector.removeElementAt(vector.lastIndexOf("("));
						}
				
					label.setText(vector.elementAt(0)+"");
					vector.clear();
}
```


Die "einfache" klammerrechung funktioniert hierbei auch schon... z.b. 5*(3+2) 
das Problem ist nur, dass z.b. 5+(3+2*6)/2  nicht funktioneren, was könnte man da machen?

MFG


----------



## pogo (13. Jan 2005)

wie wäre es wenn du versuchst dein problem in teilprobleme zu zerlegen also
5+x/2
x=3+2*6

also musst du suchen, bis gleich viele klammern zu wie auf sind und dies kannst du dann immer als teilproblem nehmen. dies musst du solange mit den teilproblemen machen, bis keine mehr da sind
denke das müsste gehen


----------



## Guest (13. Jan 2005)

Von der Theorie her sicher keine schlechte Idee aber wie würde man das in die Praxis umsetzen? Den ganzen Vector durchlaufen, jedesmal alle Werte von "(" bis ")" nochmal in nen Vector, den Vector ausrechnen lassen, wieder zurückgeben, nochmal von neuem..... find ich einerseits etwas langwierig, andererseits weiß ich nicht wie machen! 
PLZ HELP ME!!


----------



## Sky (13. Jan 2005)

Spontan fällt mir die folgende, rekursive Idee ein: 
Eine Methode schreiben, die Dir die erste öffnende Klammer und die letzte schließende Klammer raussucht und den Term wiederrum rekursiv so lange auseinandernimmt, bis keine Klammern mehr enthalten ist und dort dann "anfangen" die Terme auszurechnen.


----------



## Smeagollum (13. Jan 2005)

Rekursiv wäre die Rechnung ja schon:


```
for (int i=vector.lastIndexOf("("); i<vector.indexOf(")"); i++)
```

läuft von der letzten öffnenden bis zur ersten schließenden Klammer!


----------



## Smeagollum (15. Jan 2005)

Hat niemand ne Ahnung??


----------

