Home > Informatik > Stufe EF > Folge 3: Fallunterscheidungen

3.5 switch-Anweisung

class Person - Getter/Setter - Fallunterscheidungen - if-else-Bedingungen - switch-Anweisung

Fallbeispiel 1: "Alkane"

Es soll eine Methode geschrieben werden, welche die Namen der ersten 10 Alkane zurückliefert. Als Parameter bekommt die Methode die Zahl der C-Atome. Man könnte nun mit Hilfe vieler geschachtelter if-Anweisungen diese Methode implementieren, zum Beispiel so:

					public String gibAlkan(int x)
					{
						if (x == 1) return "Methan"; else
						if (x == 2) return "Ethan"; else
						if (x == 3) return "Propan"; else
						if (x == 4) return "Butan"; else
						if (x == 5) return "Pentan"; else
						if (x == 6) return "Hexan"; else
						if (x == 7) return "Heptan"; else
						if (x == 8) return "Octan"; else
						if (x == 9) return "Nonan"; else
						if (x == 10) return "Decan";

						return "unbekannt";
					}
					

Eine alternative Möglichkeit, eine solche Vielfachauswahl zu programmieren, ist die switch-Anweisung, die quelltextmäßig allerdings genau so "umständlich" aussieht:

					public String gibAlkan(int x)
					{
						switch (x)
						{
							case  1: return "Methan";
							case  2: return "Ethan";
							case  3: return "Propan";
							case  4: return "Butan";
							case  5: return "Pentan";
							case  6: return "Hexan";
							case  7: return "Heptan";
							case  8: return "Octan";
							case  9: return "Nonan";
							case 10: return "Decan";
							default: return "unbekannt";
						}
					}
					

Die switch-Anweisung funktioniert mit ordinalen Datentypen wie byte, short, int oder char, die im Rechner durch ganze Zahlen dargestellt werden. Außerdem kann sie auch mit Variablen vom Typ String sowie mit Aufzählungstypen (enum) verwendet werden.

Wäre die Variable x dagegen vom Typ float oder double, könnte man keine normale switch-Anweisung verwenden. Man müsste dann eine geschachtelte if-else-Anweisung einsetzen, wie im ersten Quelltext-Beispiel.

Auch die switch-Anweisung kennt eine Art else-Zweig, nur heißt hier das Schlüsselwort nicht "else", sondern default:

					switch (n)
					{
						case 1 : System.out.println("Nummer Eins!"); break;
						case 2 : System.out.println("Nummer Zwei!"); break;
						default: System.out.println("Bitte geben Sie 1 oder 2 ein!");
					}
					

Die break-Anweisung

Informatik ist ja eine Naturwissenschaft, und Naturwissenschaften glänzen durch Experimente. Führen wir einmal ein Experiment durch, um die Bedeutung des break-Befehls zu erforschen. Dazu lassen wir folgenden Quelltext laufen:

					public class STest1
					{
						 private int x = 2;

						 public STest1()
						 {
							  switch (x)
							  {
									case 1 : System.out.println("x = 1");
									case 2 : System.out.println("x = 2");
									case 3 : System.out.println("x = 3");
									default: System.out.println("x = unbekannt");
							  }
						 }
					}
					

Das Attribut x hat hier den Wert 2, also sollte man annehmen, dass in der Konsole "x = 2" angezeigt wird. Hier nun die Konsolenausgabe:

					x = 2
					x = 3
					x = unbekannt
					

Case 1 ist nicht erfüllt, daher wird "x = 1" nicht ausgegeben. Case 2 ist erfüllt, daher wird "x = 2" angezeigt. Anschließend setzt die switch-Anweisung ihre Ausführung jedoch einfach beim nächsten case fort. Deshalb werden auch "x = 3" und schließlich "x = unbekannt" ausgegeben. Das ist natürlich völlig unbefriedigend. Versuchen wir es jetzt einmal mit der break-Variante:

					public class STest1
					{
						 private int x = 2;

						 public STest1()
						 {
							  switch (x)
							  {
									case 1 : System.out.println("x = 1"); break;
									case 2 : System.out.println("x = 2"); break;
									case 3 : System.out.println("x = 3"); break;
									default: System.out.println("x = unbekannt");
							  }
						 }
					}
					

Jetzt wird tatsächlich nur noch "x = 2" in der Konsole angezeigt.

Selbst dann, wenn ein Fall erfüllt ist, geht die switch-Anweisung ohne break automatisch zum nächsten Fall über. Mit break wird die switch-Anweisung sofort beendet. Bei dem Beispiel mit den Alkanen wurde break nicht benötigt, da der return-Befehl die switch-Anweisung ebenfalls beendet, wenn der jeweilige Fall zutrifft. Allerdings beendet return nicht nur die switch-Anweisung, sondern auch gleich die gesamte Methode. Der break-Befehl beendet dagegen nur die switch-Anweisung; die Methode selbst wird dadurch nicht beendet.

switch funktioniert auch mit Strings!

Interessanterweise funktioniert die switch-Anweisung auch mit Variablen des Typs String. Hier ein Beispiel:

					public void wochentag(String day)
					{
						 switch (day)
						 {
							  case "Montag":
									System.out.println("Es ist der erste Tag der Woche.");
									break;
							  case "Dienstag":
									System.out.println("Es ist der zweite Tag der Woche.");
									break;
							  case "Mittwoch":
									System.out.println("Es ist der dritte Tag der Woche.");
									break;
							  case "Donnerstag":
									System.out.println("Es ist der vierte Tag der Woche.");
									break;
							  case "Freitag":
									System.out.println("Es ist der fünfte Tag der Woche.");
									break;
							  case "Samstag":
									System.out.println("Es ist der sechste Tag der Woche.");
									break;
							  case "Sonntag":
									System.out.println("Es ist der siebte Tag der Woche.");
									break;
							  default:
									System.out.println("Ungültiger Tag.");
						 }
					}
					

Nachtrag: Der BMI

Kommen wir nun wieder zum Hauptthema der Folge 5 zurück, zu unserer Waage. In der Folge 3.2 hatten wir ja schon das Idealgewicht einer Person berechnet. In der nächsten Aufgabe soll der BMI berechnet werden.

Der Body-Mass-Index (BMI)

Der BMI einer erwachsenen Person berechnet sich aus der Körpergröße in Metern und dem Gewicht in Kilogramm. Eine Person, die 179 cm groß ist und 89 kg wiegt, hat folgenden BMI:

$BMI = \frac{Gewicht}{Größe^{2}} = \frac{89 kg}{1,79m^{2}} = 27,78 kg/m^{2}$

Man muss also die Körpergröße quadrieren und dann das Gewicht durch die Körpergröße dividieren. Achten Sie darauf, dass die Körpergröße in Metern angegeben wird und nicht in Zentimetern!

Wie beurteilt man nun das Ergebnis dieser Berechnung?

Ganz grob kann man sagen, dass ein BMI < 20 Untergewicht bedeutet. Ein BMI zwischen 20 und < 25 wird als Normalgewicht betrachtet. Liegt der BMI zwischen 25 und < 30, spricht man von Übergewicht. Ein BMI zwischen 30 und < 35 wird als Adipositas Grad 1 (Fettleibigkeit) betrachtet. Ein BMI zwischen 35 und < 40 ist Adipositas Grad 2 und so weiter; mit jedem weiteren Anstieg um 5 kg/m2 erhöht sich der Adipositasgrad um 1.

Nun also wie versprochen die nächste Übung:

Übung 3.5-2 (für Experten)

Schreiben Sie eine sondierende Methode

public double gibBMI()

die aus dem Gewicht und der Körpergröße der Person den BMI berechnet und als double-Wert zurückgibt.

Schreiben Sie dann eine Ausgabemethode

public String bmiBewertung(double bmi)

welche mit Hilfe einer Reihe von Fallunterscheidungen den übergebenen BMI bewertet und die Bewertung als String zurückliefert. Mögliche Rückgabewerte sind:

  • "Untergewicht"
  • "Normalgewicht"
  • "Übergewicht"
  • "Adipositas Grad 1"
  • "Adipositas Grad 2"
  • "Adipositas Grad 3 oder mehr"

Sie können selbst entscheiden, ob Sie eine Folge von if-else-Anweisungen benutzen oder den BMI in eine ganze Zahl umwandeln und dann eine switch-Anweisung benutzen. So lernen Sie die Vor- und Nachteile beider Methoden kennen.

Experten brauchen keinen Lösungsvorschlag!