5 Fachkonzept - Fallunterscheidung

Alternative Abläufe

Häufig kommt es vor, dass man bei der Verarbeitung von Daten unterschiedliche Wege gehen muss.

Solche alternativen Abläufe lassen sich sehr gut mit Flussdiagrammen verdeutlichen.

Fachkonzept - Fallunterscheidungen

Bei der Modellierung alternativer Abläufe verwendet man meist zwei Ablaufmuster, die man als zweiseitige Fallunterscheidung bzw. einseitige Fallunterscheidung bezeichnet. Diese Fallunterscheidungsvarianten sollen jetzt genauer betrachtet werden.

Eine zweiseitige Fallunterscheidung besteht aus einer Bedingung und zwei Anweisungssequenzen, einer für den Fall, dass die Bedingung erfüllt ist, und einer für den anderen Fall.

Die Struktur einer solchen zweiseitigen Fallunterscheidung beschreibt man oft mit einem Struktogramm:

Das folgenden Flussdiagramm verdeutlicht die Ausführung einer solchen zweiseitigen Fallunterscheidung.

Bei der Ausführung einer zweiseitigen Fallunterscheidung wird zunächst überprüft, ob die Bedingung erfüllt ist. Ist das der Fall, so werden die Anweisungen der entsprechenden Anweisungssequenz ausgeführt. Andernfalls werden die Anweisungen der anderen Anweisungssequenz ausgeführt.

Eine einseitige Fallunterscheidung besteht aus einer Bedingung und nur einer Anweisungssequenz.

Das Struktogramm zu dieser Fallunterscheidungsvariante sieht so aus:

Hier das entsprechende Flussdiagrammen zur Beschreibung der Ausführung:

Bei der Ausführung einer einseitigen Fallunterscheidung wird zunächst überprüft, ob die Bedingung erfüllt ist. Ist das der Fall, so werden die Anweisungen der Anweisungssequenz ausgeführt. Andernfalls geschieht gar nichts.

Implementierung von Fallunterscheidungen in Java

Fallunterscheidungen werden in Python mit if-Anweisungen dargestellt.

In der zweiseitigen Variante ist eine if-Anweisung wie folgt aufgebaut:

if ( [Bedingung] ) {
	[Anweisungssequenz]
}
else {
	[Anweisungssequenz]
}

Beispiel:

if (zufallszahl == 0) {
	System.out.println("Kopf ist gefallen.");
	seite = 'K';
}
else {
	System.out.println("Zahl ist gefallen.");
	seite = 'Z';
}

Eingeleitet wird sie mit dem Schlüsselwort if. Anschließend folgt eine Bedingung, die einfach oder auch zusammengesetzt sein kann. Wichtig ist, dass der folgende Anweisungsblock mit geschweiften Klammern gekennzeichnet wird. Nach dem Schlüsselwort else folgen in geschweiften Klammern die Anweisungen, die ausgeführt werden sollen, wenn die Bedingung nicht erfüllt ist.

In der einseitigen Variante fehlt der gesamte else-Teil:

if ( [Bedingung] ) {
	[Anweisungssequenz]
}

Beispiel:

if (tipp == 'k') {
	tipp = 'K';
}
if (tipp == 'z') {
	tipp = 'Z';
}

Fallunterscheidungen kann man schachteln, wie das folgende Beispiel zeigt:

public class Wuerfel
{
    public static void main(String[] args){
        int augen = (int) (6*Math.random()+1);
        String bild = "";
        if (augen == 1) {
            bild = "o";
        }
        else {
            if (augen == 2){
                bild = "oo";
            }
            else{
                if (augen == 3){
                    bild = "ooo";
                }
                else {
                    // ...
                }
            }
        }
        // Ausgabe
        System.out.println(bild);
    }
}

Wenn auf diese Weise sehr viele Fälle getrennt betrachtet werden sollen, dann kann man die Fallunterscheidung in Java auch übersichtlicher mit Hilfe der switch-Anweisung wie folgt implementieren. Dabei leitet die Anweisung switch die Fallunterscheidung ein. Mit dem Schlüsselwort case (deutsch: Fall) werden die verschiedenen zu behandelnden Fälle getrennt. Die Anweisungsblöcke für die verschiedenen Fälle werden jeweils mit dem Schlüsselwort break beendet. Im default-Block werden für den Fall Anweisungen angegeben, falls keiner der zuvor aufgezählten Fälle eingetreten ist.

public class Wuerfel3
{
    public static void main(String[] args){
        int augen = (int) (6*Math.random()+1);
        String bild;
        switch (augen) {
            case 1 : bild = "o"; 
                     break;
            case 2 : bild = "oo";
                     break;
            case 3 : bild = "ooo";
                     break;
            case 4 : bild = "oooo";
                     break;
            case 5 : bild = "ooooo";
                     break;
            case 6 : bild = "oooooo";
                     break;
            default : bild = "Hallo";
        }
        // Ausgabe
        System.out.println(bild);
    }
}

Quellen

Text: http://www.inf-schule.de/programmierung/imperativeprogrammierung/fallstudien/kontrollstrukturen/fallstudie_zufallsexperimente/konzept_fallunterscheidung