# Taschrechner über Konsole



## Kruzgoth (16. Aug 2011)

Hey Leute,

ich will jetzt einen Taschenrechner über die Konsole erstellen und zwar so,
dass die Rechenformel als ganzes übergeben wird, also z.B.:

5*3+4/3-3+88

Mein Problem hierbei ist die ganze Fallunterscheidung von +,-,*,/.
Im Einzelfall sind die nicht Problematisch, so wie oben in meine Beispiel,
richtig kritisch wirds bei mir allerdings, wenn es folgende Rechenoperatoren sind, wie
z.B.:
4*5/6

Hierbei habe ich das Problem, dass 4*5 Problemlos gelesen wird und umgerechnet, mir allerdings dann
für die /5 keinerlei Zahl mehr zur Verfügung steht, da die vorherhigen "Quasi" ausgeblendet werden
und so mein Programm versucht null/6 zu teilen oder so ähnlich, worauf nur die Fehlermeldung:
*Exception in thread "main" java.lang.ArithmeticException: / by zero*

Kann sich wer meiner erbarmen und mir kleine Tipps geben, wie ich dieses Problem sinnvoll im Zusammenhang zu meinem Programm löse??


```
double gesamt = 0;
	public static void rechnen(String s)
	{
		Pattern zahl = Pattern.compile("[0-9]+");
		Pattern zeich = Pattern.compile("(\\+|\\*|\\/|\\-)");
		Matcher suchz = zahl.matcher(s);
		String[] zeichen = new String[s.length()];
		int start = 0;
		int i = 0;
		Matcher suei = zeich.matcher(s);
		while(suei.find(start)==true)
		{
			zeichen[i] = s.substring(suei.start(), suei.end());
			i++;
			start = suei.end();
			if(suei.end()==s.length())
				break;
		}
		start = 0;
		i=0;
		int[] eins = new int[s.length()];
		while(suchz.find(start)==true)
		{
			eins[i] = Integer.parseInt(s.substring(suchz.start(),suchz.end()));
			i++;
			start = suchz.end();
			if(suchz.end()==s.length())
				break;
		}
		zeichen = anpassen(zeichen);
		char[] um = umformen(zeichen);
		int n = 0;
		int gesamt = 0;
		if(zeichen.length==0)
			gesamt += eins[0];
		else
		{		
			for(i = 0;i<um.length;i++)
			{
				n=i*2;
				switch(um[i])
				{
				case '*':
					gesamt += eins[n] * eins[n+1];
					break;
				case '/': if(zeichen[i-1].equals("*"))
				{
					gesamt = gesamt / eins[n];
				}
				else
					gesamt += eins[n] / eins[n+1];
					break;
				case '-': gesamt += eins[n] - eins[n+1];
					break;
				case '+': gesamt += eins[n] + eins[n+1];
					break;
				}
			}
		}
		System.out.println(gesamt);
	}
	public static String[] anpassen(String[] inhalt)
	{
		int p = 0;	//Stellenvariablen für das Array
		int i;
		for(i=0;i<inhalt.length;i++)	//Schleife bis Arrayende
		{
			if(inhalt[i]!=null)		//wenn der inhalt nicht null ist
			{
				inhalt[p] = inhalt[i];	//setzen der Stelle i an die Stelle p
				if(p!=i)
				inhalt[i] = null;		//inhalt an der Stelle i löschen
				p++;					//Countervariable erhöhen
			}
		}
		String[] temp = inhalt.clone();	//Klonen des Inhaltes zur
		inhalt = new String[p];		//veränderung der Array-größe
		for(i=0;i<p;i++)	//und erneute übergabe der Werte in das neu-große Array
		{
			inhalt[i] = temp[i];	//Übernahme aller nicht-null Elementen (s.Z.136-141)
		}
		return inhalt;	//Rückgabe des neuen Inhaltes
	}
	
	public static char[] umformen(String[] inhalt)
	{
		char[] zeilen = new char[inhalt.length];
		for(int i = 0;i<inhalt.length;i++)
		{
			zeilen[i] = inhalt[i].charAt(0);
		}
		return zeilen;
	}
```

