Home > Informatik > Stufe EF > Folge 3: Fallunterscheidungen

3.5 switch-Anweisung

Waage - Berechnungen - 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 von vielen geschachtelten 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"; 
}

Eine alternative Möglichkeit, eine solche Vielfachauswahl zu programmieren, ist die switch-Anweisung, die quelltextmäßig aber 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";
	}
}

Die switch-Anweisung funktioniert allerdings nur mit ordinalen Datentypen wie byte, int oder char, die im Rechner durch ganze Zahlen dargestellt werden. Wäre die Variable x vom Typ String, float oder double müsste man eine zehnfach geschachtelte if-else-Anweisung verwenden, wie in dem 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, darum wird "x = 2" angezeigt. Case 3 ist wieder nicht erfüllt, trotzdem wird "x = 3" angezeigt. Auch der default-Case ist nicht erfüllt, dennoch wird "x = unbekannt" angezeigt. Das ist natürlich völlig unbefriedigend. Versuchen wir es jetzt mal 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.

Auch wenn der 1. Fall erfüllt ist, geht die switch-Anweisung automatisch zum nächsten Fall über. Um das zu verhindern, ist das Schlüsselwort break notwendig. Mit break wird die switch-Anweisung 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 innerhalb der Methode, sondern auch gleich die ganze Methode. Der break-Befehl beendet dagegen nur die switch-Anweisung der Methode, die Methode selbst wird durch break nicht beendet.

Übung 3.5-1

Schreiben Sie eine Methode gibStoffname(), die ähnlich arbeitet wie die Methode gibAlkan(). Allerdings soll hier nicht nur die Zahl der C-Atome eingegeben und durch eine switch-Anweisung ausgewertet werden können, sondern auch die Stoffklasse, codiert durch eine Zahl zwischen 1 und 6:

1 = Alkane, 2 = Alkene, 3 = Alkine, 4 = Alkohole, 5 = Aldehyde oder 6 = Alkansäuren.

Wird beispielsweise die C-Atom-Anzahl 4 sowie die Stoffklasse 5 eingegeben, so soll der Name "Butanal" zurückgegeben werden. Bei C = 6 und Stoffklasse 4 soll "Hexanol" zurückgegeben werden, bei C = 7 und Stoffklasse 6 soll "Heptansäure" zurückgegeben werden und so weiter. Die Stoffklasse soll ebenfalls durch eine switch-Anweisung ausgewertet werden.

Lösungsvorschlag (nur für Kollegen und Kolleginnen / für Schüler(innen))

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 jeden weitern 5 kg/m2 steigt der Adipositasgrad um 1.

Nun also wie versprochen die nächste Übung:

Übung 3.5-2

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 void bewerteBMI(double bmi)

welche mit Hilfe einer geschachtelten if-else-Anweisung den als Parameter übergebenen BMI mit einer entsprechenden Konsolen-Ausgabe bewertet. Dabei sollen die Fälle

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

berücksichtigt werden.

Begründen Sie, wieso hier eine switch-Anweisung nicht so leicht zu implementieren ist wie eine if-else-Anweisung.

Lösungsvorschlag (für Kollegen und Kolleginnen / für Schüler(innen))