AWT Taschenrechener

Status
Nicht offen für weitere Antworten.

kirve1988

Mitglied
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]
 
Zuletzt bearbeitet von einem Moderator:

daWonderer

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Mitglied
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

Top Contributor
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.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
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

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

0x7F800000

Top Contributor
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:
Code:
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... :eek:
 
Zuletzt bearbeitet von einem Moderator:

Mofi

Bekanntes Mitglied
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:
Code:
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... :eek:

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

Mitglied
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

Top Contributor
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 :D Aber erst mit Fundament anfangen, erst danach das Dach anstreichen, okay?^^
*neues buch erstmal lesen*
Bücher lesen ist immer gut... :toll:
 

0x7F800000

Top Contributor
@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

Mitglied
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

Top Contributor
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.
 

0x7F800000

Top Contributor
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:
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
Also, jetzt bitte nicht missverstehen schon wieder...
Zum üben ist der taschenrechner gut genug: schreiben!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben