[Java] Eigener Rechner für Schulprojekt

dmncstmpfl

Lt. Commander
Registriert
Dez. 2003
Beiträge
1.348
Hi Zusammen

Eins vorweg: NEIN, ich werde euch nicht bitten mir einen Rechner in Java zu programmieren damit ich den dann als mein Schulprojekt abgeben kann, wär ja noch schöner :P

So nach dem das nun gesagt ist komme ich zum eigentlichen Sinn und Zweck dieses Threads: Wir müssen als Java-Abschlussprojekt eine beliebige Java-Applikation schreiben. Sie muss nur ein paar Methoden und Klassen enthalten. Einfach alles ein wenig anwenden was wir gelernt haben.

Ich hab mich dann entschlossen einen, vorerst simplen, Rechner zu machen. Addition, Subtrakion, Mulitplikation und Division von positiven Zahlen.

Nun dieser Thread soll mir dazu dienen, die Fragen die beim Programmieren auftauchen alle hier zu stellen :D

Genug erklärt, hier meine Frage:
Ich hab ein In- Output-Feld wo der User beliebige Positive Zahlen angeben kann. Auch mit Komma. Diese muss dann natürlich als Double ausgelesen werden. Ich weiss aber nur wie man eine Int rausliest :D
Code:
Integer tempInt = new Integer(eingabe.getText());
x = tempInt.intValue();
Irgendwie sowas in der art.

Nur ist jetzt das problem, das es mir so natürlich die Kommazahl abschneidet.
Wie krieg ich die ganze Kommazahl aus dem Eingabe feld?

/edit
böff... grad herausgefunden :(
Code:
zahl = Double.valueOf(input.getText()).doubleValue();

nächste Frage kommt bestimmt :D
 
Zuletzt bearbeitet:
sodela... es ist wiedermal soweit, ich steh an:

immer noch das gleiche Projekt, aber anderer Fehler. Folgend mal der ganze Code:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class calculator extends JFrame implements ActionListener{
	private JTextField TextField;
	private String input, operator, tmpString1, tmpString2;
	
	public calculator() {
		super("Calculator");
		Container c = getContentPane();
		MyMenuBar menubar = new MyMenuBar();
		setJMenuBar(menubar);
		panel p = new panel();
		c.add(p);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(300, 400);
		setVisible(true);
		
		input = "";
	}
	
	class panel extends JPanel {
		
		public panel() {
			JPanel TextFieldBox = new JPanel();
			TextFieldBox.setLayout(new FlowLayout(FlowLayout.LEFT));
			TextField = new JTextField(20);
			TextField.setHorizontalAlignment(JTextField.RIGHT);
			TextFieldBox.add(TextField);
			add(TextFieldBox, BorderLayout.NORTH);
			
			JPanel numBlock = new JPanel();
			numBlock.setLayout(new GridLayout(4, 4, 10, 10));
			addButton(numBlock, "7");
			addButton(numBlock, "8");
			addButton(numBlock, "9");
			addButton(numBlock, "/");
			addButton(numBlock, "4");
			addButton(numBlock, "5");
			addButton(numBlock, "6");
			addButton(numBlock, "*");
			addButton(numBlock, "1");
			addButton(numBlock, "2");
			addButton(numBlock, "3");
			addButton(numBlock, "-");
			addButton(numBlock, "0");
			addButton(numBlock, ".");
			addButton(numBlock, "C");
			addButton(numBlock, "+");
			add(numBlock, BorderLayout.CENTER);
		}
		
		private void addButton(JPanel p, String s) {
			JButton b = new JButton(s);
			b.addActionListener(calculator.this);
			p.add(b);
		}
		
		
	}

	class MyMenuBar extends JMenuBar {
		JMenu menu;
		
		public MyMenuBar() {
			// Menü Actions
			menu = new JMenu("Actions");
			addItem("Cut", "cut", KeyEvent.VK_X);
			addItem("Copy", "copy", KeyEvent.VK_C);
			addItem("Paste", "paste", KeyEvent.VK_V);
			addItem("Delete", "delete", -1);
			menu.addSeparator();
			addItem("Exit", "exit", -1);
			add(menu);
		}
		
		private void addItem(String label, String cmd, int code) {
			JMenuItem mi = new JMenuItem(label);
			mi.setActionCommand(cmd);
			if (code != -1)
			    mi.setAccelerator(KeyStroke.getKeyStroke(code, InputEvent.CTRL_MASK));
			mi.addActionListener(calculator.this);
		    menu.add(mi);		    
		}
	}
	
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		String cmd = e.getActionCommand();
		input = TextField.getText();
		double zahl1, zahl2;
		
		if (cmd.compareTo("0") >= 0 && cmd.compareTo("9") <= 0) {
			input += cmd;
			TextField.setText(input);
		} else if (cmd.equals(".")) {
			if (input.indexOf(".") == -1) {
				input += ".";
				TextField.setText(input);
			}
		} else if (cmd.equals("C")) {
			input = "";
			TextField.setText(input);
		} else if (obj instanceof JMenuItem) {
			if (cmd.equals("exit"))
				System.exit(0);
		} else if (cmd.equals("+")) {
			tmpString1 = TextField.getText();
			operator = "+";
		} else if (cmd.equals("-")) {
			tmpString1 = TextField.getText();
			operator = "-";
		} else if (cmd.equals("*")) {
			tmpString1 = TextField.getText();
			operator = "*";
		} else if (cmd.equals("/")) {
			tmpString1 = TextField.getText();
			operator = "/";
		} else if (cmd.equals("=")) {
			boolean ok = true;
			tmpString2 = TextField.getText();
			
			tmpString1 = tmpString1.replace(',', '.');
			tmpString2 = tmpString2.replace(',', '.');
			
			try {
				zahl1 = Double.valueOf(tmpString1).doubleValue();
				zahl2 = Double.valueOf(tmpString2).doubleValue();
			} catch (NumberFormatException ex) {
				ok = false;
			}
			
			if (ok & (operator == "+")) { 
				addition(zahl1, zahl2);
			} else if (ok & (operator == "-")) {
				subtraktion(zahl1, zahl2);
			} else if (ok & (operator == "*")) {
				multiplikation(zahl1, zahl2);
			} else if (ok & (operator == "/")) {
				division(zahl1, zahl2);
			} else {
				TextField.setText("0");
			}
		}
	}
	
	private void addition(double summand1, double summand2) {
		
	}
	
	private void subtraktion(double minuend, double subtrahend) {
		
	}
	
	private void multiplikation(double faktor1, double faktor2) {
		
	}
	
	private void division(double dividend, double divisor) {
		
	}
	
	public static void main(String[] args) {
		new calculator();
	}
}

