Bedingtes Rechnen

Status
Nicht offen für weitere Antworten.
C

Chili

Gast
Ich hoffe mal das hier wird die letzte Frage, aber ich kanns nicht versprechen =)
Also in meinem Taschenrechner steht unter anderem folgender Quelltext:

Code:
public void actionPerformed(ActionEvent e) {        
        if (e.getSource() == btEins){
            dazuSchreiben("1");
        }
        if (e.getSource() == btZwei){
            dazuSchreiben("2");
        }     
        if (e.getSource() == btDrei){
            dazuSchreiben("3");
        }   
        if (e.getSource() == btVier){
            dazuSchreiben("4");
        }  
        if (e.getSource() == btFuenf){
            dazuSchreiben("5");
        }     
        if (e.getSource() == btSechs){
            dazuSchreiben("6");
        }
        if (e.getSource() == btSieben){
            dazuSchreiben("7");
        }     
        if (e.getSource() == btAcht){
            dazuSchreiben("8");
        }  
        if (e.getSource() == btNeun){
            dazuSchreiben("9");
        }     
        if (e.getSource() == btNull){
            dazuSchreiben("0");
        }     
        if (e.getSource() == btPlus){
            String zeichen = "+";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }    
        if (e.getSource() == btMinus){
            String zeichen = "-";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }      
        if (e.getSource() == btMal){
            String zeichen = "*";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }       
        if (e.getSource() == btGeteilt){
            String zeichen = "/";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }    
        if (e.getSource() == btGleich){
            String zwischen = tfAnzeige.getText();
            zweiteZahl = Double.parseDouble(zwischen);
            rechnen();
        }    
        if (e.getSource() == btPunkt){
            String zeichen = ".";
            tfAnzeige.setText(tfAnzeige.getText()+zeichen);
        }    
    }
    
    public void dazuSchreiben(String neueZiffer) {
        if (zeichenEingegeben == 1) {
            tfAnzeige.setText(neueZiffer);
            zeichenEingegeben = 0;
        }
        else
        tfAnzeige.setText(tfAnzeige.getText()+neueZiffer);
    }
    
    public void rechnen() {
        if (zeichen == "+") {
        ergebnis = ersteZahl + zweiteZahl;
        String endergebnis = new String ("" + ergebnis);
        tfAnzeige.setText(endergebnis);
        }
        if (zeichen == "-") {
        ergebnis = ersteZahl - zweiteZahl;
        String endergebnis = new String ("" + ergebnis);
        tfAnzeige.setText(endergebnis);
        }
        if (zeichen == "*") {
        ergebnis = ersteZahl * zweiteZahl;
        String endergebnis = new String ("" + ergebnis);
        tfAnzeige.setText(endergebnis);
        }
        if (zeichen == "/") {
        ergebnis = ersteZahl / zweiteZahl;
        String endergebnis = new String ("" + ergebnis);
        tfAnzeige.setText(endergebnis);
        }    
    }

Wenn ich in der Methode rechnen() ohne if-Entscheidung nur einen Rechenweg angebe funktioniert der Rechner tadellos. Mein Ziel ist natürlich hinzubekommen, dass wenn unterschiedlich Rechenarten geklickt werden, dann auch mit denen gerechnet wird - ist ja selbstverständlich. Und da dachte ich mir so könnte das funktionieren. Tuts aber nicht. Kann es sein dass ich anstatt rechnen() rechnen(String zeichen) hinschreiben muss?
 

André Uhres

Top Contributor
Das ist das gleiche Problem wie bei den double Variablen in deinem anderen Topic.
(Wäre übrigends besser gewesen wenn du diese Frage dort gestellt hättest :wink: )
zeichen ist als Instanzvariable am Anfang deines Programms definiert.
Und in actionPerformed definierst du zeichen noch einmal lokal:
das "String" vor "zeichen" musst du einfach wegmachen !
 
C

Chili

Gast
Achsoo jetzt habe ich das auch verstanden...
Wenn ich ne Variable als public oben drüber definieren dann brauche ich in den methoden nicht mehr den Datentyp davor zu schreiben sondern nur noch den Namen? Und wenn ichs doch tue ist die variable nicht mehr Global sondern Lokal?
Ahhhhh...gut zu wissen Ja das mit den viel Threads werde ich mal berücksichtigen ;-)
 

Chili

Aktives Mitglied
Soo jetzt bin ich Mitglied =)=)=)
Dann stell ich hier mal alle weitern Fragen zur Verbesserung meines Taschenrechners rein.
1) Gibt es einen Befehl mit dem ich das Textfeld leeren/den Inhalt komplett löschen kann?
 

L-ectron-X

Gesperrter Benutzer
Code:
textfeld.setText("");

Und das wäre auf jeden Fall besser:
Code:
//String endergebnis = new String ("" + ergebnis);

endergebnis = String.valueOf(ergebnis);
 

Chili

Aktives Mitglied
Okay danke. denn ich glaube ich baue noch einen Reset Button mit ein, da der Taschenrechner ja leider nur 2 Zahlen mit einander "verrechnen" kann, nämlich immer nur die letzten beiden die man eingibt.
Den zweiten Tip habe ich auch mal befolgt, so ist das natürlich eleganter gelöst ;-)

2) Wenn man nicht wahnsinnig viel verändern will, gibts keinen weg, das so zu Prgrammieren, dass er z.B. rechnen kann 3+4*5 sodass 23 und nicht 20 rauskommt oder? Da müsste ich doch denke ich mal das ganze Programm anders aufbauen, oder gehts auch einfacher?
 

L-ectron-X

Gesperrter Benutzer
Java rechnet von alleine schon richtig. Das heißt, es werden auch die allgemeinen Rechenregeln befolgt, also bspw. Punkt- vor Strichrechnung.
 

