9.3 Verschachtelte Verzweigung

Aufgabe

Aufgabe 9-6: Szenario – „verzwickt“

Ziel dieses Szenarios ist es, dass ein Roboter vom Feld (2; 1) startet und das Zielfeld (4; 6) erreicht. Dabei gibt es zwei Schwierigkeiten. Zum einen ist nicht geklärt, ob das Feld (3; 3) oder das Feld (5; 3) durch eine Mauer blockiert ist. Zum anderen wird der östliche Weg durch einen Erdhügel versperrt. Allerdings ist seine genaue Lage ebenfalls unklar. In Frage kommt entweder das Feld (6; 4) oder das Feld (6; 5).

img/9_25_Spielbrett_s7.jpg
Abb. 9-25: Spielbrett s7
Aufgabe

Entwickeln Sie die Klasse Szenario. Gehen Sie dabei wie folgt vor:

  1. Entwerfen Sie zunächst für die Methode steuereRoboter() ein Struktogramm. Lösung
    img/Abb_9_26_Aufgabe_9_6_Struktogramm.svg
    Abb. 9-26: Struktogramm der Methode steuereRobi()
  2. Erstellen Sie dann den Quellcode der Klasse Szenario. Lösung
    JAVA
    package welt;

    public class Szenario {

        private Roboter robi;
        
        public void erstelleRobi(Spielbrett pSpielbrett){
            robi = new Roboter();
            robi.setSpielbrett(pSpielbrett);
            robi.starteAufFeld(2,1);
            robi.setGeschwindigkeit(4);
        }
            
        public void steuereRobi() {
            robi.ladAuf();
            robi.gehVorwaerts();
            robi.ladAb();
            robi.gehVorwaerts();
            robi.drehRechts();
            robi.gehVorwaerts();
            robi.gehVorwaerts();
            robi.drehRechts();
            if(robi.istWegFrei()) {
                robi.gehVorwaerts();
                robi.gehVorwaerts();
                robi.drehLinks();
                robi.gehVorwaerts();
                robi.gehVorwaerts();
                robi.drehLinks();
                robi.gehVorwaerts();
                robi.gehVorwaerts();
                robi.drehRechts();

            }
            else {
                robi.drehRechts();
                robi.drehRechts();
                robi.gehVorwaerts();
                robi.gehVorwaerts();
                robi.drehRechts();

                if(robi.istWegFrei()) {
                    robi.gehVorwaerts();
                    robi.ladAuf();

                }
                else {
                    robi.ladAuf();
                    robi.gehVorwaerts();

                }
                robi.gehVorwaerts();
                robi.drehRechts();
                robi.ladAb();
                robi.gehVorwaerts();
                robi.gehVorwaerts();
                robi.drehLinks();

            }
            robi.gehVorwaerts();
        }

    }
    Abb. 9-27: Klasse Szenario (Quellcode)
Hinweise:
  • Erstellen Sie mit dem Spielbretteditor zunächst eine Variante des Spielbretts und speichern Sie diese als 'Spielbrett s7a' ab. Ändern Sie das Spielbrett dann jeweils so ab, dass eine weitere Variante des Spielbretts entsteht, und speichern Sie diese als 'Spielbrett s7b' ab. Fahren Sie damit solange fort, bis alle möglichen Spielbrettvarianten vorliegen. Testen Sie Ihren Quellcode dann mit allen Spielbrettvarianten. Der Roboter soll dabei jeweils das Ziel erreichen, ohne dass hierfür Änderungen am Quellcode erforderlich werden.
  • Weisen Sie dem Roboter eine Geschwindigkeit von 4 zu, um die Tests zu beschleunigen.
Aufgabe

Aufgabe 9-7: Halbjahresleistung II

Modifizieren Sie den Quellcode der in Aufgabe 8-2 erstellten Fachklasse so, dass neben dem berechneten Notendurchschnitt auch die entsprechende Zeugnisnote ausgegeben werden.

Konsole
Halbjahresleistung
==================

Bitte geben Sie die folgenden Noten ein:
----------------------------------------
1. Klassenarbeit: 10
2. Klassenarbeit: 11
Mündliche Note: 12

----------------------------------------
Notendurchschnitt: 10.875
Zeugnisnote: gut
Abb. 9-28: Konsole mit Benutzereingaben (Beispieldaten)
Notendurchschnitt Zeugnisnote
weniger als 0,5 Punkte ungenügend
ab 0,5 Punkten mangelhaft
ab 3,5 Punkten ausreichend
ab 6,5 Punkten befriedigend
ab 9,5 Punkten gut
ab 12,5 Punkten sehr gut
Abb. 9-29: Schulnoten
Lösung
Lösung
JAVA
public String ermittleZeugnisnote() {
    String schulnote;
    double schnittGesamt = this.berechneNotendurchschnitt();
    
    if(schnittGesamt>=12.5) {
        schulnote = "sehr gut";
    }
    else {
        if(schnittGesamt>=9.5) {
            schulnote = "gut";
        }
        else {
            if (schnittGesamt>=6.5) {
                schulnote = "befriedigend";
            }
            else {
                if (schnittGesamt>=3.5) {
                    schulnote = "ausreichend";
                }
                else {
                    if (schnittGesamt>=0.5) {
                        schulnote = "mangelhaft";
                    }
                    else {
                        schulnote = "ungenügend";
                    }
                }
            }
        }
    }
    
    return schulnote;
}
Abb. 9-30: Die Methode ermittleZeugnisnote(): String der Klasse Note (Quellcode)
JAVA
private void zeigeNotendurchschnitt() {
    System.out.println("\nFolgende Daten wurden erfasst:");
    System.out.println("----------------------------------------");
    System.out.println("Notendurchschnitt: " + noten.berechneNotendurchschnitt());
    System.out.println("Schulnote: " + noten.ermittleZeugnisnote());
}
Abb. 9-31: Die Methode zeigeNotendurchschnitt() der Klasse Benutzerkonsole (Quellcode)
Aufgabe

Aufgabe 9-8: Body Mass Index

Der Body-Mass-Index (BMI) ist eine Maßzahl für die Bewertung des Körpergewichts eines Menschen. Da Übergewicht ein weltweit zunehmendes Problem darstellt, wird die Körpermassenzahl vor allem dazu verwendet, auf eine diesbezügliche Gefährdung hinzuweisen. Der BMI gibt dabei lediglich einen groben Richtwert an und ist umstritten, da er die Statur eines Menschen und die individuell verschiedene Zusammensetzung des Körpergewichts aus Fett- und Muskelgewebe naturgemäß nicht berücksichtigt.

img/BMI_Formel.svg
Abb. 9-32: Berechnungsformel BMI
Aufgabe

Erstellen Sie eine Java-Anwendung, die Vor- und Nachname sowie Größe und Gewicht der Person erfragt. Anschließend soll sie ein Objekt der Klasse Person erzeugen und diesem die erfassten Daten zuweisen. Abschließend soll sie von dem erzeugten Personen-Objekt den BMI berechnen lassen und eine kurze Auswertung zu diesem BMI (vgl. Abb. 9-34) anfordern. Die Erfassung und Ausgabe der Daten soll mit Hilfe der Konsole erfolgen (vgl. Abb. 9-33).

Konsole
Body Mass Index
-------------------------------
Bitte geben Sie Ihre Daten ein!

Vorname: Max
Nachname: Maier
Gewicht (in kg): 75
Größe (in m): 1.85
===============================
Max Meier
---------
BMI: 21.913805697
Auswertung: Normalgewicht
Abb. 9-33: Konsole mit Benutzereingaben (Beispieldaten)
BMI Auswertung
unter 19 Untergewicht
bis 25 Normalgewicht
bis 29 leichtes Übergewicht
bis 39 Übergewicht
über 39 extremes Übergewicht
Abb. 9-34: Body Mass Index
Lösung
Lösung
JAVA
package app;

public class Person {
    
    private String vorname;
    private String nachname;
    private double gewicht;
    private double groesse;
    
    public Person() {
        
    }
    
    public Person(String pVorname, String pNachname){
        this.vorname = pVorname;
        this.nachname = pNachname;
    }
        
    public void setVorname(String pVorname) {
        this.vorname = pVorname;
    }
    
    public String getVorname(){
        return this.vorname;
    }
    
    public void setNachname(String pNachname) {
        this.nachname = pNachname;
    }
    
    public String getNachname(){
        return this.nachname;
    }
    
    public void setGewicht(double pGewicht) {
        this.gewicht = pGewicht;
    }
    
    public double getGewicht(){
        return this.gewicht;
    }
    
    public void setGroesse(double pGroesse) {
        this.groesse = pGroesse;
    }
    
    public double getGroesse(){
        return this.groesse;
    }
    
    public double berechneBMI() {
        return this.gewicht / (this.groesse * this.groesse);
    }

    public String ermittleAuswertungBMI() {
        double bmi = this.berechneBMI();
        String auswertung;

        if(bmi<19) {
            auswertung = "Untergewicht";
        }
        else {
            if(bmi<=25) {
                auswertung = "Normalgewicht";
            }
            else {
                if(bmi<=29) {
                    auswertung = "leichtes Übergewicht";
                }
                else {
                    if(bmi<=39) {
                        auswertung = "Übergewicht";
                    }
                    else {
                        auswertung = "extremes Übergewicht";
                    }
                }
            }
        }

        return auswertung;
    }
}
Abb. 9-35: Klasse BodyMassIndex (Quellcode)
JAVA
package ui;

import app.Person;

public class Benutzerkonsole {

    private Person person;

    public Benutzerkonsole() {
        this.erfasseDaten();
        this.zeigeDaten();
    }
    public void erfasseDaten(){
        ConsoleReader consoleReader = new ConsoleReader();
        String vorname;
        String nachname;
        double gewicht;
        double groesse;
        
        
        System.out.println("Body Mass Index");
        System.out.println("-------------------------------");
        System.out.println("Bitte geben Sie Ihre Daten ein!\n");


        System.out.print("Vorname: ");
        vorname = consoleReader.nextString();

        System.out.print("Nachname: ");
        nachname = consoleReader.nextString();

        System.out.print("Gewicht (in kg): ");
        gewicht = consoleReader.nextDouble();

        System.out.print("Groesse (in m): ");
        groesse = consoleReader.nextDouble();

        person = new Person(vorname, nachname);
        person.setGewicht(gewicht);
        person.setGroesse(groesse);
    }

    public void zeigeDaten(){
        System.out.println("===============================");
        System.out.println(person.getVorname() + " " + person.getNachname());
        System.out.println("---------");
        System.out.println("Body Mass Index: " + person.berechneBMI());
        System.out.println("Auswertung: " + person.ermittleAuswertungBMI());
    }

}
Abb. 9-36: Benutzerkonsole (Quellcode)

Durch die Verschachtelung mehrere if-else-Anweisungen, wird der entsprechende Quellcode zunehmend unübersichtlich.

JAVA
if(punkte > 30) {
  bonus = 6;
}
else {
    if(punkte > 20) {
      bonus = 4;
    }
    else {
        if(punkte > 10) {
            bonus = 2;
        }
        else {
            bonus = 0;
        }
    }
}
Abb. 9-40: Verschachtelte Verzweigung mit  else { ...

Als Alternative bietet sich hier die Verwendung der else-if-Anweisung an. Der entsprechende Quellcode besitzt eine übersichtliche Struktur und ist leicht nachvollziehbar.

JAVA
if(punkte > 30) {
    bonus = 6;
}
else if(punkte > 20) {
    bonus = 4;
}
else if(punkte > 10) {
    bonus = 2;
}
else {
    bonus = 0;
}
Abb. 9-41: Verschachtelte Verzweigung mit  else if { ...
Merke: if-else- und else-if-Anweisung
Aufgabe

Aufgabe 9-9: else-if-Anweisung

Überarbeiten Sie die folgenden beiden Methoden so, dass anstelle der verschachtelten if-else-Anweisungen entsprechende else-if-Anweisungen zum Einsatz kommen.

  1. Methode  ermittleSchulnote(): String  der Klasse  Note  (Aufgabe 9-7)  Lösung
    JAVA
    public String ermittleSchulnote() {
        String schulnote;
        double schnittGesamt = this.berechneNotendurchschnitt();
        
        if(schnittGesamt>=12.5) {
            schulnote = "sehr gut";
        }
        else if(schnittGesamt>=9.5) {
            schulnote = "gut";
        }
        else if (schnittGesamt>=6.5) {
            schulnote = "befriedigend";
        }
        else if (schnittGesamt>=3.5) {
            schulnote = "ausreichend";
        }
        else if (schnittGesamt>=0.5) {
            schulnote = "mangelhaft";
        }
        else {
            schulnote = "ungenügend";
        }
        
        return schulnote;
    }
    Abb. 9-42: Die Methode ermittleSchulnote(): String der Klasse Note (Quellcode)
  2. Methode  ermittleAuswertungBMI(): String  der Klasse  BodyMassIndex  (Aufgabe 9-8)  Lösung
    JAVA
    public String ermittleAuswertungBMI() {
        double bmi = this.berechneBMI();
        String auswertung;
        
        if (bmi < 19) {
            auswertung = "Untergewicht";
        }
        else if (bmi <= 25) {
            auswertung = "Normalgewicht";
        }
        else if (bmi <= 29) {
            auswertung = "leichtes Übergewicht";
        }
        else if (bmi <= 39) {
            auswertung = "Übergewicht";
        }
        else {
            auswertung = "extremes Übergewicht";
        }
        
        return auswertung;
    }
    Abb. 9-43: Die Methode ermittleAuswertungBMI(): String der Klasse BodyMassIndex (Quellcode)