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??
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!
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??
Java:
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!