Chili

Aktives Mitglied
ja ich weiß...aber so wie ich das programmiert habe rechnet das Programm nur mit zwei Zahlen die erste ist die Zahl die im textfeld steht bevor das letzte Zeichen eingegeben wird und die zweite ist die die im Textfeldsteht bevor Gleich eigegeben wird. Man kann also soviele Zahl und zeichen eingeben wie man will gerechnet wird immer nur mit den letzten beiden.
 

Sky

Top Contributor
Chili hat gesagt.:
Wenn man nicht wahnsinnig viel verändern will, gibts keinen weg, das so zu Prgrammieren, dass er z.B. rechnen kann 3+4*5 sodass 23 und nicht 20 rauskommt oder? Da müsste ich doch denke ich mal das ganze Programm anders aufbauen, oder gehts auch einfacher?

Von was ausgehend ?

Wenn du die Zahlen so eingibst (3+4*5) kommt automtsisch 23 raus. Wenn Du aber deinen Rechner so programmiert hast, dass nur die beiden letzten Zahlen beachtet werden, so hast Du eine Erweiterung zu machen: das Ergebnis der letzten Rechnung soll erhalten bleiben.

btw.: Bei 'normaler' Verarbeitung, also wie es bei einem Taschenrechner üblich ist, würde 35 raus kommen: denn bei Eingabe des * wird die Addition von 3 und 4 erstmal ausgeführt.
 

SnooP

Top Contributor
und so würde ich das auch programmieren, weil es sonst wieder schwieriger werden würde... sprich parsen der Eingabezeile etc...
das heißt man muss erstmal gucken wieviel werte eingegeben wurden und dann ausrechnen und in "ergebnis" speichern... danach wird nur ergebnis verändert, wenn nen operator-knopp gedrückt wurde und ne anschließende zahl... etc...
 

Chili

Aktives Mitglied
Ähm...bei nem "normalen" Taschenrechner würde 23 rauskommen und nicht 35 denn es gilt immer noch Punkt vor Strich ;-)

Back to the Topic:
Ich hab glaube ich nicht verstanden wie ihr das meint. Wenn ich irgendwas ausrechne dann kann ich mit dem Ergebnis das mir ausgegeben wird direkt weiter rechnen also wenn mein Ergebnis da steht dann + weiß ich was zum Bsp. Das ist ja so ähnlich wie SnooP meinte oder?
 
B

Beni

Gast
Ich glaub, die meinen, wenn du direkt 3+4*5 eintippst in den Code, kommt das Richtige raus.

Wenn du "dynamisch" eingeben möchtest (als String), musst du dir einen Parser zusammenbasteln. Das kann dann solch einen Code ergeben.
 

Chili

Aktives Mitglied
Fuck das ist ja doppelt so lang wie mein bisheriges Programm o_O
Mhhh da muss ich nochmal gucken vielleicht reichts ja auch so wie ichs bis jetzt habe...

Zwischenfrage:
Ich bin dabei den Taschenrechner um die Funktion ^ zu erweitern. Aber anscheinend kann java das nicht:
double1 = double2 ^ double3 - oder? Kann java nur eine ganze Zahl als Exponent nehmen? Weil dann müsste ich ja einfach nur als Integer konvertieren...
Die Fehlermeldung ist: operator ^ cannot be applied to double,double
 

Chili

Aktives Mitglied
Und unter welcher Variablen ist dann das Ergebnis gespeichert?
Für meinen Fall würde ich dass dann mal so interpretieren: Math.pow(ersteZahl,zweiteZahl)
Achja und geht das überhaupt mir doubles?
 

André Uhres

Top Contributor
Klick mal auf diesen Link zur API:
http://java.sun.com/j2se/1.5.0/docs/api/
Links (unter All Classes) scrollst du runter und klickst auf Math.
Dann haste rechts die API-Dokumentation der Klasse Math (API=application program interface).
Dann scrollst du runter bis zu Method Summary. Dort klickst du auf die Methode pow.
Du siehst dann die Dokumentation der Methode pow.
 

Chili

Aktives Mitglied
Ahsoo gut verstanden.
Jetzt ists aber so, dass der wenn ich ne zahl drücke und dann ^ der einfach nichts macht als die zahl stehen bleibt. Ich bilde mir mal wieder ein, dass der Quelltext richtig sein müsste (bei den anderen Zeichen stehts ja genauso und es funktioniert):