Der Fehler, wie ihr sicher selber seht wenn ihr den code schnell in einen Java-Editor stellt, ist bei den aufrufen der verschiedenen Rechenmethoden. Also zB "addition(zahl1, zahl2);"

dort werden jetzt zahl1 und zahl2 unterstrichen. Keine ahnung wieso. Ich verwende Eclipse wo es mir ja eine kleine Fehlerbeschreibung anziegt

dort heissts, das die variable zahl1 bzw zahl2 noch nicht initalisiert worden ist. Aber das ist es ja gleich am anfang der Methode. Und vorher scheint es die Variable noch zu kennen :(

Vielen Dank für eure Hilfe
 
hmm, keine Java-Programmierer hier? ^^

*push*
 
Moin!

Du hast die Variablen DEFINIERT aber nicht INITIALSIERT (=eine Wert zugewiesen).
Also fehlt noch ein 'zahl1=0' (oder so ähnlich)

Tschau
Kip
 
jap, genau das wars ;D

vielen Dank!
 
na wie weit biste gekommen?

Deinen Code solltest vllt ein wenig nach den MFC Convetions anpassen,
so Spagetti Code ist nicht so toll.

besser etwas die Stärken moderner Sprachen herausstellen
und das ganze zukunftsorientiert/wartbar machen.

Beim progen solltest dir angewöhnen einen ordentlichen Headder zu schreiben,
der die Revision, Probleme Lösungen und ToDos angibt.

Wenn du deinen Code dann noch sauber javadoc konform erstellst gewinnst garantiert Punkte bei deinem Projekt.

Mal im Ernst, es zählt wohl wirklich nicht das Endergebniss sondern ausschliesslich der Weg.

;)
 
hab jetzt mein rechner soweit fertig. Als besonderes "schmankerl" bau ich noch n binär zu dezimal und wieder zurück Umrechner ein...

Klar die Komments brauch ich eh noch. Ein Bewertungspunkt ist schliesslich die Doku, welche mit javadoc erstellt werden muss.

Über den Code-Standard mach ich mir nicht grosse Gedanken. Wir hatten noch nicht sehr viel Java und müssen jetzt schnell aus den spärlichen Infos ein Projekt zusammencoden... denke nicht das er gross nach Standards schaut.

Aber trotzdem danke für den Hinweis.
 
fingol schrieb:
hab jetzt mein rechner soweit fertig.

sofern dein rechner von dir als freeware eingestuft wird, könntest du ja source-code und fertig kompiliertes programm der community hier zu lehrzwecken zur verfügung stellen

fände ich, wäre eine spitzenaktion von dir :D
 
