himmelph
Goto Top

Java Tschenrechner Punkt vor Strichregel beibringen

Hallo Zusammen,

Ich könnte mal wieder euro Hilfe gebrauchen, diesmal im Bereich Java Programmierung. Und zwar sollen wir für die Schule einen kleinen Taschenrechner in Java programmieren mit dem man zum einen die Grundrechenarten verwenden kann und eventuell später noch Klammern oder änliches verwenden kann. Nun habe Ich bereits 2 Klassen geschrieben in der einen wird die graphische Oberfläche und die verschiedenen Datentypen (Strings, Int, Double, Boolean) des Rechners festgelegt wird und in der anderen werden dann, je nachdem welche Taste gedrückt wird verschiedene Aktionen ausgeführt.
Soweit funktioniert so ziemlich alles, außer, dass der Rechner die Punkt vor Strich Regel beherrscht. Jetzt zu meiner eigenlichen Frage: Wie kann ich am besten dem Rechner beibringen, dass er zuerst * und / rechnet und dann erst + und -.
Hier ein kleiner Ausschnitts des Codes indem die Buttons Plus, Minus, Mal, Geteilt und Gleich aufgerufen werden.

public static void IstgleichListener(ActionEvent e) {
    	       
    	if (boolplus == true) 
    	{

    		if (i == 1){
    			Faktoreins = Double.valueOf(Eins);
    			Zwei = Display.getText();
    			Faktorzwei = Double.valueOf(Zwei);
    			Ergebnis = Faktoreins + Faktorzwei;
    			Eins = String.valueOf(Ergebnis);
    		}
    		Display.setText(Eins);
    		boolplus = false;
    	}
    	
    	
    	if (boolminus == true)
    	{
    		

    		if (i == 1){
    			Faktoreins = Double.valueOf(Eins);
    			Zwei = Display.getText();
    			Faktorzwei = Double.valueOf(Zwei);
    			Ergebnis = Faktoreins - Faktorzwei;
    			Eins = String.valueOf(Ergebnis);
    		}
    		Display.setText(Eins);
    		boolminus = false;
    	}
    	
    	if (booldiv == true)
    	{
    		
    		if (i == 1){
    			Faktoreins = Double.valueOf(Eins);
    			Zwei = Display.getText();
    			Faktorzwei = Double.valueOf(Zwei);
    			Ergebnis = Faktoreins / Faktorzwei;
    			Eins = String.valueOf(Ergebnis);
    		}
    		Display.setText(Eins);
    		booldiv = false;
    	}
    	
    	if (boolmult == true)
    	{
    		
    		if (i == 1){
    			Faktoreins = Double.valueOf(Eins);
    			Zwei = Display.getText();
    			Faktorzwei = Double.valueOf(Zwei);
    			Ergebnis = Faktoreins * Faktorzwei;
    			Eins = String.valueOf(Ergebnis);
    		}
    		Display.setText(Eins);
    		boolmult = false;
    		
    	}
    	
     if (boolquad == true){
    	 Zwei 			= Display.getText();
    	 double i 		= Double.valueOf(Zwei);
    	 Sechs 			= Double.valueOf(Eins);
    	 for(int p = 1; p<i; p++){
    		 Sechs 	= Sechs*Sechs;
    		 }
    		 Vier 	= String.valueOf(Sechs);
    		 Display.setText(Vier);
    	 
     }
    }

	public static void PlusListener(ActionEvent e){


		switch (i){
		
		case 0 :
		
		Eins = Display.getText();
		Display.setText("");  
		i = 1;
		boolplus = true;
		break;
		case 1 :
			Faktoreins = Double.valueOf(Eins);
			Zwei = Display.getText();
			Faktorzwei = Double.valueOf(Zwei);
			Ergebnis = Faktoreins + Faktorzwei;
			Eins = String.valueOf(Ergebnis);
			boolplus = true;
			Display.setText("");  
			break;
	}}

	public static void MinusListener(ActionEvent e){

	
		switch (i){
		
		case 0 :
		
		Eins = Display.getText();
		Display.setText("");  
		i = 1;
		boolminus = true;
		break;
		case 1 :
			Faktoreins = Double.valueOf(Eins);
			Zwei = Display.getText();
			Faktorzwei = Double.valueOf(Zwei);
			Ergebnis = Faktoreins - Faktorzwei;
			Eins = String.valueOf(Ergebnis);
			boolminus = true;
			Display.setText("");  
			break;
			
		}
	}

	public static void MalListener(ActionEvent e){
switch (i){
		
		case 0 :
		
		Eins = Display.getText();
		Display.setText("");  
		i = 1;
		boolmult = true;
		break;
		case 1 :
			Faktoreins = Double.valueOf(Eins);
			Zwei = Display.getText();
			Faktorzwei = Double.valueOf(Zwei);
			Ergebnis = Faktoreins * Faktorzwei;
			Eins = String.valueOf(Ergebnis);
			boolmult = true;
			Display.setText("");  
			break;
	}
	}

	public static void GeteiltListener(ActionEvent e){
switch (i){
		
		case 0 :
		
		Eins = Display.getText();
		Display.setText("");  
		i = 1;
		booldiv = true;
		break;
		case 1 :
			Faktoreins = Double.valueOf(Eins);
			Zwei = Display.getText();
			Faktorzwei = Double.valueOf(Zwei);
			Ergebnis = Faktoreins / Faktorzwei;
			Eins = String.valueOf(Ergebnis);
			booldiv = true;
			Display.setText("");  
			break;
	}  
	}

Ich hoffe, dass ich euch ein bisschen näherbringen konnte was ich vor habe und würde mich über eine Antwort freuen.
Danke schonmal im Vorraus
lG himmelph

Content-Key: 147884

Url: https://administrator.de/contentid/147884

Printed on: April 24, 2024 at 05:04 o'clock

Member: Friemler
Friemler Jul 29, 2010 at 01:57:29 (UTC)
Goto Top
Hallo himmelph,

mit einem Java-Codeschnipsel kann ich nicht dienen, da ich diese Sprache nicht beherrsche. Grundsätzlich löst man so etwas aber mit Stacks. Die kann man mit einfach verketteten Listen oder mit Arrays darstellen.

Dazu müsstest Du Dir erstmal eine Klasse für Stacks schreiben, mit den grundlegenden Operationen push (Element auf den Stack legen) und pop (oberstes Element vom Stack nehmen). Füge auch noch einen Zähler für die Anzahl der Elemente im Stack hinzu. Dann definierst Du ein Array aus solchen Objekten und ein einzelnes Objekt. Auf die Stacks im Array legst Du die Operatoren (Codes für die Rechenzeichen +, -, * und /) ab, auf den einzelnen Stack die Operanden (die Zahlen).

Wenn ein Rechenzeichen eingegeben wird, legst Du die Zahl aus der Anzeige auf den Operanden-Stack. Wenn der Operatoren-Stack leer ist, legst Du den Code für das Rechenzeichen (den kannst Du über einen Aufzählungstypen definieren) auf den Operatoren-Stack. Wenn der Operatoren-Stack nicht leer ist, führst Du folgende Prüfungen durch:

  • Immer wenn ein * oder / eingegeben wird und das oberste Element auf dem Operatoren-Stack ein + oder - ist, rechnest Du nicht.
  • Immer wenn ein + oder - eingegeben wird und das oberste Element auf dem Operatoren-Stack ein * oder / ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.
  • Immer wenn ein * oder / eingegeben wird und das oberste Element auf dem Operatoren-Stack ein * oder / ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.
  • Immer wenn ein + oder - eingegeben wird und das oberste Element auf dem Operatoren-Stack ein + oder - ist, verrechnest Du die beiden oberen Elemente vom Operanden-Stack mit dem obersten Rechenzeichen auf dem Operatoren-Stack.

Das Ergebnis der Berechnung legst Du wieder auf den Operanden-Stack.

Wenn eine öffnende Klammer eingegeben wird, zählst Du den Index für das Operatoren-Stack-Array um eins hoch, bei einer schließenden Klammer führst Du alle noch ausstehenden Rechenoperationen aus und zählst den Index um eins nach unten.

Das ganze lässt sich ziemlich einfach um Funktionen der höheren Mathematik erweitern, z.B. x hoch 2, Wurzel aus x, e hoch x, ln x, 10 hoch x, log x, sin, con, tan (und deren Umkehrfunktionen). Das wären Operatoren mit einem Operanden. Operatoren mit zwei Operanden wären +, - , *, /, x hoch y, x-te Wurzel aus y, Logarithmus von x zur Basis y. Für Operatoren mit zwei Operanden musst Du Dir Codes definieren, die Du auf dem Stack ablegen kannst. Alle diese Operatoren haben die gleiche Priorität wie * und /.

Ist schon länger her, daß ich sowas mal in Delphi (auch eine Übungsaufgabe) geschrieben habe. Es gibt dabei noch ein paar Ausnahmen zu behandeln, aber das siehst Du dann schon.

Zuerst habe ich mir eine Basisklasse für Stacks geschrieben von denen ich die Operatoren- und Operanden-Stacks abgeleitet habe, so war das ganze Datentyp-unabhängig.

Gruß
Friemler
Member: himmelph
himmelph Jul 29, 2010 at 08:06:49 (UTC)
Goto Top
Hallo Friemler

Erst einmal vilen Dank für deine super Antwort.
Stacks haben wir leider bisher noch nicht behandelt, jedoch werde ich versuchen mich in den nächsten Tagen darin einmal einzulesen.
Naja zumindest weiß ich jetzt wie sowas gehen könnte und kann mir ein genaueres Bild davon machn

Danke
Gruß himmelph
Member: TsukiSan
TsukiSan Jul 29, 2010 at 09:39:57 (UTC)
Goto Top
Hallo himmelph,

vielleicht wäre auch diese Seite etwas für dich.
Ist etwas hochgegriffen, aber eventuell kannst du etwas davon in Java umsetzen.
Ich kenne mich mit Java leider auch nicht aus und schließe mich Friemler von daher an.
Diese Stacks funktionieren recht gut.

Gruss
Tsuki
Member: dog
dog Jul 30, 2010 at 01:51:42 (UTC)
Goto Top
Ein Stack ist in einer hohen Sprache ist idR einfach ein Array - die beherrschen von Haus aus push und pop.
Member: himmelph
himmelph Jul 30, 2010 at 20:48:39 (UTC)
Goto Top
Hallo ich bins nochmal,
Erstmal nochmal danke für die ganzen Kommentare...

Ich habe mir überlegt das ganze viel einfacher zu machen. Ich möchte einfach alles was ich vor dem = in einen String schreiben. Diesen möchte ich dann in einen Double geben der mir dann das Ergebnis ausrechnent. Da Java ja schon mit Punkt vor Strich rechnen kann wäre das Problem dann denke ich gelöst. Jedoch triit jetzt ein neues Problem auf:
Wenn ich zum Test eingebe;

	neuerDouble = 1+1+2*3;
	neuerString = String.valueOf(neuerDouble);
	Display.setText(neuerString);

erhalte ich wie gedacht als Ergebnis 8.

Dies bweist, dass Java in Doubles nicht nur Rechnen kann sondern auch die Punkt vor Strich Regel beherrscht.

Nun habe ich mir gedacht, dass ich einfach alles was ich eingebe in einen String schreibe, danach in einen Double gebe und dieser dann alles für mich ausrechnet:

     neuerString = Display.getText();
     neuerDouble = Double.valueOf(neuerString);
     neuerString = String.valueOf(neuerDouble);
     Display.setText(neuerString);

Jedoch erhalte ich wenn ich den obenstehenden Code ausführen lasse eine Fehlermeldung

Kann mir vielleicht jemand helfen, was mein Fehler ist oder mir eventuell sagen wie ich es besser machen könnte.

Gruß
himmelph
Member: Friemler
Friemler Jul 30, 2010 at 21:27:29 (UTC)
Goto Top
Hallo himmelph,

Du verwechselst da was. Wenn Du schreibst

neuerDouble = 1+1+2*3;

rechnet Java den Ausdruck rechts vom Gleichheitszeichen aus und weist das Ergebnis der Variablen neuerDouble zu. Die kannst Du natürlich in einen String wandeln und wird dann auch korrekt angezeigt. Wenn Du aber einen String "1+1+2*3" in einen Double wandeln willst, findet Java die Pluszeichen und die Konvertierungsmethode Double.valueOf bricht mit einem Fehler ab. Die Konvertierungsmethode rechnet nämlich NICHT. Du musst Dir schon etwas mehr Arbeit machen.

Wie User dog schon sagte, hat Java wahrscheinlich Stacks schon eingebaut (Delphi übrigens auch, eine eigene Klasse zu schreiben war für mich nur eine zusätzliche Herausforderung, war mein erstes OOP-Programm). Du musst nur lernen, sie zu benutzen.

Wenn Dir der Lösungsweg, den ich beschrieben habe, zu kompliziert ist (Du scheinst Anfänger zu sein), bemühe mal Tante Google. Taschenrechner sind beliebte Übungsprojekte, da findest Du jede Menge Anregungen, aber wahrscheinlich meistens nicht in Java. Mit ein bisschen Überlegung kannst Du aber auch Code aus Delphi oder Visual Basic in Java übertragen. Meistens sind diese Lösungen auch einfacher gehalten als mein Vorschlag, haben dann aber gewisse Nachteile, die vielleicht aber auch für Dich nicht so wichtig sind. Ich habe mir damals bei meiner Übung auch Anregungen aus dem Netz geholt. Aber nur selbst denken macht schlau, Dein Lehrer hat sich ja was dabei gedacht, als er die Aufgabe stellte. face-wink

Gruß
Friemler