Code:
public void actionPerformed(ActionEvent e) {        
        if (e.getSource() == btEins){
            dazuSchreiben("1");
        }
        if (e.getSource() == btZwei){
            dazuSchreiben("2");
        }     
        if (e.getSource() == btDrei){
            dazuSchreiben("3");
        }   
        if (e.getSource() == btVier){
            dazuSchreiben("4");
        }  
        if (e.getSource() == btFuenf){
            dazuSchreiben("5");
        }     
        if (e.getSource() == btSechs){
            dazuSchreiben("6");
        }
        if (e.getSource() == btSieben){
            dazuSchreiben("7");
        }     
        if (e.getSource() == btAcht){
            dazuSchreiben("8");
        }  
        if (e.getSource() == btNeun){
            dazuSchreiben("9");
        }     
        if (e.getSource() == btNull){
            dazuSchreiben("0");
        }     
        if (e.getSource() == btPlus){
            zeichen = "+";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }    
        if (e.getSource() == btMinus){
            zeichen = "-";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }      
        if (e.getSource() == btMal){
            zeichen = "*";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }       
        if (e.getSource() == btGeteilt){
            zeichen = "/";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }    
        if (e.getSource() == btGleich){
            String zwischen = tfAnzeige.getText();
            zweiteZahl = Double.parseDouble(zwischen);
            rechnen();
        }    
        if (e.getSource() == btPunkt){
            String zeichen = ".";
            tfAnzeige.setText(tfAnzeige.getText()+zeichen);
        }
        if (e.getSource() == btHoch){
            zeichen = "^";
            String zwischen = tfAnzeige.getText();
            ersteZahl = Double.parseDouble(zwischen);
            tfAnzeige.setText(zeichen);
            zeichenEingegeben = 1;
        }
    }
    
    public void dazuSchreiben(String neueZiffer) {
        if (zeichenEingegeben == 1) {
            tfAnzeige.setText(neueZiffer);
            zeichenEingegeben = 0;
        }
        else
        tfAnzeige.setText(tfAnzeige.getText()+neueZiffer);
    }
    
    public void rechnen() {
        if (zeichen == "+") {
        ergebnis = ersteZahl + zweiteZahl;
        String endergebnis = String.valueOf(ergebnis);
        tfAnzeige.setText(endergebnis);
        }
        if (zeichen == "-") {
        ergebnis = ersteZahl - zweiteZahl;
        String endergebnis = String.valueOf(ergebnis);
        tfAnzeige.setText(endergebnis);
        }
        if (zeichen == "*") {
        ergebnis = ersteZahl * zweiteZahl;
        String endergebnis = String.valueOf(ergebnis);
        tfAnzeige.setText(endergebnis);
        }
        if (zeichen == "/") {
        ergebnis = ersteZahl / zweiteZahl;
        String endergebnis = String.valueOf(ergebnis);
        tfAnzeige.setText(endergebnis);
        }
        if (zeichen == "^") {
        Math.pow(ersteZahl, zweiteZahl);
        String endergebnis = String.valueOf(ersteZahl);
        tfAnzeige.setText(endergebnis);
        }
    }
 

André Uhres

Top Contributor
Hast es doch nicht verstanden :wink:
Gemäss der Dokumentaion liefert pow einen double Wert zurück.
"Math.pow(ersteZahl, zweiteZahl)" ist also ein double den du in eine double Variable setzen kannst:
double result = Math.pow(ersteZahl, zweiteZahl);
Jetzt brauchst du nur noch result dem endergebnis zuzuweisen.
 

Chili

Aktives Mitglied
Okay Scheiße wurde geändert...es sollte also jetzt funktionieren tuts aber nicht...
Bei jedem anderen Zeichen was ich drücke wird sich ja die Zahl aus dem Anzeigefeld gemerkt und dann die Zahl gelöscht und das Zeichen hingeschrieben. Das Funktioniert. Bei ^ habe ich das genauso aufgebaut wie bei den anderen Zeichen (siehe oben) aber es Funktioniert nicht. Warum?
 

Chili

Aktives Mitglied
Leuteee so einem Idioten wir mir solltet ihr echt nicht mehr helfen ;-)
(auf keine Fall ernst gemeint^^)

Ich habe für die neuen Buttons noch keinen action listener *argh*
 
B

bygones

Gast
um immer sicher zu gehen vergleiche Strings nicht per ==, sondern werde ihrer Rolle als Objekte gerecht und nutze equals()
 

Chili

Aktives Mitglied
Danke für den Tip - wusste gar nicht dass es auch anders geht....
Okay nächste Verbesserungen meines Taschenrechners:

2) Einen Reset Button der das ganze Textfeld leert habe ich jetzt ergänzt, aber ich hätte gerne auch noch einen Delete Button falls man sich mal vertippt hat, der dann nur die letzte eingegebene Zahl löscht. Kann man das irgendwie realisieren mit einem möglichst einfachen Befehl?

3) Ich möchte dass nur noch mit Hilfe der Buttons und des Programms ins Textfeld geschrieben wird, also dass man nicht mehr das Textfeld anklicken und dann einfach per Tastatur reinschreiben kann. So eine Art Sperre oder so. Kann mir da jemand helfen?

4) Kann die Buttons irgendwie schöner gestalten/designen, z.B. abgerundete Ecken wie XP-Buttons oder irgendein anderes "Design"? Das Selbe gilt für den Hintergrund.
 

André Uhres

Top Contributor
Code:
               String text = tfAnzeige.getText();
                tfAnzeige.setText(text.substring(0, text.length()-1));
 

Chili

Aktives Mitglied
Cool danke. Funktioniert perfekt, sogar beim ersten mal Premiere heute für mich^^
Ich hab in meinem Beitrag davor noch Sachen ergänzt...könnt ihr dazu was sagen?
 

André Uhres

Top Contributor
Zu 3)
Code:
...
        private JLabel tfAnzeige;
...
            tfAnzeige = new JLabel();
            tfAnzeige.setOpaque(true);
...
 

Chili

Aktives Mitglied
Gut danke. Funktioniert. Also kann ich JLabel grundsätzlich genauso verwenden wie JTextField?

Letzte Frage (GUI):
Kann die Buttons irgendwie schöner gestalten/designen, z.B. abgerundete Ecken wie XP-Buttons oder irgendein anderes "Design"? Das Selbe gilt für den Hintergrund.
 

André Uhres

Top Contributor
Ein JLabel ist kein JTextComponent. Er kann also nicht unbedingt die Funktion eines JTextField übernehmen.
Aber für den Taschenrechner ist JLabel wohl die beste Lösung, da das "Textfeld" ja eigentlich nur der Anzeige dient.

