Taschenrechner Punkt vor Strich

J

JavaLehrling

Gast
Hallo,

es geht um folgendes. Ich habe einen Taschenrechner implementiert . Beim Aufruf des Taschenrechners übergebe ich die Werte (z.b 5 * 5 + 10)...Leider kennt mein Taschenrechner die Vorrangregeln nocht nicht (Punkt vor Strich) außerdem komme ich nicht mehr aus der Schleife raus, sobald ich einmal drinnen bin. Kann mir jemand mit den beiden Problemen weiterhelfen?

Java:
import java.util.Scanner;
import java.util.Stack;

public class Calculator {
	
	public static void main(String[] args){
		
		Scanner scan = new Scanner(System.in);
		Scanner scan2 = new Scanner(System.in);
		
		int sum = 0;
		int i = scan.nextInt();
		
				
		while (scan.hasNext() == true) {
			String op = scan.next();
			int j = scan.nextInt();
			
			if (op.equals("*")){
				if (sum == 0)
					sum = i*j;
				else sum = sum*j;
			}
			
			else if (op.equals("/")){
				if(sum == 0)
					sum = i/j;
				else sum = sum/j;
			}
			
			else if (op.equals("+")){
				if (sum == 0)
					sum = i + j;
				else sum = sum +j;
			}
			
			else if (op.equals("-")){
				if(sum == 0)
					sum = i-j;
				else sum = sum -j;
			}
		
		System.out.println(sum);
		
		}
			
	}
}
 
S

SlaterB

Gast
das zum Abbruch habe ich doch schon geschrieben, nicht einfach so nochmal fragen
http://www.java-forum.org/java-basics-anfaenger-themen/134681-calculator-java.html

wenn du beim Eintippen von 5 - 4 schon 1 errechnest und 5 und 4 wegwirfst,
dann kann natürlich bei insgesamt 5 - 4 * 3 später nicht mehr 4 * 3 gerechnet werden, denn die 4 ist schon weg

das zu lösen ist kein 2 Min.-Posting im Forum sondern ein stundenlanger Umbau bzw. Bau eines richtigen Programms statt bisheriger Fingerübung,
macht deinen Calculator zigmal komplizierter als bisher,
sehr fraglich ob du das selber hinbekommen kannst,
im Internet gibt es fertige Programme, aber ob du die dann verstehst?
 
J

JavaLehrling

Gast
Achso, dachte ich kann das vielleicht mit nem if-Befehl lösen, dass die "/" und "*" zuerst gelöst werden :D... also wird das mal nichts. Ok dann belass ichs vorerst bei dem Programm... Danke für die Hilfe
 

Marc T.

Bekanntes Mitglied
Ne "if-Befehle" reichen da nicht. Brauchst da schon bisschen mehr.
Ein für dich einfacherer Ansatz könnte der folgende sein (einfach
so mal aus der Luft gegriffen):

- Du speicherst deinen Term in einem String.
- Den String durchläufst du und prüfst die Rechenzeichen
- Solange "/" oder "*" darin vorkommt
- Suche Zahl da vor und da hinter
- Berechne "Zahl Rechenzeichen Zahl"
- .....
 

Kevin94

Top Contributor
Ich hab auch so einen Taschenrechner geschrieben. Die Methode zum parsen eines Strings ist im Moment 160 Zeilen lang, war aber zwischenzeitlich auch mal länger. Die Hauptmethode arbeitet bei mir Rekursiv und der ganze Parsing-Algorithmus beruht auf der Idee von irgendeinem Post hier zu einem ähnlichen Thema (muss schon ein Jahr her sein). Meine Methode arbeitet mit einer schon fertig gesplitteten Liste und ersetzt die schon geparsten Teile in dieser dann durch Objekte. Daneben hab ich noch ein ganzes Set von Klassen, die die Einzelnen Rechenoperationen wiedergeben, das liegt allerdings daran, dass diese Klassen mehr können als nur den Wert eines geparsten Terms auszurechnen, sondern ihn auch bildlich darstellen und kürzen. Auserdem enthält mein Programm auch Variablen, sodass ein einmal geparster Term wie eine Funktion benutzt werden kann und mit einmal parsen beliebig lange Wertereihe liefert. Das ganze lässt sich natürlich unendlich weiterprogrammieren, geplant ist Mal ohne Zeichen, z.B. 2x oder 2pi, und das aussrechnen von Nullstellen und Ableitungen, aber wenn ich noch viel mehr ergänze kann ich auch gleich bei GeoGebra mitmachen.

