Java Tschenrechner Punkt vor Strichregel beibringen
Hallo Zusammen,
Ich könnte mal wieder euro Hilfe gebrauchen, diesmal im Bereich Java Programmierung. Und zwar sollen wir für die Schule einen kleinen Taschenrechner in Java programmieren mit dem man zum einen die Grundrechenarten verwenden kann und eventuell später noch Klammern oder änliches verwenden kann. Nun habe Ich bereits 2 Klassen geschrieben in der einen wird die graphische Oberfläche und die verschiedenen Datentypen (Strings, Int, Double, Boolean) des Rechners festgelegt wird und in der anderen werden dann, je nachdem welche Taste gedrückt wird verschiedene Aktionen ausgeführt.
Soweit funktioniert so ziemlich alles, außer, dass der Rechner die Punkt vor Strich Regel beherrscht. Jetzt zu meiner eigenlichen Frage: Wie kann ich am besten dem Rechner beibringen, dass er zuerst * und / rechnet und dann erst + und -.
Hier ein kleiner Ausschnitts des Codes indem die Buttons Plus, Minus, Mal, Geteilt und Gleich aufgerufen werden.
Ich hoffe, dass ich euch ein bisschen näherbringen konnte was ich vor habe und würde mich über eine Antwort freuen.
Danke schonmal im Vorraus
lG himmelph
Ich könnte mal wieder euro Hilfe gebrauchen, diesmal im Bereich Java Programmierung. Und zwar sollen wir für die Schule einen kleinen Taschenrechner in Java programmieren mit dem man zum einen die Grundrechenarten verwenden kann und eventuell später noch Klammern oder änliches verwenden kann. Nun habe Ich bereits 2 Klassen geschrieben in der einen wird die graphische Oberfläche und die verschiedenen Datentypen (Strings, Int, Double, Boolean) des Rechners festgelegt wird und in der anderen werden dann, je nachdem welche Taste gedrückt wird verschiedene Aktionen ausgeführt.
Soweit funktioniert so ziemlich alles, außer, dass der Rechner die Punkt vor Strich Regel beherrscht. Jetzt zu meiner eigenlichen Frage: Wie kann ich am besten dem Rechner beibringen, dass er zuerst * und / rechnet und dann erst + und -.
Hier ein kleiner Ausschnitts des Codes indem die Buttons Plus, Minus, Mal, Geteilt und Gleich aufgerufen werden.
public static void IstgleichListener(ActionEvent e) {
if (boolplus == true)
{
if (i == 1){
Faktoreins = Double.valueOf(Eins);
Zwei = Display.getText();
Faktorzwei = Double.valueOf(Zwei);
Ergebnis = Faktoreins + Faktorzwei;
Eins = String.valueOf(Ergebnis);
}
Display.setText(Eins);
boolplus = false;
}
if (boolminus == true)
{
if (i == 1){
Faktoreins = Double.valueOf(Eins);
Zwei = Display.getText();
Faktorzwei = Double.valueOf(Zwei);
Ergebnis = Faktoreins - Faktorzwei;
Eins = String.valueOf(Ergebnis);
}
Display.setText(Eins);
boolminus = false;
}
if (booldiv == true)
{
if (i == 1){
Faktoreins = Double.valueOf(Eins);
Zwei = Display.getText();
Faktorzwei = Double.valueOf(Zwei);
Ergebnis = Faktoreins / Faktorzwei;
Eins = String.valueOf(Ergebnis);
}
Display.setText(Eins);
booldiv = false;
}
if (boolmult == true)
{
if (i == 1){
Faktoreins = Double.valueOf(Eins);
Zwei = Display.getText();
Faktorzwei = Double.valueOf(Zwei);
Ergebnis = Faktoreins * Faktorzwei;
Eins = String.valueOf(Ergebnis);
}
Display.setText(Eins);
boolmult = false;
}
if (boolquad == true){
Zwei = Display.getText();
double i = Double.valueOf(Zwei);
Sechs = Double.valueOf(Eins);
for(int p = 1; p<i; p++){
Sechs = Sechs*Sechs;
}
Vier = String.valueOf(Sechs);
Display.setText(Vier);
}
}
public static void PlusListener(ActionEvent e){
switch (i){
case 0 :
Eins = Display.getText();
Display.setText("");
i = 1;
boolplus = true;
break;
case 1 :
Faktoreins = Double.valueOf(Eins);
Zwei = Display.getText();
Faktorzwei = Double.valueOf(Zwei);
Ergebnis = Faktoreins + Faktorzwei;
Eins = String.valueOf(Ergebnis);
boolplus = true;
Display.setText("");
break;
}}
public static void MinusListener(ActionEvent e){
switch (i){
case 0 :
Eins = Display.getText();
Display.setText("");
i = 1;
boolminus = true;
break;
case 1 :
Faktoreins = Double.valueOf(Eins);
Zwei = Display.getText();
Faktorzwei = Double.valueOf(Zwei);
Ergebnis = Faktoreins - Faktorzwei;
Eins = String.valueOf(Ergebnis);
boolminus = true;
Display.setText("");
break;
}
}
public static void MalListener(ActionEvent e){
switch (i){
case 0 :
Eins = Display.getText();
Display.setText("");
i = 1;
boolmult = true;
break;
case 1 :
Faktoreins = Double.valueOf(Eins);
Zwei = Display.getText();
Faktorzwei = Double.valueOf(Zwei);
Ergebnis = Faktoreins * Faktorzwei;
Eins = String.valueOf(Ergebnis);
boolmult = true;
Display.setText("");
break;
}
}
public static void GeteiltListener(ActionEvent e){
switch (i){
case 0 :
Eins = Display.getText();
Display.setText("");
i = 1;
booldiv = true;
break;
case 1 :
Faktoreins = Double.valueOf(Eins);
Zwei = Display.getText();
Faktorzwei = Double.valueOf(Zwei);
Ergebnis = Faktoreins / Faktorzwei;
Eins = String.valueOf(Ergebnis);
booldiv = true;
Display.setText("");
break;
}
}
Ich hoffe, dass ich euch ein bisschen näherbringen konnte was ich vor habe und würde mich über eine Antwort freuen.
Danke schonmal im Vorraus
lG himmelph
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147884
Url: https://administrator.de/contentid/147884
Ausgedruckt am: 25.11.2024 um 06:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo himmelph,
mit einem Java-Codeschnipsel kann ich nicht dienen, da ich diese Sprache nicht beherrsche. Grundsätzlich löst man so etwas aber mit Stacks. Die kann man mit einfach verketteten Listen oder mit Arrays darstellen.
Dazu müsstest Du Dir erstmal eine Klasse für Stacks schreiben, mit den grundlegenden Operationen push (Element auf den Stack legen) und pop (oberstes Element vom Stack nehmen). Füge auch noch einen Zähler für die Anzahl der Elemente im Stack hinzu. Dann definierst Du ein Array aus solchen Objekten und ein einzelnes Objekt. Auf die Stacks im Array legst Du die Operatoren (Codes für die Rechenzeichen +, -, * und /) ab, auf den einzelnen Stack die Operanden (die Zahlen).
Wenn ein Rechenzeichen eingegeben wird, legst Du die Zahl aus der Anzeige auf den Operanden-Stack. Wenn der Operatoren-Stack leer ist, legst Du den Code für das Rechenzeichen (den kannst Du über einen Aufzählungstypen definieren) auf den Operatoren-Stack. Wenn der Operatoren-Stack nicht leer ist, führst Du folgende Prüfungen durch:
Das Ergebnis der Berechnung legst Du wieder auf den Operanden-Stack.
Wenn eine öffnende Klammer eingegeben wird, zählst Du den Index für das Operatoren-Stack-Array um eins hoch, bei einer schließenden Klammer führst Du alle noch ausstehenden Rechenoperationen aus und zählst den Index um eins nach unten.
Das ganze lässt sich ziemlich einfach um Funktionen der höheren Mathematik erweitern, z.B. x hoch 2, Wurzel aus x, e hoch x, ln x, 10 hoch x, log x, sin, con, tan (und deren Umkehrfunktionen). Das wären Operatoren mit einem Operanden. Operatoren mit zwei Operanden wären +, - , *, /, x hoch y, x-te Wurzel aus y, Logarithmus von x zur Basis y. Für Operatoren mit zwei Operanden musst Du Dir Codes definieren, die Du auf dem Stack ablegen kannst. Alle diese Operatoren haben die gleiche Priorität wie * und /.
Ist schon länger her, daß ich sowas mal in Delphi (auch eine Übungsaufgabe) geschrieben habe. Es gibt dabei noch ein paar Ausnahmen zu behandeln, aber das siehst Du dann schon.
Zuerst habe ich mir eine Basisklasse für Stacks geschrieben von denen ich die Operatoren- und Operanden-Stacks abgeleitet habe, so war das ganze Datentyp-unabhängig.
Gruß
Friemler
mit einem Java-Codeschnipsel kann ich nicht dienen, da ich diese Sprache nicht beherrsche. Grundsätzlich löst man so etwas aber mit Stacks. Die kann man mit einfach verketteten Listen oder mit Arrays darstellen.
Dazu müsstest Du Dir erstmal eine Klasse für Stacks schreiben, mit den grundlegenden Operationen push (Element auf den Stack legen) und pop (oberstes Element vom Stack nehmen). Füge auch noch einen Zähler für die Anzahl der Elemente im Stack hinzu. Dann definierst Du ein Array aus solchen Objekten und ein einzelnes Objekt. Auf die Stacks im Array legst Du die Operatoren (Codes für die Rechenzeichen +, -, * und /) ab, auf den einzelnen Stack die Operanden (die Zahlen).
Wenn ein Rechenzeichen eingegeben wird, legst Du die Zahl aus der Anzeige auf den Operanden-Stack. Wenn der Operatoren-Stack leer ist, legst Du den Code für das Rechenzeichen (den kannst Du über einen Aufzählungstypen definieren) auf den Operatoren-Stack. Wenn der Operatoren-Stack nicht leer ist, führst Du folgende Prüfungen durch:
- Immer wenn ein * oder / eingegeben wird und das oberste Element auf dem Operatoren-Stack ein + oder - ist, rechnest Du nicht.
- Immer wenn ein + oder - eingegeben wird und das oberste Element auf dem Operatoren-Stack ein * oder / ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.
- Immer wenn ein * oder / eingegeben wird und das oberste Element auf dem Operatoren-Stack ein * oder / ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.
- Immer wenn ein + oder - eingegeben wird und das oberste Element auf dem Operatoren-Stack ein + oder - ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.
Das Ergebnis der Berechnung legst Du wieder auf den Operanden-Stack.
Wenn eine öffnende Klammer eingegeben wird, zählst Du den Index für das Operatoren-Stack-Array um eins hoch, bei einer schließenden Klammer führst Du alle noch ausstehenden Rechenoperationen aus und zählst den Index um eins nach unten.
Das ganze lässt sich ziemlich einfach um Funktionen der höheren Mathematik erweitern, z.B. x hoch 2, Wurzel aus x, e hoch x, ln x, 10 hoch x, log x, sin, con, tan (und deren Umkehrfunktionen). Das wären Operatoren mit einem Operanden. Operatoren mit zwei Operanden wären +, - , *, /, x hoch y, x-te Wurzel aus y, Logarithmus von x zur Basis y. Für Operatoren mit zwei Operanden musst Du Dir Codes definieren, die Du auf dem Stack ablegen kannst. Alle diese Operatoren haben die gleiche Priorität wie * und /.
Ist schon länger her, daß ich sowas mal in Delphi (auch eine Übungsaufgabe) geschrieben habe. Es gibt dabei noch ein paar Ausnahmen zu behandeln, aber das siehst Du dann schon.
Zuerst habe ich mir eine Basisklasse für Stacks geschrieben von denen ich die Operatoren- und Operanden-Stacks abgeleitet habe, so war das ganze Datentyp-unabhängig.
Gruß
Friemler
Hallo himmelph,
vielleicht wäre auch diese Seite etwas für dich.
Ist etwas hochgegriffen, aber eventuell kannst du etwas davon in Java umsetzen.
Ich kenne mich mit Java leider auch nicht aus und schließe mich Friemler von daher an.
Diese Stacks funktionieren recht gut.
Gruss
Tsuki
vielleicht wäre auch diese Seite etwas für dich.
Ist etwas hochgegriffen, aber eventuell kannst du etwas davon in Java umsetzen.
Ich kenne mich mit Java leider auch nicht aus und schließe mich Friemler von daher an.
Diese Stacks funktionieren recht gut.
Gruss
Tsuki
Hallo himmelph,
Du verwechselst da was. Wenn Du schreibst
rechnet Java den Ausdruck rechts vom Gleichheitszeichen aus und weist das Ergebnis der Variablen neuerDouble zu. Die kannst Du natürlich in einen String wandeln und wird dann auch korrekt angezeigt. Wenn Du aber einen String "1+1+2*3" in einen Double wandeln willst, findet Java die Pluszeichen und die Konvertierungsmethode Double.valueOf bricht mit einem Fehler ab. Die Konvertierungsmethode rechnet nämlich NICHT. Du musst Dir schon etwas mehr Arbeit machen.
Wie User dog schon sagte, hat Java wahrscheinlich Stacks schon eingebaut (Delphi übrigens auch, eine eigene Klasse zu schreiben war für mich nur eine zusätzliche Herausforderung, war mein erstes OOP-Programm). Du musst nur lernen, sie zu benutzen.
Wenn Dir der Lösungsweg, den ich beschrieben habe, zu kompliziert ist (Du scheinst Anfänger zu sein), bemühe mal Tante Google. Taschenrechner sind beliebte Übungsprojekte, da findest Du jede Menge Anregungen, aber wahrscheinlich meistens nicht in Java. Mit ein bisschen Überlegung kannst Du aber auch Code aus Delphi oder Visual Basic in Java übertragen. Meistens sind diese Lösungen auch einfacher gehalten als mein Vorschlag, haben dann aber gewisse Nachteile, die vielleicht aber auch für Dich nicht so wichtig sind. Ich habe mir damals bei meiner Übung auch Anregungen aus dem Netz geholt. Aber nur selbst denken macht schlau, Dein Lehrer hat sich ja was dabei gedacht, als er die Aufgabe stellte.
Gruß
Friemler
Du verwechselst da was. Wenn Du schreibst
neuerDouble = 1+1+2*3;
rechnet Java den Ausdruck rechts vom Gleichheitszeichen aus und weist das Ergebnis der Variablen neuerDouble zu. Die kannst Du natürlich in einen String wandeln und wird dann auch korrekt angezeigt. Wenn Du aber einen String "1+1+2*3" in einen Double wandeln willst, findet Java die Pluszeichen und die Konvertierungsmethode Double.valueOf bricht mit einem Fehler ab. Die Konvertierungsmethode rechnet nämlich NICHT. Du musst Dir schon etwas mehr Arbeit machen.
Wie User dog schon sagte, hat Java wahrscheinlich Stacks schon eingebaut (Delphi übrigens auch, eine eigene Klasse zu schreiben war für mich nur eine zusätzliche Herausforderung, war mein erstes OOP-Programm). Du musst nur lernen, sie zu benutzen.
Wenn Dir der Lösungsweg, den ich beschrieben habe, zu kompliziert ist (Du scheinst Anfänger zu sein), bemühe mal Tante Google. Taschenrechner sind beliebte Übungsprojekte, da findest Du jede Menge Anregungen, aber wahrscheinlich meistens nicht in Java. Mit ein bisschen Überlegung kannst Du aber auch Code aus Delphi oder Visual Basic in Java übertragen. Meistens sind diese Lösungen auch einfacher gehalten als mein Vorschlag, haben dann aber gewisse Nachteile, die vielleicht aber auch für Dich nicht so wichtig sind. Ich habe mir damals bei meiner Übung auch Anregungen aus dem Netz geholt. Aber nur selbst denken macht schlau, Dein Lehrer hat sich ja was dabei gedacht, als er die Aufgabe stellte.
Gruß
Friemler