# Anfänger Taschenrechner Frage



## Amarok (25. Mai 2014)

Hallo zusammen ich bin der neue hier.

Ich bin gerade dabei mich in Java einzuarbeiten (2 Wochen) und habe einen sehr simplen Taschenrechner geschrieben.
Der läuft auch soweit, aber ich habe eine Frage: Wie kann ich einen Operator definieren?

1.Ich fodere den Benutzer auf die erste Zahl einzugeben.
2.Dann sollte der Benutzer den Operator eingeben (+,- usw.).
3.Dann wird er Aufgefordet die zweite Zahl einzugeben.
4.Und dann wird das Ergebnis ausgegeben.

Und da verstehe ich nicht wie man das macht, das der Benutzer einen Operator eingeben muss.
Habe zwar schon mehere Tuts mir angesehen aber die meisten waren mir GUI oder mir zu komplex.

Ich hoffe ich konnte mein Problem erklären.
Danke schon mal im Vorraus.
MFG 



```
public class Taschenrechner {														// Simpler Taschenrechner

	public static void main(String []args){
		
		double zahl1,zahl2 = 0,Ergebnis;
		
		Scanner scannerVariable = new Scanner(System.in);
		
		System.out.println("Bitte erste Zahl: ");									// Erste Zahl einlesen.
		zahl1 = scannerVariable.nextDouble();
		
		
		System.out.println("Bitte zweite Zahl: ");									// Zweite Zahl einlesen.
		zahl2 = scannerVariable.nextDouble();
		
		
		Ergebnis = zahl1+zahl2;														// Ergebnis auswerten.
		System.out.println("Das Ergebnis der Addition lautet: "+Ergebnis);			// Ergebnis Ausgabe.
		
		
		Ergebnis = zahl1*zahl2;														// Ergebnis auswerten.
		System.out.println("Das Ergebnis der Multiplikation lautet: "+Ergebnis);	// Ergebnis Ausgabe
		
		
		Ergebnis = zahl1-zahl2;														// Ergebnis auswerten.
		System.out.println("Das Ergebnis der Subtraktion lautet: "+Ergebnis);		// Ergebnis Ausgabe.
		
		
		Ergebnis = zahl1/zahl2;														// Ergebnis auswerten.
		System.out.println("Das Ergebnis der Division lautet: "+Ergebnis);			// Ergebnis Ausgabe.
		
		
	}
	
}
```


----------



## stg (25. Mai 2014)

Ganz allgemeine Antwort:
Benutzereingaben sind zunächst einfach mal nur irgendwelche Zeichen(ketten). Nun bleibt es dir überlassen, wie du die eingegebenen Zeichen interpretierst und wie du daauf reagierst. 

```
Warte auf Benutzereingabe
Wenn Benutzereingabe = +, dann führe Addition durch
Sonst
   Wenn Benutzer eingabe = -, dann führe Subtraktion durch
Sonst
   ...
Gib Ergebnis aus
```


----------



## Amarok (1. Jun 2014)

@stg Danke dir erstmal für deine Hilfe.

Moin zusammen

Ich versuche mich immernoch an meinen Taschenrechner und bekomme eine Fehlermeldung mit der ich nichts anfangen kann.
Hatte mir gedacht ich versuche die Operator Auswahl mit switch case.
Habe zurzeit nur die Zeilen für addition geschrieben.


```
import java.util.Scanner;


public class Testrechner {
	
	

		
	public static void main(String args[]){

	int zahl1, zahl2, ergebnis;
	int operator;

	Scanner eingabe = new Scanner (System.in);

	System.out.println("Taschenrechner 2.2");


	System.out.println ("Bitte geben Sie die erste Zahl ein: ");
	zahl1 = eingabe.nextInt();


	System.out.println ("Bitte geben Sie die zweite Zahl ein: ");
	zahl2 = eingabe.nextInt();


	System.out.println ("Bitte geben Sie einen Operator ein: ");
	operator = eingabe.nextInt();
	
	switch(operator){
	case 1: if(operator == '+'){
		ergebnis = zahl1+zahl2;
	System.out.println(zahl1+'+'+zahl2 +'='+ergebnis );
	break;
	}
	}
	}
	}
```

Ich verwende Eclipse
Als Fehlermeldung bekomme ich:
Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Unknown Source)
	at java.util.Scanner.next(Unknown Source)
	at java.util.Scanner.nextInt(Unknown Source)
	at java.util.Scanner.nextInt(Unknown Source)
	at Testrechner.main(Testrechner.java:28)

Ich hoffe mir kann das jemand erklären was er von mir will:bahnhof:

Danke euch 
mfg


----------



## Gucky (1. Jun 2014)

Ist ein Operator ein Integer? Beantwortest du die Frage, löst du auch dein Problem.


----------



## Amarok (1. Jun 2014)

Ahhh also müsste ich den Operator in ein char machen. Richtig?


----------



## jeegeek (1. Jun 2014)

Amarok hat gesagt.:


> Ahhh also müsste ich den Operator in ein char machen. Richtig?



Ich würde einen String nehmen. Also im Prinzip ein *eingabe.next()*. Denke aber bitte auch daran das dein Programm prüfen sollte ob eine Eingabe gemacht wurde und diese überhaupt gültig ist damit das Programm nicht bei einer falschen Eingabe abstürzt. Ich weiß das ist Mehrarbeit, aber gewöhne es dir am besten gleich an sichere Programme zu schreiben. Du könntest auch die Eingabe in eine eigene Methode auslagern welche sich dann darum kümmert das die Eingabe den Anforderungen entspricht.


----------



## Amarok (2. Jun 2014)

@jeegeek Danke für den Hinweis.

Ich werde eine Prüfung mit einbauen, wenn ich den Taschenrechner mal zum laufen bekommen habe.

Das mit dem Auslagern in eine eigene Methode habe ich jetzt noch nicht so richtig verstanden.
Welchen Vorteil würde das mitsich bringen?

MFG Amarok


----------



## jeegeek (2. Jun 2014)

Amarok hat gesagt.:


> Das mit dem Auslagern in eine eigene Methode habe ich jetzt noch nicht so richtig verstanden.
> Welchen Vorteil würde das mitsich bringen?



Der große Vorteil ist das du die ganze Fehlererkennung nur einmal Programmieren musst und in deiner Hauptschleife einfach sagst zahl1 = benutzerEingabe();. Ich habe vor einiger Zeit mal als Aufgabe einen Taschenrechner schreiben müssen und habe eine Methode geschrieben die eine Dialogbox anzeigt und den Nutzer nach einer Zahl oder einen Operator fragt. Beim Aufruf gibst du der Methode einen Text für die Dialogbox und die Information was du als Rückgabe erwartest. In diesem Fall sind Integer und Operator möglich. Die Methode prüft dann ob die eigegebene Zahl umgewandelt werden kann oder ein Operator unterstützt wird. Wenn der Benutzer einen ungültigen Wert eingibt dann wird der Dialog erneut angezeigt, wenn der Benutzer abbricht liefert die Methode null zurück. Die Methode ist schon etwas älter und nicht optimal, aber als Grundlage gut nachvollziehbar. Du müsstest es natürlich so umbauen das die Eingabe in der Konsole erfolgt.

Hier ein kleines Beispiel:

```
String eingabe=benutzerEingabe("Integer","Bitte erste Zahl eingeben:");
			if (eingabe==null)
			{
				//Benutzer hat die Eingabe abgebrochen also beenden
				System.exit(0); //Ende
			}
                       else
                                int zahl1 = Integer.parseInt(eingabe);
```


```
static String benutzerEingabe(String typ, String dialogText){
		/* ##############################################################################
		 * Die Methode benutzerEingabe nimmt die Eingaben des Benutzers entgegen
		 * und stellt sicher das diese den Anforderungen des Programms entsprechen.
		 * Der vom Aufrufer erwartete Rückgabetyp wird über den Parameter typ übergeben.
		 * Mögliche Rückgaben sind Integer und Operator. Es wird geprüft ob
		 * eine Umwandlung in den gewünschten Typen möglich ist oder ein eingegebener
		 * Operator unterstützt wird. Wenn der Anwender den Dialog abbricht liefert
		 * die Methode den Wert null zurück. Der Text der Dialogbox wird über dialogText
		 * übergeben.
		 * 
		 * !!!WARNUNG:!!!
		 * Die Methode ist in der Lage das Programm zu beenden. Sollte der Programmierer
		 * einen ungültigen typ übergeben wird das Programm beendet da eine fehlerfreie
		 * Funktion nicht mehr möglich ist, da sich die Hauptschleife auf einen
		 * korrekten Rückgabewert verlässt.
		 * 
		 * Verwendete Variablen:
		 * erfolg				[boolean] 	Steuervariable für die Hauptschleife.
		 * eingabe				[String]	Speichert die Benutzereingabe.
		 * dialogTextOriginal	[String]	Kopie von dialogText
		 */
		
		boolean erfolg=false;
		String eingabe=null, dialogTextOriginal=dialogText;
		
		do
		{
			//Benutzereingabe entgegen nehmen
			eingabe=JOptionPane.showInputDialog(dialogText);
			if (eingabe==null)
				//Benutzer hat abgebrochen, also ist hier Schluss
				return eingabe;
			
			//prüfen welcher Rückgabewert erwartet wird 
			if (typ=="Integer")
			{
				//prüfen ob umwandlung in Integer möglich ist
				try
				{
					Integer.parseInt(eingabe);
					erfolg=true;
				}
				catch (Exception e)
					//Umwandlung war nicht möglich, dialogText anpassen und noch einmal	
					{
						dialogText = "Ihre Eingabe war nicht zulässig, bitte wiederholen Sie Ihre Eingabe!\n" + dialogTextOriginal;
					}
			}
			
			else if (typ=="Operator")
			{
				//prüfen ob eine solche Rechenoperation verfügbar ist
				switch (eingabe)
				{
					//mögliche Operatoren
					case "+":
					case "-":
					case "/":
					case "*":
					case "E":
					case "^":
						erfolg=true;
						break;
					default:
						//Eingabe war ungültig.
						dialogText = "Diesen Operator gibt es nicht!\n" + dialogTextOriginal;
				}
			}

			else
			{
				//Wenn wir hier ankommen hat der Programmierer einen Fehler gemacht.
				//Wir weißen noch auf den Fehler hin und beenden das Programm
				//da es nicht mehr Fehlerfrei ablaufen kann.
				System.out.println("\nInterner Fehler in benutzerEingabe");
				System.out.println("Der Parameter \"" +typ +"\" ist unbekannt. Programm wird angehalten!");
				System.exit(0);
			}
		} while (erfolg==false);
		
		//Alles erledigt, nun die Eingabe zurückgeben
		return eingabe;
	}
```