Zum Look:
Beim JButton kann man schon noch ne Menge verändern ohne viel programmieren zu müssen,
z.B. background, foreground, font und border. Aber da gibt es so viel Varianten, dass es mir schwer fallen
dürfte, deinen Geschmack zu treffen. Hier nur ein kleines Beispiel als Anregung:
Code:
       jButton1.setBackground(new Color(255, 204, 51));
        jButton1.setFont(new Font("Tahoma", 3, 11));
        jButton1.setForeground(new Color(204, 51, 0));
        jButton1.setBorder(BorderFactory.createEtchedBorder());
 

Chili

Aktives Mitglied
Das mit den Buttons finde ich gut...also das das so einfach verändert werden kann...weil ich hatte bisher nur igendwo hier was gelesen von selber ne jpg erstellen und dann was austauschen oder so...
Naja gibts irgendwo eine Tabelle mit den Farbcodes?
 

Chili

Aktives Mitglied
Ach ja ich habe noch versucht was zu ändern am Recher, dass wenn man eine Zahl eingibt dann ein Rechenzeichen dann noch eine Zahl und ein Rechenzeichen, dass der Taschenrechner dann wie es dass manchmal gibt so eine Art Zwischenrechnung durchführt und das Ergebnis der ersten beiden Zahlen auf den Schirm bringt und dann das ab da wie die erste Zahl behandelt, also damit weiterrechnet. Weist du was ich meine? Aber da kommt eine Fehlermeldung die hab ich in dem Thread nebenan, illeagl start of expression, beschrieben. Kannst du dir das mal angucken?
 

André Uhres

Top Contributor
Du kannst dir den JColorChooser anzeigen lassen. Darin findest du alle Codes:
Code:
           JFrame colorFrame = new JFrame("JColorChooser");
            colorFrame.getContentPane().add(new JColorChooser());
            colorFrame.pack();
            colorFrame.setVisible(true);
 

Chili

Aktives Mitglied
Cool thx...damit kann ich was anfangen und rumprobieren...dann hab ich jetzt schon mal die Feinheiten geklärt...jetzt bleibt nur noch das Problemchen (siehe oben)...
 

André Uhres

Top Contributor
Also ich kann mich nicht um alle Threads kümmern :?
Ich helf dir gern. Aber dann bleib bitte bei diesem Thread :wink:
 

Chili

Aktives Mitglied
Okay =) verstehe ich ;-)
Das andere Problem wurde schon gelöst...also wenn ich nochmal was auf dem Herzen habe melde ich mich hier ;-)
Danke schonmal...
 

Chili

Aktives Mitglied
Oh Mist ich habe ein Problem (diesmal keine Syntax), aber das ist was größer... Also wenn du für sowas "großes" Nerven hast stelle ich mal den ganzen Quelltext rein. Ich weiß auch schon wo das Problem liegt aber ich weiß nicht wie ich es verbessern soll ohne dass dadurch ein neues Problem auftritt. Also Lust auf ne Knobelaufgabe? ;-)
 

Chili

Aktives Mitglied
;-) Aaaaalsoooo hier erst mal der komplette Quelltext:

rausgenommen

Das Problem liegt in dem Objekt dazuSchreiben. Dadurch, dass wenn zeichenEingegeben 1 ist das danach auf wieder auf 0 gesetzt wird kann der Fall das zeichenEingegeben 2 wird ja gar nicht eintreten. Egal wie oft man ein Zeichen drückt. Wenn ich jetzt aber den Befehl da lösche, der das wieder auf 0 setzt habe ich ja ein neues Problem: Nicht nur die erste Zahl die nach einem Zeichen eingegeben wird "überschreibt" praktisch das Anzeigefeld sondern jede weitere, also kann dann nur noch eine Zahl im Anzeigefeld stehen. Schaut euch mal den Quelltext an und versucht das (am besten ganze Programm) nachzuvollziehen bitte. Ich weiß absolut nicht wie ich das jetzt lösen könnte.
 

André Uhres

Top Contributor
So wie das Programm jetzt ist funzt es ja auch nicht: 1+1=12 ???:L
Ausserdem frage ich mich warum das jetzt so kompliziert werden muss.
Was willst du eigentlich erreichen ?
 

Chili

Aktives Mitglied
Ja so wie es jetzt ist gibts allemöglichen Arten von Fehlern unter anderem dieser.

Das ganze ist ja ein Informatik Projekt das unser Lehrer uns für die Ferien gegeben hat. Der hat die Aufgabe aber sehr schwammig formuliert. Ein einfacher Taschenrechner. Jetzt kann man an einen einfachen Taschenrechner natürlich verschiedene Erwartungen haben... Falls ich das nicht hinkriege (Dienstag ist Abgabe) was ich im Moment versuche gebe ich die funktionsfähige einfachere Version ab.

Das Problem an der einfacheren Version, die ich ja hier zu verbessern versuche, ist dass der Taschenrechner praktisch nur mit den beiden Zahlen und dem Rechenzeichen arbeitet, die als letztes eingegeben wurden. Also wenn ich eingebe 10 + 30 - 20 =
dann interessiert sich dieser einfache Taschenrechner nur für 30 - 20 = und gibt das Ergebnis 10. Das ist evtl noch vertretbar da im Anzeigefeld ja nicht die komplette Gleichung steht sondern immer nur der letzte Teil. Wenn die komplette Gleichung in der Anzeige stände und man dann = drückt und es kommt 10 raus wäre es ja eindeutig falsch. So ist das vielleicht noch vertretbar oder?
Naja und hier mit dieser Verbesserung versuche ich zu erreichen, dass wenn ein zweites Zeichen gedrückt wird, in dem Falle der Gleichung oben also -, dass dann eine Art Zwischenrechnung durchgeführt wird und er das bisher eingetippte ausrechnet als ersteZahl speichert und auch ausgibt, sodass damit dann weitergerechnet werden kann. Das ist das zumindest das Ziel.
Ist etwas schwierig zu erklären. Frag wenn was unklar ist.
 