natürlich stell ich den Rechner der Community zur verfügung. Ihr könnt euch den Source-Code von meinem Webspace holen [1], und damit machen was ihr wollt. Werde jetzt noch an der noch fehlenden Binär-zu-Dezimal-Funktion arbeiten. Werds dann melden wenns geschafft ist.

Aber bitte keine Lösung spoilern. Will das alleine schaffen ^^

Ah ja: Lehrer war soweit zufrieden, Note krieg ich dann in ner Woche.


[1] http://www.fingol.net/data/app/Calculator.java
 
Zuletzt bearbeitet:
Klassen und Variablen in Java immer gross am Anfang. :)

Calculator und Panel, statt calculator und panel.
textField statt TextField


Umlaute sind in Variablen-, Methoden- und Klassennamen nicht erlaubt.

binaer() statt binär()


Bei Umrechnen von Bin in Dez hast du noch irgendwo einen Fehler drin.
1001 wird korrekt in den Binärwert umgewandelt, allerdings, wird dieser Wert zu 512(dez) umgerechnet.



Ein Projekt gehört kommentiert, und wenn's nur für den Lehrer ist. :)
 
Zuletzt bearbeitet:
@Ste_Ett und CharlyB
Das ist ein Glaubenskrieg.

Im letzten halben Jahr habe ich meine Diplomarbeit bei einer Firma gemacht, die Software für Steuergeräte im Automobilbereich entwickelt.
Dort gibt es Programmierrichtlinien, die oftmals recht komisch anmuten. Diese Richtlinien werden von einer Automobilindustrie-Vereinigung herausgegeben.

Eine Richtlinie schreibt vor, dass auch Variablen mit einem Großbuchstaben beginnen müssen. Wenn nicht, erfüllt die Software nicht die Bestimmungen und kann nicht verwendet werden.

Es ist schwer sich daran zu gewöhnen, dass es oftmals verschiedene Ansichten hinsichtlich "Codestyle" gibt.
 
Ste_Ett schrieb:
Klassen und Variablen in Java immer gross am Anfang. :)

Calculator und Panel, statt calculator und panel.
textField statt TextField
das wär mir jetzt neu das variablen immer gross geschrieben werden müssen. das ist doch egal wie ich die nenne oder? könnte die ja auch Furz nennen oder so :D


Ste_Ett schrieb:
Umlaute sind in Variablen-, Methoden- und Klassennamen nicht erlaubt.

binaer() statt binär()
oke das stimmt. macht jetzt in diesem fall zwar keine probleme, aber das muss schon sein. Wird geändert.

Ste_Ett schrieb:
Bei Umrechnen von Bin in Dez hast du noch irgendwo einen Fehler drin.
1001 wird korrekt in den Binärwert umgewandelt, allerdings, wird dieser Wert zu 512(dez) umgerechnet.
wie oben schon gesagt, die bin in dez funktion geht noch nicht. keine einzige bin zahl sollte eigentlich richtig umgewandelt werden. 1001 ist vllt zufall :D

Ste_Ett schrieb:
Ein Projekt gehört kommentiert, und wenn's nur für den Lehrer ist. :)
jo sollte man schon. hat mich dann aber irgendwie angeschissen. ;)

allerdings hats den lehrer nicht gestört weil er eh zu jedem kam und sich den source erklären lies (wollte wohl testen ob wir den code einfach irgendwo runtergeladen haben)
 
hmm hat einer ne bessere Möglichkeit die einzelnen Stellen der eingegebenen Zahl auszulesen und in eine Array zu schreiben?

Bsp: Zahl = 345
stelle[0] = 5
stelle[1] = 4
stelle[2] = 3

Ich brauche das beim Bin zu Dez Umrechner. Ich muss ja für jede Stelle in der Binärzahl prüfen können ob es sich um eine 0 oder eine 1 handelt.
Meine erste idee war die, indem ich die zahl geteilt durch 100 Rechne:
345 / 100 = 3.45
Da es als Integer deklariert ist, würde es mir die Kommazahlen abschneiden und ich bekäme nur die erste zahl.