Hat wer eine Idee, wie ich also z.B.:5*4+6-5*4/4
effizient und vorallem korrekt lösen kann?
Will erstmal dazu Hilfestellung und den Rest danach durch eigen Denken lösen.


PS: Lösungen wie, mach es über GUI oder ähnliches will ich nicht hören, auch wenn es leichter ist.
Ich hab dies absichtlich so gewählt, aufgrund der für mich erbaulichen Schwierigkeit.

Danke =)

PPS: Das Programm soll später auch noch längere Gleichungen lösen, also nicht nur an den Beispiel orientiert!


----------



## Marcinek (16. Aug 2011)

Weil du mit integer rechnest bekommst du diese Exception.

Ansonsten bist du nicht der erste, der einen Taschenrechner so programmieren will.

Ich würde googeln statt hier so lange posts zu machen.


----------



## Gast2 (16. Aug 2011)

Nebenbei solltest du mal den Sinn deiner Kommentare ansehn, z.B. an hand dieser Methode:

```
/**
 * Javadoc fehlt!
 * Was ist der Sinn dieser Methode? Anpassen? Sagt mir ehrlich gesagt nicht was sie tut...
 * @param ..
 * @return ..
 */
public static String[] anpassen(String[] inhalt)
    {
        int p = 0;  //Stellenvariablen für das Array <- hmm, okay wenn es dir hilft
        int i;
        for(i=0;i<inhalt.length;i++)    //Schleife bis Arrayende <- sollte jedem klar sein, unnötig
        {
            if(inhalt[i]!=null)     //wenn der inhalt nicht null ist <- absolut unnötig! Wer lesen kann sieht das gleich
            {
                inhalt[p] = inhalt[i];  //setzen der Stelle i an die Stelle p <- unnötig
                if(p!=i)
                inhalt[i] = null;       //inhalt an der Stelle i löschen <- unnötig
                p++;                    //Countervariable erhöhen <- unnötig
            }
        }
        String[] temp = inhalt.clone(); //Klonen des Inhaltes zur <- ???
        inhalt = new String[p];     //veränderung der Array-größe <- nicht wirklich...
        for(i=0;i<p;i++)    //und erneute übergabe der Werte in das neu-große Array 
        {
            inhalt[i] = temp[i];    //Übernahme aller nicht-null Elementen (s.Z.136-141)
        }
        return inhalt;  //Rückgabe des neuen Inhaltes
    }
```

Also allem in allen sind 95% der Kommentare meiner Meinung nach sinnlos und die du eigentlich abgeben solltest fehlen 

Außerdem ist das ganz schön aufwändig gelöst:

```
public static String[] anpassen2(String[] inhalt) {
		List<String> newInhalt = new ArrayList<String>();
		for (String s : inhalt) {
			if (s != null) {
				newInhalt.add(s);
			}
		}
		return newInhalt.toArray(new String[newInhalt.size()]);
	}
```

Tut das gleiche


----------



## Kruzgoth (16. Aug 2011)

hey danke,
dass mit der Funktions-Umänderung werde ich gleich morgen mal ausprobieren.

Das mit den Kommentaren ist leider so gefordert bei mir, da meine Kollegen ebenfalls meinen,
dass ich überall Kommentare dran schreiben soll, damit das auch für einen "unwissenden" Laien
verständlich ist, naja ^^
Die Javadoc wäre bei mir gegen Ende dazu gekommen, deswegen steht da auch noch nichts.



> Weil du mit integer rechnest bekommst du diese Exception.
> 
> Ansonsten bist du nicht der erste, der einen Taschenrechner so programmieren will.
> 
> Ich würde googeln statt hier so lange posts zu machen.



Wenn ich das bereits über google gefunden hätte, würde ich mich nicht explizit an dieses Forum wenden, da ich dieses Thema leider auch nicht im Forum finden konnte unter diesem oder ähnlichem Namen!

Und helfen tun mir eure Antworten bisher leider nicht =( 
expliziter Lösungsvorschlag oder Link-verweiß bitte!


----------



## Marcinek (16. Aug 2011)

java-forum.org - Suchergebnisse

Let me google that for you

4 / 5 = 0 wenn man mit ints rechnet.



> Will erstmal dazu Hilfestellung und den Rest danach durch eigen Denken lösen.


???:L???:L???:L???:L


----------