Chili

Aktives Mitglied
x0 o_O Das probier ich nachher mal aus. Scheiße ey wenns so einfach ist bin ich mal sowas von dämlich^^ Kann echt sein dass es so klappt.... *argh*
 

Chili

Aktives Mitglied
Ne klappt so nicht. Das hat glaube ich 2 Gründe:
1) Wenn rechnen durch Gleich aufgerufen wird, dann ist zweiteZahl belegt (in der Methode gleich wird die ja belegt). Wenn rechnen durch ein anderes Zeichen aufgerufen wird ist die zweiteZahl immer 0 weil nicht anders belegt wurde und es kommt als Ergebnis nur die erste Zahl raus.

2) Und das ist nicht so wichtig weil es nur ein Zeichen betrifft: nämlich ^. Ist iunter anderem der selbe Fehler wie 1) da nämlich zweiteZahl 0 ist ist das Ergebnis immer 1 und zwar schon wenn man das erste Zeichen eingibt. Ich möchte z.B. eingeben 2^3 und wenn ich hoch drücke steht da dann 1 weil die Methode rechnen durchgefürht wurde. Also wird ^ dadurch völlig "unrechenbar".

Aber der Ansatz gefällt mir weil recht einfach ist. Vielleicht müsste man das nur noch etwas verfeinern/anpassen.
 

André Uhres

Top Contributor
Wenn man auf ein Zeichen klickt, dann müsste in der Anzeige das Ergebnis zu sehen sein.
Das ist dann in der Folge die erste Zahl...
Code:
12    -->     Anzeige: 12
+     -->     Anzeige: 12
23    -->     Anzeige: 23
+     -->     Anzeige: 35
6     -->     Anzeige: 6
-     -->     Anzeige: 41
10    -->     Anzeige: 10
/     -->     Anzeige: 31
2     -->     Anzeige: 2
=     -->     Anzeige: 15,5
 

Chili

Aktives Mitglied
Das ist schon gut gedacht aber es passiert folgendes:

12 --> 12
+ --> +
23 --> 23
+ ---> 23
6 --> 6
- --> 6
10 --> 10
/ --> infinyty
und so weiter


Da ist n Fehler drin nämlich wie ich in dem Post zuvor versucht habe zu beschreiben. Die methode rechnen() funktioniert ja nur richtig wenn sie durch das drücken von gleich aufgerufen wird, weil nur bei gleich die zweiteZahl belegt wird (siehe Quelltext). Wenn ich rechnen() beispielsweise durch + aufrufe bleibt zweiteZahl beim default Wert (siehe Quelltext) weil bei zweiteZahl bei + nicht anders belegt wird. Verstehst du?
 

André Uhres

