# AWT Taschenrechener



## kirve1988 (23. Feb 2009)

Hallo leute, ich muss ein Taschenrechner programmieren (awt). Das grafische hab ich fertig, was uch kein problem war. Nun weiss ich aber nicht mehr weiter wie ich die berechnungen hinkriege. kann mir einer sagen wie ich nun vorgehen muss? Will ja keine codes sondern tipps.

[HIGHLIGHT="Java"]import java.awt.*;
import java.awt.event.*;

class GUI extends Frame
{
Button key0 = new Button("0");
Button key1 = new Button("1");
Button key2 = new Button("2");
Button key3 = new Button("3");
Button key4 = new Button("4");
Button key5 = new Button("5");
Button key6 = new Button("6");
Button key7 = new Button("7");
Button key8 = new Button("8");
Button key9 = new Button("9");
Button keyPlus = new Button("+");
Button keyMinus = new Button("-");
Button keyGleich = new Button("=");
Button keyMal = new Button ("x");
Button keyGeteilt = new Button ("/");
Button keyKlammer = new Button ("(");
Button keyKlammerZu = new Button(")");
Button keyVorz = new Button("+/-");
Button keyCE = new Button("CE");
Button keyKomma = new Button(".");
TextField display = new TextField();



Panel keyPanel = new Panel();
Panel keyDisplayPanel = new Panel();
Panel StatusPanel = new Panel();

GUI()
{

setTitle("JavaPhone");
setBackground(Color.lightGray);
setResizable(false);
display.setEditable(false);

addWindowListener(new Schließen()); // EventListener für das Fenster hinzufügen
// (notwendig, damit das Fenster geschlossen werden kann)
key1.addActionListener(new keylistener()); // EventListener für Schaltfläche hinzufügen
key2.addActionListener(new keylistener());
key3.addActionListener(new keylistener());
key4.addActionListener(new keylistener());
key5.addActionListener(new keylistener());
key6.addActionListener(new keylistener());
key7.addActionListener(new keylistener());
key8.addActionListener(new keylistener());
key9.addActionListener(new keylistener());
keyPlus.addActionListener(new keylistener());
key0.addActionListener(new keylistener());
keyMinus.addActionListener(new keylistener());
keyMal.addActionListener(new keylistener());
keyGeteilt.addActionListener(new keylistener());
keyGleich.addActionListener(new keylistener());
keyKomma.addActionListener(new keylistener());
keyKlammer.addActionListener(new keylistener());
keyKlammerZu.addActionListener(new keylistener());
keyCE.addActionListener(new keylistener());
keyVorz.addActionListener(new keylistener());
keyKomma.addActionListener(new keylistener());
keyPanel.setLayout(new GridLayout(4, 4, 20, 20));
keyDisplayPanel.setLayout(new BorderLayout(20,20));


keyPanel.add(key1);
keyPanel.add(key2);
keyPanel.add(key3);
keyPanel.add(keyKlammer);
keyPanel.add(keyKlammerZu);
keyPanel.add(key4);
keyPanel.add(key5);
keyPanel.add(key6);
keyPanel.add(keyMinus);
keyPanel.add(keyPlus);
keyPanel.add(key7);
keyPanel.add(key8);
keyPanel.add(key9);
keyPanel.add(keyMal);
keyPanel.add(keyGeteilt);
keyPanel.add(key0);
keyPanel.add(keyGleich);
keyPanel.add(keyVorz);
keyPanel.add(keyCE);
keyPanel.add(keyKomma);

keyDisplayPanel.add(display, BorderLayout.NORTH);
keyDisplayPanel.add(keyPanel, BorderLayout.CENTER);


add(keyDisplayPanel, BorderLayout.CENTER);
}

class keylistener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String ziffer = e.getActionCommand();
display.setText(display.getText() + ziffer);



if (e.getActionCommand().equals("CE"))
{

display.setText("");
}

}
}

class Schließen extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
e.getWindow().dispose();
System.exit(0);
}
}
}[/HIGHLIGHT]


----------



## daWonderer (23. Feb 2009)

schau mal ob dich das hier weiterbringt:  http://openbook.galileocomputing.de...12_007.htm#mjcdc782b4768f40ae6013e43c36307c9a

Zahlen und Operationen speichern. Je nach Bedarf dann wieder auslesen und berechnen.


----------



## kirve1988 (23. Feb 2009)

sry hab dort niix gecheckt


----------



## daWonderer (23. Feb 2009)

Um Rechenoperationen auszuführen benötigst du Zahlen und Operationen.
Beides kannst du in Listen speichern. Queues und Deques sind eine besondere Form von Listen.
Wenn du alles in der Liste gespeichert hast kannst du den Inhalt der Reihe nach abarbeiten (siehe Iterator falls du keinen Stack oder Queue verwendest).


----------



## Marco13 (23. Feb 2009)

