java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Java Basics - Anfänger-Themen

Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 24.02.2008, 16:45   #1 (permalink)
Neuer Benutzer
short
 
Registriert seit: 20.02.2008
Fachbeiträge: 16
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard Taschenrechner mit GUI

Hallo,

ich habe einen Taschenrechner nach diesem Tutorial nach programmiert.

Ich möchte den Taschenrechner um weitere Funktionen wie z.B. Wurzel, Prozentrechnung etc. ergänzen.

Da ich Anfänger bin, werden trotz diesem guten Tutorial nicht alle Fragen beantwortet.

Zur Zeit macht mir die Wurzelberechnung Probleme. Die Wurzel berechnen ist nicht weiter schwierig sondern eher wie der Ersteller des Tutorials die Berechnungen durchführen lässt.

Der Rechenalgorithmus (Funktion public void calculate(double x) bekommt nur eine Zahl von Typ double und damit wird alles berechnet.

Nun wenn ich die Wurzel berechnen möchte und 81 + Operator Wurzel dann steht immer noch 81 im Display und nicht das erwartete Ergebnis 9.

Der komplette Code:

Code:
import java.awt.*;
import javax.swing.*;

// Stellt die Schnittstelle und Klassen fuer die
// Ereignisbehandlung welche durch AWT Komponenten
// erzeugt wurden bereit
import java.awt.event.*;


/**
 * Erzeugt einen kleinen Taschenrechner.
 * @version 1.0 23.02.2008
 * @author hamster
 *
 */
public class Calculator
{
	
	public static void main(String[] args)
	{
		CalculatorFrame frame = new CalculatorFrame();
		// Wenn Frame geschlossen -> Programm schlie�en
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// Frame sichtbar machen
		frame.setVisible(true);
	}
}	

/**
 * Erzeugt einen Rahmen(Frame oder Container genannt). Der Frame nimmt
 * die Teile der Benutzeroberflaeche auf.
 * @param args
 */
class CalculatorFrame extends JFrame
{
	public CalculatorFrame()
	{
		// Name der Titelleiste
		setTitle("Calculator"); 
		CalculatorPanel panel = new CalculatorPanel();
		add(panel);
		// Groesse des Fensters an seine Komponenten anpassen(Tasten)
		pack();
	}
}

/**
 * Ausgaben und und/oder Menuleisten werden durch Panels erzeugt.
 * Panels selbst sind Container und Oberflaechen. Diese Panels werden
 * in ein Frame eingefuegt.
 * 
 * Das Frame selbst besteht aus mehreren darueberliegenden Layern,
 * dem Root Pane, dem Layered Pane, dem Glass Pane und dem
 * Content Pane. 
 * @author hamster
 *
 */


class CalculatorPanel extends JPanel
{
	
	private JPanel panel;
	private JButton display;
	private boolean start;
	private double result;
	private String lastCommand;
	
	public CalculatorPanel()
	{
		// Layout-Manager festlegen
		setLayout(new BorderLayout());
		
		result = 0;
		// Gibt das Ergebnis aus und ist das letzte Kommando der Berechnung.
		// Wird erneut eine Zahl gedrueckt beginnt eine neue Berechnung.
		lastCommand = "=";
		// Startflag setzen
		start = true;
		
		// Display hinzufuegen
		display = new JButton("0");
		display.setEnabled(false);
		// Display oben positionieren
		add(display, BorderLayout.NORTH);
		
		// Actionlistener insert erzeugen
		ActionListener insert = new InsertAction();
		// ActionListener command erzeugen
		ActionListener command = new CommandAction();
		
		panel = new JPanel();
		// Angabe der Anzahl von Spalten und Zeilen im Konstruktor
		panel.setLayout(new GridLayout(4, 5));
		
		// Generierung der numerischen Taschenrechner-Tasten
		addButton("7", insert);
		addButton("8", insert);
		addButton("9", insert);
		addButton("/", command);
		addButton("√", command);
		addButton("4", insert);
		addButton("5", insert);
		addButton("6", insert);
		addButton("*", command);
		addButton("x2", command);
		addButton("1", insert);
		addButton("2", insert);
		addButton("3", insert);
		addButton("-", command);
		addButton("%", command);
		addButton("0", insert);
		addButton(".", insert);
		addButton("=", command);
		addButton("+", command);
		addButton("xyz", command);
		
		// Panel Komponenten im Centerblock platzieren
		add(panel, BorderLayout.CENTER);
	}
	/**
	 * Taste in die mittlere Grundflaeche einfuegen.
	 * @param label Beschriftung der Taste
	 * @param listener der Ereignisempfaenger fuer die Taste
	 */
	private void addButton(String label, ActionListener listener)
	{
		JButton button = new JButton(label);
		// Ereignisempfaenger fuer die Schaltflaeche
		button.addActionListener(listener);
		panel.add(button);
	}
	
	/**
	 * Diese Aktion fuegt den String der Tastenaktion an das Ende
	 * des Anzeigetextes an
	 */
	private class InsertAction implements ActionListener
	{
		public void actionPerformed(ActionEvent event)
		{
			String input = event.getActionCommand();
			// Beim Start keinen Text anzeigen
			// Das Start Flag anschlie�end auf false setzen
			if(start)
			{
				display.setText("");
				start = false;
			}
			// Text anzeigen
			display.setText(display.getText() + input);
		}
				
	}
	
	/**
	 * Diese Aktion fuehrt den mit der Taste verbundenen
	 * Befehl aus.
	 * @author hamster
	 *
	 */
	private class CommandAction implements ActionListener
	{
		public void actionPerformed(ActionEvent event)
		{
			String command = event.getActionCommand();
			
			// Fuege den Praefix "-" an den String an wenn
			// es sich um den ersten Befehl handelt(negative Zahl
			if(start)
			{
				if(command.equals("-"))
				{
					display.setText(command);
					start = false;
				}
				else
				{
					lastCommand = command;
				}
			}
			else
			{
				// Berechnung ausfuehren
				calculate(Double.parseDouble(display.getText()));
				lastCommand = command;
				start = true;
			}
		}
	}	
		/**
		 * Fuehrt die anstehenden Berechnungen aus.
		 * @param x der mit dem vorherigen Ergebnis zu berechende Wert
		 */
		public void calculate(double x)
		{
			if(lastCommand.equals("+"))
				result = result + x;
			else if(lastCommand.equals("-"))
				result = result - x;
			else if(lastCommand.equals("*"))
				result = result * x;
			else if(lastCommand.equals("/"))
				result = result / x;
			else if(lastCommand.equals("√"))
				result = squirt(x);
				
		//	else if(lastCommand.equals("x2"))
				
			//	result = 
			else if(lastCommand.equals("="))
				result = x;
				display.setText("" + result);
			
		}
	
		public Double squirt(double y)
		{
			Math.sqrt(y);
			return y;
		}
		
}
Hat jemand eine Idee wie ich das einbauen könnte?

Mit
Code:
result = Math.sqrt(x);
ging es auch nicht.

Grüße
Holger
HolgerB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 24.02.2008, 17:04   #2 (permalink)
Premium-Benutzer
 
Benutzerbild von Beni
 
Registriert seit: 07.02.2004
Fachbeiträge: 7.817
Abgegebene Danke: 10
Erhielt 152 Danke für 74 Beiträge
Wird der Befehl überhaupt richtig aufgerufen?
Code:
         else if(lastCommand.equals("√")){
            System.out.println( "Ja ich werde aufgerufen" );
            result = squirt(x);
         }
Falls das nichts ausgiebt, ist was mit deinen Strings falsch.

"result = Math.sqrt( x );" wäre IMHO nämlich schon richtig.
__________________
dock.javaforge.com

Byte-Welt
Beni ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 24.02.2008, 17:12   #3 (permalink)
P
Nicht angemeldet
 
Fachbeiträge: n/a
Hi!

Die squirt-Methode ist etwas fehlerhaft:
Code:
public Double squirt(double y)
      {
         Math.sqrt(y);
         return y;
      }
Da du der sqrt-Methode einen primitiven Datentyp übergibst, wird der Wert von y nur kopiert und nicht überschrieben, d.h. du musst das Ergebnis aus Math.sqrt(y) einer Variable wieder übergeben, z.B. mit y = Math.sqrt(y)

Btw: ich wäre vorsichtig, Buttons über Labels, die Sonderzeichen enthalten, zu identifizieren. Aber das gehört nicht hier her
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 24.02.2008, 17:14   #4 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 27.01.2008
Fachbeiträge: 167
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
hm und ich dachte immer, "sqrt" würde für "square root" stehen
Pappenheimer++ ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 24.02.2008, 17:18   #5 (permalink)
P
Nicht angemeldet
 
Fachbeiträge: n/a
lol@Pappenheimer++

Wir spritzen der Diskriminante was in den Hintern, dann wird sie kleiner
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 24.02.2008, 17:29   #6 (permalink)
Neuer Benutzer
short
Themenstarter
 
Registriert seit: 20.02.2008
Fachbeiträge: 16
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Hallo,

@ P
Habe ich geändert. Danke.

@ Beni

Nein wird nicht ausgeführt.

So wie ich den Code sehe erwartet das Programm eine zweite Zahl nach der Angabe des Rechenzeichens.
Bei +,-,*,/ erscheint das Ergebnis erst beim Drücken der "=" Taste.

Da bei der Wurzel keine zweite Zahl kommt funktioniert es anscheinend nicht. Der Grund muss irgendwo Code stecken, nur als Anfänger sehe ich diesen (noch) nicht.

Das ist das Problem was ich versuche zu lösen.

Grüße
Holger
HolgerB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 25.02.2008, 15:08   #7 (permalink)
Neuer Benutzer
short
Themenstarter
 
Registriert seit: 20.02.2008
Fachbeiträge: 16
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Hallo,

So, ich habs nun selbst gelöst.

Falls es jemanden interessiert:
Damit das mit dem Wurzel ziehen funktioniert habe ich eine if-Bedingung eingebaut.


Code:
private class CommandAction implements ActionListener
	{
		public void actionPerformed(ActionEvent event)
		{
			String command = event.getActionCommand();
			
			// Fuege den Praefix "-" an den String an wenn
			// es sich um den ersten Befehl handelt(negative Zahl
			if(start)
			{
				if(command.equals("-"))
				{
					display.setText(command);
					start = false;
				}
				else
				{
					lastCommand = command;
				}
			}
			else
			{
	                       if(command.equals("√"))
				{
					// Berechnung ausfuehren
					lastCommand = command;
					calculate(Double.parseDouble(display.getText()));
					
				}
				else
				{
					calculate(Double.parseDouble(display.getText()));
					lastCommand = command;
				}
					start = true;
			}
		}
	}	
		/**
		 * Fuehrt die anstehenden Berechnungen aus.
		 * @param x der mit dem vorherigen Ergebnis zu berechende Wert
		 */
		public void calculate(double x)
		{
			if(lastCommand.equals("+"))
				result = result + x;
			else if(lastCommand.equals("-"))
				result = result - x;
			else if(lastCommand.equals("*"))
				result = result * x;
			else if(lastCommand.equals("/"))
				result = result / x;
			else if(lastCommand.equals("√"))
				result = Math.sqrt(x);
				
		//	else if(lastCommand.equals("x2"))
				
			//	result = 
			else if(lastCommand.equals("="))
				result = x;
				display.setText("" + result);
			
		}
Vielen Dank an alle die geholfen haben.

Grüße
Holger
HolgerB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 25.02.2008, 15:12   #8 (permalink)
Stammbenutzer
CD-R 74
 
Benutzerbild von ARadauer
 
Registriert seit: 16.09.2006
Fachbeiträge: 6.762
Abgegebene Danke: 28
Erhielt 529 Danke für 496 Beiträge
squirt - LOL!!!!
__________________
Welches ist das beste Buch für Anfänger? Das: Java von Kopf bis Fuss
Nach den ersten Schritten? Das: Der Weg zum Java-Profi
ARadauer ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 25.02.2008, 15:22   #9 (permalink)
Neuer Benutzer
short
Themenstarter
 
Registriert seit: 20.02.2008
Fachbeiträge: 16
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Ups, heisst natürlich Math.sqrt(x);

Habe es vorigen Post geändert.

Grüße
Holger
HolgerB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Taschenrechner. Java Basics - Anfänger-Themen 18 31.10.2008 22:42
Taschenrechner Spin Java Basics - Anfänger-Themen 4 20.10.2008 18:21
Taschenrechner andi303 Java Basics - Anfänger-Themen 8 25.04.2005 14:30
Code Taschenrechner für Taschenrechner gesucht SkexX Hausaufgaben 2 22.09.2004 10:18
Taschenrechner Fridolin Java Basics - Anfänger-Themen 3 16.06.2004 17:52


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de