Top Contributor
Code:
/* 
* TaschenrechnerGUI.java 
*/ 
import javax.swing.*; 
import javax.swing.text.*; 
import java.awt.*; 
import java.awt.event.*; 
class TaschenrechnerGUI implements ActionListener { 
    private JFrame fenster; 
    private JPanel pnFenster; 
    private JLabel tfAnzeige; 
    private JButton btEins; 
    private JButton btZwei; 
    private JButton btDrei; 
    private JButton btVier; 
    private JButton btFuenf; 
    private JButton btSechs; 
    private JButton btSieben; 
    private JButton btAcht; 
    private JButton btNeun; 
    private JButton btNull; 
    private JButton btPlus; 
    private JButton btMinus; 
    private JButton btMal; 
    private JButton btGeteilt; 
    private JButton btGleich; 
    private JButton btPunkt; 
    private JButton btHoch; 
    private JButton btBack; 
    private JButton btReset; 
    private String zeichen1 = "+"; 
    private int zeichenEingegeben; 
    private double ersteZahl; 
    private double zweiteZahl; 
    private double ergebnis; 
    public  TaschenrechnerGUI() { 
        erzeugeFenster(); 
    } 
    private void erzeugeFenster() { 
        fenster = new JFrame("Einfacher Taschenrechner"); 
        //Anlegen des Inhaltsbereiches 
        pnFenster = (JPanel) fenster.getContentPane(); 
        fenster.setSize(180,285); 
        pnFenster.setLayout(null); 
        fenster.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
        pnFenster.setBackground(Color.black); 
        tfAnzeige = new JLabel(); 
        tfAnzeige.setBounds(20,20,130,20); 
        tfAnzeige.setBackground(Color.white); 
        tfAnzeige.setHorizontalAlignment(SwingConstants.RIGHT); 
        tfAnzeige.setOpaque(true); 
        pnFenster.add(tfAnzeige); 
        btEins = new JButton("1"); 
        btEins.setBounds(20,140,25,25); 
        pnFenster.add(btEins); 
        btZwei = new JButton("2"); 
        btZwei.setBounds(55,140,25,25); 
        pnFenster.add(btZwei); 
        btDrei = new JButton("3"); 
        btDrei.setBounds(90,140,25,25); 
        pnFenster.add(btDrei); 
        btVier = new JButton("4"); 
        btVier.setBounds(20,105,25,25); 
        pnFenster.add(btVier); 
        btFuenf = new JButton("5"); 
        btFuenf.setBounds(55,105,25,25); 
        pnFenster.add(btFuenf); 
        btSechs = new JButton("6"); 
        btSechs.setBounds(90,105,25,25); 
        pnFenster.add(btSechs); 
        btSieben = new JButton("7"); 
        btSieben.setBounds(20,70,25,25); 
        pnFenster.add(btSieben); 
        btAcht = new JButton("8"); 
        btAcht.setBounds(55,70,25,25); 
        pnFenster.add(btAcht); 
        btNeun = new JButton("9"); 
        btNeun.setBounds(90,70,25,25); 
        pnFenster.add(btNeun); 
        btNull = new JButton("0"); 
        btNull.setBounds(20,175,25,25); 
        pnFenster.add(btNull); 
        btPlus = new JButton("+"); 
        btPlus.setBounds(125,175,25,25); 
        pnFenster.add(btPlus); 
        btMinus = new JButton("-"); 
        btMinus.setBounds(125,140,25,25); 
        pnFenster.add(btMinus); 
        btMal = new JButton("*"); 
        btMal.setBounds(125,105,25,25); 
        pnFenster.add(btMal); 
        btGeteilt = new JButton("/"); 
        btGeteilt.setBounds(125,70,25,25); 
        pnFenster.add(btGeteilt); 
        btGleich = new JButton("="); 
        btGleich.setBounds(90,210,60,25); 
        pnFenster.add(btGleich); 
        btPunkt = new JButton("."); 
        btPunkt.setBounds(55,175,25,25); 
        pnFenster.add(btPunkt); 
        btHoch = new JButton("^"); 
        btHoch.setBounds(90,175,25,25); 
        pnFenster.add(btHoch); 
        btReset = new JButton("C"); 
        btReset.setBounds(55,210,25,25); 
        pnFenster.add(btReset); 
        btBack = new JButton("Del"); 
        btBack.setBounds(20,210,25,25); 
        pnFenster.add(btBack); 
        btEins.addActionListener(this); 
        btZwei.addActionListener(this); 
        btDrei.addActionListener(this); 
        btVier.addActionListener(this); 
        btFuenf.addActionListener(this); 
        btSechs.addActionListener(this); 
        btSieben.addActionListener(this); 
        btAcht.addActionListener(this); 
        btNeun.addActionListener(this); 
        btNull.addActionListener(this); 
        btPlus.addActionListener(this); 
        btMinus.addActionListener(this); 
        btMal.addActionListener(this); 
        btGeteilt.addActionListener(this); 
        btGleich.addActionListener(this); 
        btPunkt.addActionListener(this); 
        btHoch.addActionListener(this); 
        btReset.addActionListener(this); 
        btBack.addActionListener(this); 
        btEins.setMargin(new Insets(0,0,0,0)); 
        btZwei.setMargin(new Insets(0,0,0,0)); 
        btDrei.setMargin(new Insets(0,0,0,0)); 
        btVier.setMargin(new Insets(0,0,0,0)); 
        btFuenf.setMargin(new Insets(0,0,0,0)); 
        btSechs.setMargin(new Insets(0,0,0,0)); 
        btSieben.setMargin(new Insets(0,0,0,0)); 
        btAcht.setMargin(new Insets(0,0,0,0)); 
        btNeun.setMargin(new Insets(0,0,0,0)); 
        btNull.setMargin(new Insets(0,0,0,0)); 
        btPlus.setMargin(new Insets(0,0,0,0)); 
        btMinus.setMargin(new Insets(0,0,0,0)); 
        btMal.setMargin(new Insets(0,0,0,0)); 
        btGeteilt.setMargin(new Insets(0,0,0,0)); 
        btGleich.setMargin(new Insets(0,0,0,0)); 
        btPunkt.setMargin(new Insets(0,0,0,0)); 
        btHoch.setMargin(new Insets(0,0,0,0)); 
        btReset.setMargin(new Insets(0,0,0,0)); 
        btBack.setMargin(new Insets(0,0,0,0)); 
        fenster.setVisible(true); 
    } 
    public void actionPerformed(final ActionEvent e) { 
        if (e.getSource() == btEins){ 
            dazuSchreiben("1"); 
        } 
        if (e.getSource() == btZwei){ 
            dazuSchreiben("2"); 
        } 
        if (e.getSource() == btDrei){ 
            dazuSchreiben("3"); 
        } 
        if (e.getSource() == btVier){ 
            dazuSchreiben("4"); 
        } 
        if (e.getSource() == btFuenf){ 
            dazuSchreiben("5"); 
        } 
        if (e.getSource() == btSechs){ 
            dazuSchreiben("6"); 
        } 
        if (e.getSource() == btSieben){ 
            dazuSchreiben("7"); 
        } 
        if (e.getSource() == btAcht){ 
            dazuSchreiben("8"); 
        } 
        if (e.getSource() == btNeun){ 
            dazuSchreiben("9"); 
        } 
        if (e.getSource() == btNull){ 
            dazuSchreiben("0"); 
        } 
        if (e.getSource() == btPlus){ 
            if(zeichenEingegeben == 0) rechnen(); 
            zeichen1 = "+"; 
        } 
        if (e.getSource() == btMinus){ 
            if(zeichenEingegeben == 0) rechnen(); 
            zeichen1 = "-"; 
        } 
        if (e.getSource() == btMal){ 
            if(zeichenEingegeben == 0) rechnen(); 
            zeichen1 = "*"; 
        } 
        if (e.getSource() == btGeteilt){ 
            if(zeichenEingegeben == 0) rechnen(); 
            zeichen1 = "/"; 
        } 
        if (e.getSource() == btHoch){ 
            if(zeichenEingegeben == 0) rechnen(); 
            zeichen1 = "^"; 
        } 
        if (e.getSource() == btGleich){ 
            rechnen(); 
            ersteZahl = 0; 
            zeichen1 = "+"; 
            zeichenEingegeben = 0; 
        } 
        if (e.getSource() == btPunkt){ 
            String zeichen = "."; 
            tfAnzeige.setText(tfAnzeige.getText()+zeichen); 
        } 
        if (e.getSource() == btReset) { 
            tfAnzeige.setText(""); 
            ersteZahl = 0; 
            zeichen1 = "+"; 
        } 
        if (e.getSource() == btBack) { 
            String text = tfAnzeige.getText(); 
            tfAnzeige.setText(text.substring(0, text.length()-1)); 
        } 
    } 
    private void dazuSchreiben(final String neueZiffer) { 
        if (zeichenEingegeben == 1) { 
            tfAnzeige.setText(neueZiffer); 
            zeichenEingegeben = 0; 
        }else{ 
            tfAnzeige.setText(tfAnzeige.getText()+neueZiffer); 
        } 
    } 
    private void rechnen() { 
        String zwischen = tfAnzeige.getText(); 
        zweiteZahl = Double.parseDouble(zwischen); 
        if (zeichen1.equals("+")) { 
            ergebnis = ersteZahl + zweiteZahl; 
            String endergebnis = String.valueOf(ergebnis); 
            tfAnzeige.setText(endergebnis); 
        } 
        if (zeichen1.equals("-")) { 
            ergebnis = ersteZahl - zweiteZahl; 
            String endergebnis = String.valueOf(ergebnis); 
            tfAnzeige.setText(endergebnis); 
        } 
        if (zeichen1.equals("*")) { 
            ergebnis = ersteZahl * zweiteZahl; 
            String endergebnis = String.valueOf(ergebnis); 
            tfAnzeige.setText(endergebnis); 
        } 
        if (zeichen1.equals("/")) { 
            ergebnis = ersteZahl / zweiteZahl; 
            String endergebnis = String.valueOf(ergebnis); 
            tfAnzeige.setText(endergebnis); 
        } 
        if (zeichen1.equals("^")) { 
            ergebnis = Math.pow(ersteZahl, zweiteZahl); 
            String endergebnis = String.valueOf(ergebnis); 
            tfAnzeige.setText(endergebnis); 
        } 
        ersteZahl = ergebnis; 
        zeichenEingegeben = 1; 
    } 
    public static void main(String[] args) {new TaschenrechnerGUI();} 
}
 