Den Text, der im "display" steht, nachträglich auszurechnen, ist aufwändig. Sofern du das ganze nur so bedienst, wie einen normalen Taschenrechner, ist es einfacher: Dann hast du im display immer
[Zahl] [Operator] [Zahl]
stehen, und bei einem Druck auf "=" wird das ausgerechnet. Du müßtest dafür den String im display wie oben beschrieben zerlegen. String.charAt und Character.isDigit könnten da hilfreich sein.


----------



## daWonderer (23. Feb 2009)

Marco13 hat gesagt.:


> Sofern du das ganze nur so bedienst, wie einen normalen Taschenrechner, ist es einfacher: Dann hast du im display immer
> [Zahl] [Operator] [Zahl]
> stehen, und bei einem Druck auf "=" wird das ausgerechnet



Das Problem ist das Weiterrechnen mit weiteren Operationen. Dabei müssen die Rechenregeln beachtet werden.

4+2*3=

Man kann ja nicht gleich  4+2  rechnen, sondern muss sich das merken (z.b. in einer Liste).


----------



## kirve1988 (5. Mrz 2009)

Ich kriege das nicht hin damit. Mein lehrer meinte man soll das entweder mit split oder charAt machen aber kann mir darunter auch nix vorstellen.
Kann einer mir vllt weiterhelfen


----------



## hdi (5. Mrz 2009)

Also die Frage stellt sich jetzt wirklich, inwiefern Rechenregeln angewandt werden müssen.

Wenn der Taschenrechner keine Klammer-Buttons zur Verfügung stellt, brauchst
du kein Punkt vor Strich beachten.
Beim normalen Tippen von Zahlen und Operationen wird das ohne Klammerung immer
nacheinander ausgerechnet.

So ist dann

4+3*2

tatsächlich 14, und nicht 10. Das ist nun also eine Frage der Aufgabenstellung.

Bzw. die Frage ist: Wird jeder Schritt automatisch eingerechnet, wie zB beim Windows-Rechner,
oder soll die komplette Eingabe erst am Ende beim Drücken auf "=" errechnet werden?

Weil in letzterem Fall musst du natürlich Rechenregeln schon beachten, auch ohne Klammerung.


----------



## Marco13 (5. Mrz 2009)

Ich kenne keinen Taschenrechner, der so arbeitet, d.h. bei 4+3*2 sollte jeder Taschenrechner 10 ausgeben - allerdings war das, was ich oben gesagt hatte, demnach ziemlich mißverständlich. Die Taschenrechner, bei denen man KEINE kompletten Terme eingeben kann, rechnen immer so viel aus, wie sie können. Also bei der Tastenfolge
4 + 3 +
wird das Ergebnis ausgerechnet, bei
4 + 3 * 
aber nicht... bis das erste mal ein "schwächerer" Operator kommt - trotzdem muss man immer nur
[Operand][Operator][Operand] 
ausrechnen - diese Sachen würden dann, wie daWonderer schon gesagt hat, aber nicht so im Display stehen, sondern auf dem Stack liegen.


----------



## 0x7F800000 (5. Mrz 2009)

Zapfe einfach google an, und schreib dir ein regex, das von dieser Google-Taschenrechnerseite das ergebnis rausliest


----------



## kirve1988 (6. Mrz 2009)

Andrey hat gesagt.:


> Zapfe einfach google an, und schreib dir ein regex, das von dieser Google-Taschenrechnerseite das ergebnis rausliest



Sry hab leider nix verstanden^^


----------



## Marco13 (7. Mrz 2009)

Und keine Frage gestellt, auf die man etwas potentiell verständliches Antworten könnte.


----------



## 0x7F800000 (7. Mrz 2009)

kirve1988 hat gesagt.:


> Sry hab leider nix verstanden^^


Ignorieren. Das war eher wie ein blöder scherz gemeint. 
Aber es ist imho immer noch sinnvoller, als bei einem Taschenrechner mit der GUI anzufangen... Oder allgemein bei irgendeinem halbwegs sinnvollen Programm mit der gui anzufangen. Das ist so, als ob du dir erstmal eine ovalförmige Geschenkschachtel mit abmessungen 145x70x5 cm, mit bunten Aufklebern und hübschen Bändchen bastelst, und anschließend überlegst, wie du da jetzt den Mixer reinbekommst^^

Und dadurch dass du keine schleifen kannst (oder nicht magst, or whatever^^) , wird es leider auch nicht besser:

```
Button key0 = new Button("0");
Button key1 = new Button("1");
Button key2 = new Button("2");
Button key3 = new Button("3");
Button key4 = new Button("4");
Button key5 = new Button("5");
Button key6 = new Button("6");
Button key7 = new Button("7");
Button key8 = new Button("8");
Button key9 = new Button("9");
```
omg...


----------



## Mofi (7. Mrz 2009)

Andrey hat gesagt.:


> Ignorieren. Das war eher wie ein blöder scherz gemeint.
> Aber es ist imho immer noch sinnvoller, als bei einem Taschenrechner mit der GUI anzufangen... Oder allgemein bei irgendeinem halbwegs sinnvollen Programm mit der gui anzufangen. Das ist so, als ob du dir erstmal eine ovalförmige Geschenkschachtel mit abmessungen 145x70x5 cm, mit bunten Aufklebern und hübschen Bändchen bastelst, und anschließend überlegst, wie du da jetzt den Mixer reinbekommst^^
> 
> Und dadurch dass du keine schleifen kannst (oder nicht magst, or whatever^^) , wird es leider auch nicht besser:
> ...



hm ich hab das aber auch schon genau so in büchern gesehen :bahnhof:
deswegen frag ich mich grad, wie sollte man es sonst machen?
mit nem array? :bahnhof:

aber so ein taschenrechner selbst programmieren find ich auch interessant, aber momentan hab ich beschlossen, dass mein wissen noch nicht ausreicht  *neues buch erstmal lesen*


----------



## kirve1988 (7. Mrz 2009)

was soll n dem code denn falsch sein. grafisch geht ja alles nur rechnen tuts nicht. und cih weiss nit wie ich es hinkriege.


----------



## 0x7F800000 (7. Mrz 2009)

Mofi hat gesagt.:


> hm ich hab das aber auch schon genau so in büchern gesehen :bahnhof:
> deswegen frag ich mich grad, wie sollte man es sonst machen?
> mit nem array? :bahnhof:


korrekt. Array für 10 verschiedene buttons erstellen, dann mit einer schleife drübergehen, die buttons erstellen, listener anhängen usw usw. Wenn du dasselbe nochmal für jeden Listener einzeln abtippen bzw. per copy-paste vervielfältigen musst, drehst du durch.


> aber so ein taschenrechner selbst programmieren find ich auch interessant, aber momentan hab ich beschlossen, dass mein wissen noch nicht ausreicht


wollte dich jetzt nicht demotivieren oder so^^ So ein einfacher Taschenrechner ist ja eigentlich auch ganz gut machbar, wenn du schon was von arrays weißt, bist du fast schon überqualifiziert  Aber erst mit Fundament anfangen, erst danach das Dach anstreichen, okay?^^


> *neues buch erstmal lesen*


Bücher lesen ist immer gut... :toll:


----------



## 0x7F800000 (7. Mrz 2009)

@Mofi: lol, du bist ja gar nicht der OP^^
@kirve1988: ich sehe da buttons die Klammer einfügen...
Was schätzt du, wie groß der Aufwand für die gui Erstellung im Vergleich zum Schreiben des Parsers ist, der klammer und solchen kram korrekt bearbeiten kann?

5% <-> 95% würde ich mal schätzen.
Was funktioniert an deinem Programm dann überhaupt? Das ist doch bisher eine leere Eihülle, die auch noch äußerst ineffizient zusammengefrickelt ist. Redundanz 30x.


----------



## kirve1988 (7. Mrz 2009)

ya wie gesagt da ist nur das grafische bisjetzt fertig. keiner in meiner klasse ist bisjetz weitergekommen. verstehe halt nicht wie ich son ding hinkriegen soll.


----------



## 0x7F800000 (7. Mrz 2009)

http://www.java-forum.org/java-faq-beitraege/12306-parser-fuer-mathematische-formeln.html

Beni hat das was geschrieben, weiß nicht von welcher qualität das ist, aber das wirrd wohl funktionieren^^


----------



## 0x7F800000 (7. Mrz 2009)

bevor du dir hier riesenstress machst, würde ich gerne drauf hinweisen, dass die dämlichen windows-standardtaschenrechner auch keine klammer können. Um so etwas nachzubauen, brauchst du wirklich ein "Kernel" der eine variable und eine operation mitspeichern kann, sonst nichts. Das ist dann wiederum sache von 83 Sekunden. Du muss nur auf Klammer (und somit auf eine sehr große Klasse praktischer rechnungen) verzichten.


----------



## Fu3L (7. Mrz 2009)

Andrey hat gesagt.:


> bevor du dir hier riesenstress machst, würde ich gerne drauf hinweisen, dass die dämlichen windows-standardtaschenrechner auch keine klammer können.



Doch, wenn du auf "Ansicht" --> "Wissenschaftlich" klickst...


----------



## 0x7F800000 (8. Mrz 2009)

achso, ja stimmt, tatsächlich...
Aber das ist dennoch extremst behindert. Intern scheint der zwar auch mit klammern rechnen zu können, aber da gibt es einen haufen tasten, dafür man kann keine komplette ausdrücke in dieses krüppelige fensterchen eingeben, so geht es natürlich auch, aber bis man mit dieser ungarischen rückwärtsarschigen notation irgendwas eingetippt hat, kann man sich 50 browserfenster aufmachen, und den auszuwertenden ausdruck bei google eingeben :autsch:


----------



## 0x7F800000 (8. Mrz 2009)

Also, jetzt bitte nicht missverstehen schon wieder...
Zum üben ist der taschenrechner gut genug: schreiben!


----------