----------



## Amarok (4. Jun 2014)

@jeegeek Danke dir für die Vorlage werde mal sehen wenn ich mein zum laufen bekommen habe, ob ich sowas in der Richtung mit eingebaut bekomme.

MFG Amarok


----------



## Amarok (7. Jun 2014)

Moin Moin ich schon wieder....


Ich bekomme das Problem nicht gelöst einen Operator einzulesen, für euch ist das sicherlich kein Problem, aber ich drehe mich hier im Kreis.
Wäre einer so nett mir grob zu erklären wie ich den Operator einbinden muss?

Ich lasse vom Benutzer zwei Zahlen vom Typ Integer einlesen.
Wie lasse ich aber einen Operator einlesen?
Habe jetzt mehere Beiträge durchforstet mal wird der Operator als String mal alc char eingelesen und dann irgendwie wieder als Integer konvertiert.

Jetzt habe ich mehere Tuts durchgestöbert aber dennoch bekomme ich mein Problem nicht gelöst.

Falls mir einer kurz Helfen könnte wäre ich sehr Dankbar....

MFG amarok


----------



## SilverClaw (7. Jun 2014)

> Ich lasse vom Benutzer zwei Zahlen vom Typ Integer einlesen.
> Wie lasse ich aber einen Operator einlesen?
> Habe jetzt mehere Beiträge durchforstet mal wird der Operator als String mal alc char eingelesen und dann irgendwie wieder als Integer konvertiert.



Keine Ahnung, was das genau soll, den als Integer zu lesen....
aber du brauchst doch eigenetlich nur sowas wie
Scanner scan = new Scanner(System.in)

String operator = scan.next();
switch(operator) {

case "+"; // addiere 
break;
case "-" // subtrahiere
break;
//und so weiter...
default: //Fehlermeldung oder sowas?
break;
}


----------



## Java20134 (7. Jun 2014)

Oder du baust es so auf: 

```
System.out.println("Addition: 1; Subtraktion: 2;...");

Scanner sc = new Scanner(System.in);
System.out.println("Welche Rechenoperation?");
String rechnung = sc.next();

Switch(rechnung){
case 1: //hier führst du die erste Rechnung aus 
break;
case 2: //hier führst du die zweiteRechnung aus
break;
case 3: //hier führst du die dritte Rechnung aus
break;
case 4: //hier führst du die vierte Rechnung aus
break;
default: System.out.println("Fehler!");
break; }
System.out.println("Das Ergebnis lautet: " +Ergebnis);
```


----------



## SilverClaw (7. Jun 2014)

Java20134 hat gesagt.:


> Oder du baust es so auf:
> 
> ```
> System.out.println("Addition: 1; Subtraktion: 2;...");
> ...



Würde das nicht einen String mit int-Werten vergleichen? :autsch:


----------



## Java20134 (7. Jun 2014)

Sorry vergessen. 

```
String Rechnung = sc.nextInt();
```


----------



## Amarok (8. Jun 2014)

Ich Danke euch habe es endlich zum laufen bekommen.

Danke 
Mfg Amarok


----------