Funktionieren tut es, aber nur für die erste. Die zweite und die dritte Ziffer bring ich so nicht raus :(

Update
Dokumentierte Version (versuchte ein Ordentliches Javadoc zu erstellen :D) und ein wenig überarbeitete Version steht bereit auf dem Webserver [1]
--> Bin nach Dez funktioniert immer noch nicht.

[1] http://www.fingol.net/data/app/Calculator.java
 
Zuletzt bearbeitet:
Dezimal->Binär Umrechnung ist ganz einfach.

Du hast ja eine int Zahl im Rechner liegen.
Jetzt gehst du einfach mit einer Schleife vom höchstwertigen Bit zum niederwertigsten Bit und gibst dabei den Wert des Bits aus.

Ungetestet:
Code:
int dieTolleZahl = 1236234; // oder irgend was anderes
cout << "Dies ist die Binärdarstellung: " << endl;
int i = 31;
while(i>0)
{
    cout << (dieTolleZahl & (1<<i));
    i--;
}
Die Schleife geht also vom linkesten der 32 Bit, das Bit mit Nr. 31, zum rechtesten Bit, Nr. 0, durch.

In jedem Schleifendurchlauf wird eine Integer "1" um die Anzahl der Schleifendurchläufe nach links verschoben (<<).
Gleichzeitig wird die tolle Zahl binär mit der nach links verschobenen 1 "verundet" (binärer Operator AND; der Operator &).
Dabei wird genau der Wert des entsprechenden Bits geliefert: 0 oder 1.

Diesen Wert jetzt ausgeben (cout ist aus C++). Du schriebst halt System.println(..) oder wie das bei Java aussieht.

Et voilà :).

Binär -> Dezimal ist nicht schwerer.

Du hast ja einen String vorliegen. Bsp. 101011
Jetzt musst du nur wissen wie lange er ist: derString.length.
Du weißt wie Binärzahlen aufgebaut sind (von rechts beginnend 2^0, 2^1, 2^2 usw.)
Jetzt gehst di mit einer Schleife durch derString und überall wo eine 1 steht addierst du auf das Ergebnis 2^(Stelle der 1 im String).

Für die Zahl oben 101011:
Wir beginnen bei rechts und gehen nach links.
2^0 =1
+ 2^1 = 3
+ 2^3 = 11
+ 2^5 = 43
Ganz einfach.
 
Boron schrieb:
@Ste_Ett und CharlyB
Das ist ein Glaubenskrieg.

Im letzten halben Jahr habe ich meine Diplomarbeit bei einer Firma gemacht, die Software für Steuergeräte im Automobilbereich entwickelt.
Dort gibt es Programmierrichtlinien, die oftmals recht komisch anmuten. Diese Richtlinien werden von einer Automobilindustrie-Vereinigung herausgegeben.

Eine Richtlinie schreibt vor, dass auch Variablen mit einem Großbuchstaben beginnen müssen. Wenn nicht, erfüllt die Software nicht die Bestimmungen und kann nicht verwendet werden.

Es ist schwer sich daran zu gewöhnen, dass es oftmals verschiedene Ansichten hinsichtlich "Codestyle" gibt.


joar an meine DiplArbeit erinner ich mich gern zurück ;)
willst uns aber nicht nun auch noch erzählen das die Steuergeräte mit java gecodet worden sind :evillol:

hast TI studiert?

ja okay also natürlich siehts in Prolog anders aus als in Ada C oder sonst ner Sprache, aber es gibt niergends eine Rule dass Variablen Grossgeschreben werden in Java.

Wers besser weiss... bitte einne Link ;)
 
@Boron
die Funktion dez > bin ist schon lange eingebaut und funktionstüchtig.

Und wie man binäre zahlen in dezimale umwandelt ist mir auch klar ;D

was ich nicht weis ist, wie ich die einzelnen Stellen einer Zahl in eine Array schreibe, so wie ich es oben beschrieben habe. Also mit welchem befehl.
 
Hm, das mit den "Variablen gross" gehört da oben eigentlich nicht rein, ist wohl beim Kopieren stehen geblieben, natürlich schreibt man in Java Variablennamen klein.
 
niemand eine Idee wie man die einzelnen Stellen einer Zahl rausbekommt?

/update
Hurra, mit charAt :D

leider geht das nur mit datentyp char.

aber es gibt sicherlich eine Möglichkeit wie man char in string/double/int etc umwandeln kann oder?


/update2
Hurra^2, jetzt läuft auch die dez-funktion :D --> [1]

Doch noch hab ich von java nicht genug... und es hat noch Platz für einen weiteren Button unten Links: Als nächstes kommt die Dez-nach-Hex-Funktion ;)

[1] http://www.fingol.net/data/app/Calculator.java
 
Zuletzt bearbeitet:
Lies dir zu allen benutzten Funktionen aber unbedingt die Beschreibung in der API-Doku.
Code:
String text = new String( "Doof");
char x;
x = text.charAt(2); // x hat jetzt den Wert 'o'

int i = Charakter.getNumericValue( x );  // Returns the int value that the specified Unicode character represents.

String s = Character.toString( x ); // Returns a String object representing the specified char.

double d = (double)Charakter.getNumericValue( x ); // nur noch ein Cast auf double
 
Zurück
Oben