Mein Algorithmus mal in Kürze:
1. Den übergebenen String in einzele Tokens splitten
2. Die Liste zu einem Termobjekt parsen:
a) Wenn die Liste nur noch ein Objekt enthält, dieses parsen und zurückgeben, dies muss entweder eine Zahl/Variable sein, oder ein schon geparstes Termobjekt
b) Klammern durch geparste Termobjekte ersetzen, nach jeder Ersetzung wird wieder bei 2. Angefangen
c) Vorzeichen(+-!~) durch Termobjekte ersetzen -> 2.
d) Jetzt werden die normalen Rechenzeichen geparst, angefangen mit denen der niedrigsten Priorität. (Bei mir läuft das in einer Schleife, aber das macht bei zwei Prioritäten noch keine Sinn, deswegen war die Methode zu Anfang länger) Die Liste wird dabei von hinten(!) nach vorne durchsucht (sonst würde z.B. 5-1-1= 5-(1-1) geparst werden und damit 5) und und wenn ein passendes Rechenzeichen gefunden wird, wird die Liste an diesem Punkt in zwei Teile gesplittet und diese geparst und dann das geparste Ergebnis zurückgegeben.

Ich hoffe das ist verständlich.
 
J

JavaLehrling

Gast
OK, jetzt sollte es so ziemlich passen ... Sobald ich es nun teste stimmt das meiste. z.b 3 + 3 * 3 = 12. oder 5 + 5 / 5 = 6.
Aber manches funktioniert noch nicht z.b: 8 - 2 * 3.

Seht ihr den Fehler??

Danke bereits im Vorhinen

Code:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.Stack;
import java.io.*;

public class RechnerErweitert {
	
	public static void main(String[] args) throws IOException{	
		InputStreamReader inStream = new InputStreamReader(System.in);
		BufferedReader stdin = new BufferedReader(inStream);
		
		String eing = null;
		int sum = 0;
		
		System.out.println("Eingabe");
		eing = stdin.readLine();
		int length = eing.length();
		
		char[] array = new char[10];
		array = eing.toCharArray();
			
		Scanner scan = new Scanner(eing);
		int i = scan.nextInt();
		
		
		for(int l=0;l<length;l=l+5){
			
			String op = scan.next();
			int j = scan.nextInt();
			
			if (op.equals("*")){
				if (sum == 0)
					sum = i*j;
				else sum = sum*j;
			}
			
			else if (op.equals("/")){
				if(sum == 0)
					sum = i/j;
				else sum = sum/j;
			}			
		}
//-------------------------------------------------------------------------
		Scanner scan2 = new Scanner(eing);
		int a = scan2.nextInt();
		
		for(int l=0;l<length;l=l+5){
			
			String op = scan2.next();
			int b = scan2.nextInt();
			
			if (op.equals("+")){
				if (sum == 0)
					sum = a + b;
				else sum = sum + b;
			}
			
			else if (op.equals("-")){
				if(sum == 0)
					sum = a - b;
				else sum = sum - b;
			}		
		}
		
		System.out.println(sum);
			
	}
}
 
S

SlaterB

Gast
dein Programm besteht aus einer Codezeile nach der anderne, das kann man doch alles prüfen,
wenn nicht im Kopf, dann mit System.out.println(), verfolge was jeder Schleifendurchlauf macht, welche Variablen wann was macht usw..

mit gleichen Zahlen funktioniert manches, aber nur zufällig,
besser sieht man es an verschiedenen Zahlen wie eben
8 - 2 * 3

i ist 8,
erste Schleife kommt dran,
bei - 2 passiert gar nix,
aber dann * 3, i ist immer noch 8, 8*3 wird zu 24 gerechnet
und so geht es immer weiter, schauen und verstehen was das Programm macht

an eine Lösung will ich noch nicht direkt denken, bin immer noch skeptisch dass das mit einfachen Schleifen und ifs machbar ist,
ok, letzlich bestehen alle Programme aus diesen Mitteln, aber geht auch etwas aufwendiger
 

Charbonnier

Neues Mitglied
Ich habe das Parsen einer Formel bzw. eines Rechenausdrucks immer für eine relativ komplizierte Sache gehalten bis ich auf folgendes gestossen bin:

Die Umgekehrte Polnische Notation

Gelegentlich wird sie auch als Postfix-Notation bezeichnet. Der Operator (Rechenzeichen)
steht nach den Operanden (Post = danach).

Also 5 + 4 wird dann zu 5 4 +

Unsere gebräuchliche Notation ist eine Infix-Notation (der Operator steht zwischen den Zahlen)

Ein UPN-Ausdruck wird immer von links nach rechts gelesen. Das erste Rechenzeichen wird genommen und mit den beiden Zahlen davor das Ergebnis berechnet. Die beiden Zahlen und das Rechenzeichen
werden durch das Ergebnis ersetzt:

5 4 * 3 + würde wie folgt berechnet:

Start
5 4 * 3 +​
1.Schritt
20 3 +​
2.Schritt
23​

Im Wikipedia-Artikel findest Du weiteres. Dort wird auch auf einen Artikel in englischer Sprache verwiesen, der erklärt, wie aus einer Infix-Notation (unsere Schreibweise) eine Postfixnotation macht.

Ich würde das Problem in 2 Schritten lösen:

  1. 1 Umformen des Ausdrucks in die Umgekehrte Polnische Notation (UPN)
  2. 2 Auswerten des Ausdrucks in UPN

Beides ist in dem englischsprachigen Artikel beschrieben. Das muss man sich erst durcharbeiten.
Aber es lohnt sich.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Erste Schritte Taschenrechner - Punkt-vor-Strich Rechnung Java Basics - Anfänger-Themen 1
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
S while Schleife Taschenrechner Java Basics - Anfänger-Themen 1
J Taschenrechner mit mehr als 2 Zahlen. Java Basics - Anfänger-Themen 18
R Einfacher Taschenrechner mit Eclipse Java Basics - Anfänger-Themen 3
M Einfacher Taschenrechner Java Basics - Anfänger-Themen 2
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
Y Taschenrechner programmieren Java Basics - Anfänger-Themen 3
G Taschenrechner ergibt Fehler in if-Abfrage Java Basics - Anfänger-Themen 6
K Erste Schritte "Taschenrechner" zeigt keine Komma Zahlen an. Java Basics - Anfänger-Themen 8
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
E JavaFX Taschenrechner Eingabe im Textfield beschränken Java Basics - Anfänger-Themen 2
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
C Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln Java Basics - Anfänger-Themen 115
W Taschenrechner mit Switch case Java Basics - Anfänger-Themen 4
W Taschenrechner Java Basics - Anfänger-Themen 11
A Taschenrechner mit Gui erstellen Java Basics - Anfänger-Themen 9
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
P Taschenrechner mit unendlich vielen Eingabemöglichkeiten Java Basics - Anfänger-Themen 1
V Erste Schritte Taschenrechner mit beliebig vielen Zahlen Java Basics - Anfänger-Themen 5
S Taschenrechner Java Basics - Anfänger-Themen 13
P Taschenrechner Text übertragung Java Basics - Anfänger-Themen 3
S Compiler-Fehler Basic- Taschenrechner/ Fehler Java Basics - Anfänger-Themen 8
S Basic- Taschenrechner? Java Basics - Anfänger-Themen 7
P Hilfe bei Java Taschenrechner Java Basics - Anfänger-Themen 25
F Erste Schritte Frage zu simplem Taschenrechner(switch) Java Basics - Anfänger-Themen 16
L Mein Taschenrechner lässt sich plötzlich nicht mehr öffnen Java Basics - Anfänger-Themen 5
S Taschenrechner hilfe! Java Basics - Anfänger-Themen 17
H Java Taschenrechner Java Basics - Anfänger-Themen 4
R Variablen Taschenrechner mit Komfortfunktionen Java Basics - Anfänger-Themen 2
J RPN Taschenrechner - keine Lösung!! Java Basics - Anfänger-Themen 84
M Java Taschenrechner (if-else) Java Basics - Anfänger-Themen 11
L Taschenrechner mit switch und while funktioniert noch nicht richtig Java Basics - Anfänger-Themen 22
Q simpler Taschenrechner Java Basics - Anfänger-Themen 34
R Taschenrechner NullPointerException Java Basics - Anfänger-Themen 1
R Variablen Weitergehenderr Taschenrechner Java Basics - Anfänger-Themen 4
F Taschenrechner "Error loading class..." Java Basics - Anfänger-Themen 5
M Java Taschenrechner Programmieren Java Basics - Anfänger-Themen 12
P Erste Schritte Taschenrechner mit if-else Anweisung Java Basics - Anfänger-Themen 6
G Taschenrechner gibt nur 0.0 aus Java Basics - Anfänger-Themen 8
A Taschenrechner programmieren Java Basics - Anfänger-Themen 21
Z Java Taschenrechner Java Basics - Anfänger-Themen 6
J Kleiner Taschenrechner! Anfänger braucht Hilfe :( Java Basics - Anfänger-Themen 2
C Taschenrechner in Java Java Basics - Anfänger-Themen 6
J Erste Schritte Java CMD Taschenrechner mit Parametern! Java Basics - Anfänger-Themen 16
J Taschenrechner: Probleme Java Basics - Anfänger-Themen 5
E Taschenrechner problem! Ich komme nicht voran Java Basics - Anfänger-Themen 18
R Erste Schritte Taschenrechner mit Schleife Java Basics - Anfänger-Themen 24
Lord.Djerun (Taschenrechner Netbeans) Komma nur einmal schreiben & 0 ersetzen Java Basics - Anfänger-Themen 1
Z Taschenrechner - Additions/Substraktions/Multiplikations/Divionsketten! Java Basics - Anfänger-Themen 4
D Taschenrechner Frage Java Basics - Anfänger-Themen 12
Z Sehr simpler Taschenrechner - Hilfe! Java Basics - Anfänger-Themen 10
Z Taschenrechner - Wie addiere,multipliziere und subtrahiere ich? Java Basics - Anfänger-Themen 6
D kleiner Taschenrechner mit switch fehlerhaft Java Basics - Anfänger-Themen 1
K Taschenrechner im GUI Java Basics - Anfänger-Themen 2
P Taschenrechner, operatoren Java Basics - Anfänger-Themen 4
D Simpler Taschenrechner Java Basics - Anfänger-Themen 6
A Anfänger Taschenrechner Frage Java Basics - Anfänger-Themen 14
S Operatoren Taschenrechner Ergebnis ausgeben Java Basics - Anfänger-Themen 7
A Taschenrechner zeigt Error Java Basics - Anfänger-Themen 7
J Taschenrechner Funktion Java Basics - Anfänger-Themen 18
M Taschenrechner fertigstellung Java Basics - Anfänger-Themen 1
N Methoden Taschenrechner Java Basics - Anfänger-Themen 2
F z = input.nextChar(); PROBLEM Taschenrechner Java Basics - Anfänger-Themen 7
J Scanner Taschenrechner? Java Basics - Anfänger-Themen 7
J Variablen Rechenzeichen und Zahlen verknüpfen für einen Taschenrechner Java Basics - Anfänger-Themen 17
B Klassen Java Taschenrechner mit Klassen und Methoden Java Basics - Anfänger-Themen 12
B Erste Schritte Brauche Hilfe bei einem Java-Taschenrechner Java Basics - Anfänger-Themen 11
R Methoden Taschenrechner Java Basics - Anfänger-Themen 4
P Taschenrechner , IF-Abfrage Java Basics - Anfänger-Themen 12
I Taschenrechner - Methoden implementieren Java Basics - Anfänger-Themen 5
I Java Starthilfe (Taschenrechner) Java Basics - Anfänger-Themen 7
J Taschenrechner Problemchen Java Basics - Anfänger-Themen 3
D Erste Schritte Taschenrechner Java Basics - Anfänger-Themen 11
K taschenrechner - Fehler beim Kürzen eines Bruches finden Java Basics - Anfänger-Themen 20
A Taschenrechner programmieren Java Basics - Anfänger-Themen 5
M Ausklappbares Fenster bei grafischem Taschenrechner Java Basics - Anfänger-Themen 2
M Dividieren bei Grafischem Taschenrechner klappt nicht Java Basics - Anfänger-Themen 2
N Taschenrechner mit Unterprogra Java Basics - Anfänger-Themen 6
C Taschenrechner Java Basics - Anfänger-Themen 12
Z Taschenrechner programmieren Java Basics - Anfänger-Themen 5
E Erste Schritte Taschenrechner Java Basics - Anfänger-Themen 8
K Taschenrechner Java Basics - Anfänger-Themen 25
J Textfeld für Taschenrechner Java Basics - Anfänger-Themen 3
D Taschenrechner Java Basics - Anfänger-Themen 28
A Taschenrechner-GUI mit BorderLayout? Java Basics - Anfänger-Themen 6
W [PROJEKT] Simpler grafischer Taschenrechner Java Basics - Anfänger-Themen 8
M Taschenrechner mit JApplet Java Basics - Anfänger-Themen 26
J Grafischen Taschenrechner programmieren - Frage dazu Java Basics - Anfänger-Themen 12
W Taschenrechner Java Basics - Anfänger-Themen 2
T Tasten vom Taschenrechner? Java Basics - Anfänger-Themen 3
S Datentypen Taschenrechner Java Basics - Anfänger-Themen 13
J Taschenrechner Java Basics - Anfänger-Themen 5
J Taschenrechner Java Basics - Anfänger-Themen 9
M While bei einem Taschenrechner Java Basics - Anfänger-Themen 5
F Datentypen Ganz simpler Taschenrechner mit switch Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben