# Zweiseitige Auswahl



## Rabbit2001 (4. Jan 2007)

Hallo!

Ich habe folgende Aufgabenstellung bei einer Hausaufgabe für die Schule: 

Es soll der Gesamtwiderstand zweier Parallel oder in Reihe geschaltener Widerstände ausgegeben werden. 

Wenn der Benutzer ein "R" eingibt, soll die Berechnung für die Reihenschaltung ausgeführt werden und bei "P" dann die Berechnung für die Parallelschaltung. 

Jetzt mein Problem: ich weiß nicht wie ich das mit dem Buchstabeneinlesen hinbekommen soll bzw. das mit der Auswahl zwischen "R" und "P". 

Schaut euch bitte meinen Code an und es wäre super, wenn ihr den/die Fehler entdecken würdet. 

Vielen Dank schon im Vorraus!

Liebe Grüße




*Programmbeschreibung: Berechnet den Gesamtwiderstand zweier parallel oder in Reihe geschalteter Widerstände und gibt ihn aus.
 *
 */



```
import java.io.*;
 
 public class Widerstand
 
 {
 		
 	public static void main (String args[]) throws IOException
 	{
 		//Variablendeklaration
 		
 		double r1, r2, ergebnis;
 		
 		char p = 'P';
 		char r = 'R';
 		int zeichen;
 		String str;
 		
 									
 		System.out.println("Widerstands-Schaltung");
 		
 		System.out.println("(P)arallel- oder (R)eihenschaltung?");
 		
 		zeichen=System.in.read();
 		
 			
 		//Einlesen der Information(en)
 									
 		
 		System.out.println("R1 in Ohm: ");
 		
 		//Erzeugung des Eingabeobjektes
 		
 		BufferedReader input=new BufferedReader(
 				    new InputStreamReader(
 				            System.in));
 		
 		str=input.readLine();
 		
 		
 		r1=Double.parseDouble(str);
 		
 		
 		System.out.println("R2 in Ohm: ");
 		
 		str=input.readLine();
 		
 		r2=Double.parseDouble(str);
 		
 		
 		if (zeichen == 'P')
 		
 		{
 				
 			ergebnis=(r1*r2)/(r1+r2);
 			System.out.println("Der Gesamtwert der Parallelschaltung ist "+ergebnis+ " Ohm");
 			System.out.println("Programmende Widerstand");
 			
 			
 		}
 		
 		
 		else
 		
 		{
 			ergebnis=(r1+r2);
 			System.out.println("Der Gesamtwert der Reihenschaltung ist "+ergebnis+ "Ohm");
 			System.out.println("Programmende Widerstand");
 			
 		}
 				
 	}
 			
 	
 }
```


----------



## dieta (4. Jan 2007)

Strings darf man nicht mit "==" vergleichen. Das musst du mit dar Methode String.equals(anderer String) machen:

```
if(zeichen.equals("R"))
{
    //Tu was
}
else
{
    //Tu was anderes
}
```


----------



## Rabbit2001 (4. Jan 2007)

Vielen Dank,

es scheint zu funktionieren... aber gibt es noch eine andere Möglichkeit als mit dem "equals-Befehl"? Denn das haben wir noch nicht durchgenommen... :bahnhof: 

Muss ich das "P" und das "R" denn als String einlesen? Es ist doch nur ein Zeichen und keine Zeichenkette. Kann ich das nicht mit dem Variablentyp "Char" irgendwie machen?

Sorry vielleicht für meine etwas dummen Fragen, aber bin noch absoluter Neuling... :?


----------



## Guest (4. Jan 2007)

Rabbit2001 hat gesagt.:
			
		

> Vielen Dank,
> 
> es scheint zu funktionieren... aber gibt es noch eine andere Möglichkeit als mit dem "equals-Befehl"? Denn das haben wir noch nicht durchgenommen... :bahnhof:
> 
> ...



Ja kannst du!   

Wenn du nur ein Zeichen hast kannst du mit char arbeiten und die kannst du dann mit == vergleichen


----------



## Rabbit2001 (4. Jan 2007)

Hier mein neuer Code:


```
import java.io.*;
 
 public class Widerstand
 
 {
 		
 	public static void main (String args[]) throws IOException
 	{
 		//Variablendeklaration
 		
 		double r1, r2, ergebnis;
 		
 		char p = 'P';
 		char r = 'R';
 		
		
 		String str, zeichen;
 		

 									
 		System.out.println("Widerstands-Schaltung");
 		
 		System.out.println("(P)arallel- oder (R)eihenschaltung?");
 		
 		//Erzeugung des Eingabeobjektes
 		
 		BufferedReader input=new BufferedReader(
 								new InputStreamReader(
 									System.in));
 		
 		
 		zeichen=input.readLine();
 		
 			
 		//Einlesen der Information(en)
 									
 		
 		System.out.println("R1 in Ohm: ");
 		
 
 		
 		
 
 		str=input.readLine();
 		
 		
 		r1=Double.parseDouble(str);
 		
 		
 		System.out.println("R2 in Ohm: ");
 		
 		str=input.readLine();
 		
 		r2=Double.parseDouble(str);
 		
 		
 		if(zeichen.equals("P"))
 		
 		{
 				
 			ergebnis=(r1*r2)/(r1+r2);
 			System.out.println("Der Gesamtwert der Parallelschaltung ist "+ergebnis+ " Ohm");
 			System.out.println("Programmende Widerstand");
 			
 			
 		}
 		
 		
 		if(zeichen.equals("R"))
 		
 		{
 			ergebnis=(r1+r2);
 			System.out.println("Der Gesamtwert der Reihenschaltung ist "+ergebnis+ " Ohm");
 			System.out.println("Programmende Widerstand");
 			
 		}
 				
 	}
 			
 	
 }
```


----------



## Rabbit2001 (4. Jan 2007)

Danke! Aber warum findet er Integer, wenn ich mit 


```
zeichen=System.in.read();
```


das Zeichen ( "P" oder "R" einlesen will??? Zeichen habe ich als Char deklariert...


----------



## Leroy42 (4. Jan 2007)

Anonymous hat gesagt.:
			
		

> Wenn du nur ein Zeichen hast kannst du mit char arbeiten und die kannst du dann mit == vergleichen



Im Prinzip richtig. Aber es könnte Probleme bei Mehrfachem Einlesen geben,
da bei System.in.read() auch die betriebssystemspezifischen Zeichen für
newline (\r\n (= *C*arriage *R*eturn *N*ewline = ASCII 13/10 bei WinDoof-Systemen)
behandelt werden müssen.

readline ist da angenehmer!


----------



## Rabbit2001 (4. Jan 2007)

Danke Leroy42! Aber geht es denn nicht doch irgendwie mit System.in.read()???  Wenn ich meine Zeichen mit: 

```
zeichen=System.in.read();
```

einlese? Er findet dann aber immer Integer. Warum liest er es nicht als "Char" ein? zeichen habe ich als Char auch deklariert. Muss da vorher noch irgendwas "parsen"??


----------



## Leroy42 (4. Jan 2007)

Nein, deine erste Programm-Version sollte eigentlich auch funktionieren.

Ein char ist ja nichts anderes als _ein kleiner int_.


```
zeichen = (char) System.in.read();
```


----------



## Rabbit2001 (4. Jan 2007)

Mmmh... komisch, dass er trotzdem abbricht... er liest "p" oder "r" denke ich mal ein und wenn er den ersten Widerstandswert (also r1) abfrägt, dann bricht er ab...
Alles sehr eigenartig...


----------



## Rabbit2001 (4. Jan 2007)

Hier die Meldungen die die Konsole ausspuckt:

Widerstands-Schaltung
(P)arallel- oder (R)eihenschaltung?
P
R1 in Ohm:
Exception in thread "main" java.lang.NumberFormatException: empty String
        at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:9
86)
        at java.lang.Double.parseDouble(Double.java:201)
        at Widerstand.main(Widerstand.java:53)
Press any key to continue...


----------



## hupfdule (4. Jan 2007)

Die Fehlermeldung ist doch eindeutig. Du versuchst einen leeren String nach Double zu casten. Das klappt natürlich nicht. Das Einlesen klappt offenbar nicht.


----------



## Leroy42 (4. Jan 2007)

Genau was ich vermutet habe: In deiner Eingabe steht

_P\r\n123.456\r\n_

1. Dein read() liest das P ==> OK!
2. Dein readline() liest \r\n ==> Leerer String ==> Nicht ok


----------



## Rabbit2001 (4. Jan 2007)

Das habe ich mir auch schon fast gedacht... also gibt es keinen anderen Weg, als doch das ganze als String einzulesen, oder?


----------



## Leroy42 (4. Jan 2007)

...zumindest keine plattformunabhängigen.

Bei WinDoof-Systemen kannst du schreiben:


```
zeichen = System.in.read();
System.in.read();System.in.read(); // newline überlesen
```

Das dürfte auch auf Macs klappen, da meines Wissens
newlines dort durch "\n\r" kodiert werden.

Auf *x (Linux, ...)-Systemen wird newline mit nur einem Zeichen (\n) codiert,
sodaß es dort nicht klappt.

Ergo: Bleib' lieber bei readline (Es macht aus Sicht des Users ja keinen Unterschied)


----------



## hupfdule (4. Jan 2007)

Du könntest auch einfach so lange weiter lesen, bis das gelesene Zeichen kein Whitespace-Zeichen ist.
Oder sogar so lange, bis ein verwertbares Zeichen kommt. Ideal ist diese Lösung aber auch nicht. Besser wäre schon, das ganze als String zu lesen.


----------



## Rabbit2001 (4. Jan 2007)

Okay vielen Dank für eure Hilfe!!! Hab jetzt alles als String eingelesen und jetzt funktioniert es. Also danke nochmal!!!


----------