Chili

Aktives Mitglied
Danke für deine Antwort. Da ich jetzt für den ganzen Tag weg muss, habe ich keine Zeit die zu testen.

Heute morgen bevor ich deinen Post gelesen habe ist mir ein Einfall gekommen und ich habs programmiert und es scheint grundsätzlich zu funktionieren. Daher werde ich mir den Quelltext ausdrucken mitnehmen und "durchspielen" ob Fehler auftreten können.
 

Chili

Aktives Mitglied
So jetzt habe ich die Idee ein bisschen verfeinert und es funktioniert schon ganz gut. Das (glaube ich) einzige Problem ist, dass wenn ein zweites Zeichen gedrückt wurde er zwar rechnen aber das Ergebnis nicht ins Anzeigefeld schreibt. Warum verstehe ich nicht. Hier der Quelltext:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Bedingtes ODER wird nicht erkannt Java Basics - Anfänger-Themen 3
C Rechnen mit Brüchen, ist meine Lösung soweit richtig? Java Basics - Anfänger-Themen 4
C Kann mir jemand sagen warum ich nicht mal rechnen kann ? Java Basics - Anfänger-Themen 32
Liroyd Methode mit Objektvariabel rechnen? Java Basics - Anfänger-Themen 6
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
Zeppi Geteilt rechnen Java Basics - Anfänger-Themen 2
D Mit Objekten rechnen, Textfield, JavaFX, Noob Java Basics - Anfänger-Themen 8
L Mit Zahlen im String rechnen Java Basics - Anfänger-Themen 19
L Datentypen Rechnen und abrunden mit double Java Basics - Anfänger-Themen 7
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
D Operatoren Mit Objekten rechnen Java Basics - Anfänger-Themen 7
P Rechnen mit Brüchen - objektorientierte Programmierung Java Basics - Anfänger-Themen 18
S Rechnen mit MaxValue Java Basics - Anfänger-Themen 7
L Rechnen mit Objekten Java Basics - Anfänger-Themen 3
W Erste Schritte Rechnen mit Schleifen? Denkanstoß gesucht Java Basics - Anfänger-Themen 15
W Seltames Problem bei Rechnen mit BigIntegers Java Basics - Anfänger-Themen 2
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
S Jede Ziffer einer Zahl auslesen, damit rechnen und beim Ergebnis wiederholen ? Java Basics - Anfänger-Themen 20
S Dezimalzahlen rechnen Java Basics - Anfänger-Themen 3
kilopack15 Rechnen mit großen Zahlen Java Basics - Anfänger-Themen 6
D Rechnen mit numerischen Datentyp Frage Java Basics - Anfänger-Themen 16
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
1 Mit Java Rechnen Java Basics - Anfänger-Themen 10
T Einstieg in "grafische Progammierung" + Rechnen in Flussdiagramm Java Basics - Anfänger-Themen 2
W Variablen float rundet beim Bruch rechnen Java Basics - Anfänger-Themen 3
N Oracle SQL mit Zwischenergebnis rechnen Java Basics - Anfänger-Themen 2
Y Variable Menge von Objekten erzeugen und mit ihren Attributen rechnen Java Basics - Anfänger-Themen 7
S Double mithilfe eines Scanners so einlesen, dass ich damit rechnen kann Java Basics - Anfänger-Themen 4
J Char-Rechnen Java Basics - Anfänger-Themen 8
A Rechnen mit Set/Get? Java Basics - Anfänger-Themen 2
Z Erste Schritte Instanzmethoden Rechnen (Bruch) Java Basics - Anfänger-Themen 18
M Mit Werten aus Arrays in anderen Methoden rechnen? Java Basics - Anfänger-Themen 3
J Mit Datum rechnen Java Basics - Anfänger-Themen 11
F Erste Schritte [GUI] Dual in Dezimal rechnen Java Basics - Anfänger-Themen 5
D Erste Schritte Rechnen mit Brüchen Java Basics - Anfänger-Themen 13
D rechnen mit Stunden und Minuten Java Basics - Anfänger-Themen 14
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
G Rechnen mit Long Variablen Java Basics - Anfänger-Themen 4
N Probleme beim Rechnen mit Integer und double Java Basics - Anfänger-Themen 4
W Variablen Rechnen mit "char" Java Basics - Anfänger-Themen 2
Joew0815 Compiler-Fehler Unexpected Type - Problem mit Variablen rechnen Java Basics - Anfänger-Themen 7
F Werte aus Tabelle vergleichen/rechnen Java Basics - Anfänger-Themen 5
C Mit Potenzen rechnen "Problem" Java Basics - Anfänger-Themen 3
M Mit Array rechnen Java Basics - Anfänger-Themen 9
T Rechnen in Arrays Java Basics - Anfänger-Themen 11
B von Ergebniss weiter rechnen Java Basics - Anfänger-Themen 3
S Rechnen mit Datum bzw. Uhrzeit Java Basics - Anfänger-Themen 3
S Datentypen Operatoren und Ausdrücke (formel richtig rechnen) Java Basics - Anfänger-Themen 8
N Mit long rechnen Java Basics - Anfänger-Themen 2
K Übungsblatt 13 Aufgabe 6 (Rechnen) Java Basics - Anfänger-Themen 12
C Mit Gleitkommazahlen rechnen Java Basics - Anfänger-Themen 20
T Rechnen mit Operatoren Java Basics - Anfänger-Themen 2
W Mit (char) rechnen Java Basics - Anfänger-Themen 3
F Mit Arrays rechnen Java Basics - Anfänger-Themen 12
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
B mit benutzereingaben rechnen Java Basics - Anfänger-Themen 4
L Bruch rechnen Java Basics - Anfänger-Themen 29
B mit Datum rechnen Java Basics - Anfänger-Themen 10
D Rechnen mit int Array Java Basics - Anfänger-Themen 9
M mit Uhrzeit rechnen Java Basics - Anfänger-Themen 11
T mit Winkel & Sinus rechnen / sin(30°)=2,5 Java Basics - Anfänger-Themen 7
A Rechnen mit big integer Java Basics - Anfänger-Themen 29
L Mit matrizen rechnen Java Basics - Anfänger-Themen 19
W Probleme mit double rechnen Java Basics - Anfänger-Themen 4
J Datentypen Rechnen mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 3
K mit einer int rechnen Java Basics - Anfänger-Themen 10
M Warum -48 rechnen? Java Basics - Anfänger-Themen 3
K Java Code rechnen Java Basics - Anfänger-Themen 7
F Rechnen mit komplexen Zahlen Java Basics - Anfänger-Themen 23
C Datentypen Unklarheiten beim Rechnen Java Basics - Anfänger-Themen 5
W Modulo rechnen Java Basics - Anfänger-Themen 3
H Datentypen Rechnen und Runden Java Basics - Anfänger-Themen 2
S Rechnen mit Zeitangaben Java Basics - Anfänger-Themen 5
Binary.Coder Doppeltes Hashing verläuft in "Endlosscheife" beim rechnen per Hand Java Basics - Anfänger-Themen 8
F Mit Anzahl Startparametern rechnen Java Basics - Anfänger-Themen 17
T mit List<Integer> rechnen Java Basics - Anfänger-Themen 9
O einfaches rechnen mit zahlen Java Basics - Anfänger-Themen 4
K Stunden zusammen Rechnen Java Basics - Anfänger-Themen 4
T mit Typen Date rechnen Java Basics - Anfänger-Themen 6
S mit Werten aus 2D-Array rechnen Java Basics - Anfänger-Themen 32
J Anfänger-Problem: Rechnen mit Java Java Basics - Anfänger-Themen 3
J Mit Java exp Rechnen ? Java Basics - Anfänger-Themen 4
P Mit double und BigDecimal rechnen Java Basics - Anfänger-Themen 6
K Wie zerlege Ich einen String zum Rechnen? Java Basics - Anfänger-Themen 3
D Rechnen mit zwei Klassen Java Basics - Anfänger-Themen 19
J Mit Zeitzonen rechnen! Java Basics - Anfänger-Themen 3
G Float schneidet nach dem Rechnen auf eine Stelle ab Java Basics - Anfänger-Themen 9
L Eingeben Rechnen Ausgeben - Leider nicht so einfach Java Basics - Anfänger-Themen 31
G Mit tastatureingaben rechnen Java Basics - Anfänger-Themen 10
B Großer Java bug beim rechnen? Java Basics - Anfänger-Themen 66
S mit Strings rechnen Java Basics - Anfänger-Themen 16
D mit request.getParameter("x") rechnen Java Basics - Anfänger-Themen 3
T mit byte rechnen. ? Java Basics - Anfänger-Themen 8
MrTical Zahlen einlesen um damit zu rechnen Java Basics - Anfänger-Themen 5
Safado modulo rechnen Java Basics - Anfänger-Themen 5
F mit Dualzahlen rechnen Java Basics - Anfänger-Themen 5
J Rechnen mit Dualzahlen Java Basics - Anfänger-Themen 5
G mit Strings rechnen (Unicode) Java Basics - Anfänger-Themen 15
H Modulo rechnen Java Basics - Anfänger-Themen 17
T Rechnen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben