9.2 Alternative Verarbeitung

Aufgabe

Aufgabe 9-2: Szenario – „Plötzlicher Erdrutsch“

Das fünfte Szenario entspricht im Wesentlichen Aufgabe 9-1. Allerdings wurde im Feld (2; 3) die Mauer durch einen Weg ersetzt. Es ist weiterhin unklar, ob der auf dem Feld (3; 2) niedergegangene Steinschlag bereits beseitigt worden ist.

Das Ziel des Szenarios besteht darin, dass ein Roboter von Feld (1; 2) startend das Zielfeld (4; 1) auf dem kürzestmöglichen Weg erreicht.

img/9_8_Spielbrett_s5.jpg
Abb. 9-8: Spielbrett s5
Aufgabe
  1. Informieren Sie sich zunächst über die Alternative Verarbeitung (vgl. Infokasten).
  2. Erstellen Sie dann ein Struktogramm der Methode steuereRobi(). Lösung
    Lösung
    img/Abb_9_9_Aufgabe_9_2_Struktogramm.svg
    Abb. 9-9: Struktogramm der Methode steuereRobi()
  3. Erstellen Sie anschließend den Quellcode der Klasse Szenario. Lösung
    Lösung
    JAVA
    package welt;

    public class Szenario {

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

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

            }
            robi.gehVorwaerts();
        }
        
    }
    Abb. 9-10: Klasse Szenario (Quellcode)

Bei einer Alternative Verarbeitung wird eine vorgegebene Bedingung geprüft. Wird dabei festgestellt, dass die Bedingung erfüllt ist, wird ein für diesen Fall vorgesehener Programmabschnitt ausgeführt. Ergibt die Prüfung, dass die Bedingung nicht erfüllt ist, wird stattdessen ein alternativer Programmabschnitt ausgeführt.

Die Bedingung wird in Form eines booleschen Ausdrucks formuliert. Ein boolescher Ausdruck ist ein Ausdruck, dessen Auswertung einen Wert vom Typ boolean ergibt, das heißt, entweder true oder false.

img/Abb_9_11_Struktogramm_Verzweigung.svg
Abb. 9-11: Alternative Verarbeitung (Struktogramm)
JAVA
if( boolescher_Ausdruck ) {
    // Anweisungen, die ausgeführt werden sollen,
    // wenn boolescher_Ausdruck wahr ist.
}
else {
    // Anweisungen, die ausgeführt werden sollen,
    // wenn boolescher_Ausdruck falsch ist.
}
Abb. 9-12: Alternative Verarbeitung (Quellcode)
Merke: Alternative Verarbeitung
Aufgabe

Aufgabe 9-3: Szenario – „Steine auf- und abladen“

Ziel dieses Szenarios ist es, dass ein Roboter von Feld (1;3) startend auf dem kürzestmöglichen Weg das Zielfeld erreicht. Dabei ist unklar, ob das Feld (3;3) passierbar ist oder sich dort ein Steinhaufen befindet.

Erstellen Sie zunächst ein Struktogramm und anschließend den Quellcode der Methode steuereRobi().

img/9_13_Spielbrett_s6.jpg
Abb. 9-13: Spielbrett s6
img/Abb_9_14_UML_Roboter.svg
Abb. 9-14: Klasse Roboter (UML)
Hinweis: Auf- und Abladen von Steinen
  • Befindet sich auf dem Feld direkt vor dem Roboter ein Steinhaufen, kann der Roboter von dort mit Hilfe der Methode ladAuf() eine Einheit Steine aufladen. Werden weitere Steine aufgeladen, erhöht sich die Anzahl der aufgeladenen Steine bei jedem Aufladen um eine Einheit.
  • Beim Aufladen von Steinen wird die Größe des Steinhaufens um jeweils eine Einheit reduziert. Ist der Steinhaufen komplett aufgeladen, erscheint stattdessen ein Wegfeld. Die Standardgröße eines Steinhaufens beträgt eine Einheit.
  • Durch Aufruf der Methode ladAb() lädt der Roboter auf dem Feld direkt vor ihm eine Einheit von den zuvor aufgeladenen Steinen ab. Voraussetzung ist, dass das Feld vor ihm die Steine aufnehmen kann. Geeignet dafür sind zum Beispiel Wegfelder, Steinhaufen oder Erdlöcher.
  • Werden Steine auf einem Wegfeld abgeladen, erscheint dort ein Steinhaufen, der eine Einheit Steine umfasst. Werden die Steine auf einen bestehenden Steinhaufen gekippt, erhöht sich dessen Größe um eine Einheit. Werden Steine in ein Erdloch gekippt, reduziert sich dessen Tiefe um eine Einheit. Ist das Erdloch komplett aufgefüllt, verschwindet es und ein Wegfeld erscheint. Die Standardtiefe eines Erdlochs beträgt eine Einheit.
Aufgabe

Aufgabe 9-4: Vom Struktogramm zum Quellcode

Erstellen Sie auf Grundlage des folgenden UML-Klassendiagramms (vgl. Abb. 9-15) den entsprechenden Quellcode-Ausschnitt der Klasse Konto.

img/Abb_9_15_UML_Konto.svg
Abb. 9-15: Klasse Konto (UML)

Halten Sie sich bei der Programmierung der Methode +abheben(pBetrag: double): boolean an die Vorgaben des folgenden Struktogramms (vgl. Abb. 9-16).

img/Abb_9_16_Aufgabe_9_4a_Struktogramm.svg
Abb. 9-16: Struktogramm der Methode +abheben(pBetrag: double): boolean
Lösung
Lösung
JAVA
public class Konto {
    
    private double saldo;
    
    public boolean abheben(double pBetrag) {
        boolean ausgefuehrt;

        if(this.saldo >= pBetrag) {
            this.saldo = this.saldo - pBetrag;
            ausgefuehrt = true;
        }
        else {
            ausgefuehrt = false;
        }
        
        return ausgefuehrt;
    }
}
Abb. 9-17: Klasse Konto (Quellcode-Ausschnitt)
Variante
img/Abb_9_16_Aufgabe_9_4a_Struktogramm.svg
Abb. 9-18: Struktogramm der Methode +abheben(pBetrag: double): boolean
JAVA
public class Konto {
    
    private double saldo;
    
    public boolean abheben(double pBetrag) {
        boolean ausgefuehrt = false;

        if(this.saldo >= pBetrag) {
            this.saldo = this.saldo - pBetrag;
            ausgefuehrt = true;
        }
        
        return ausgefuehrt;
    }
}
Abb. 9-19: Klasse Konto (Quellcode-Ausschnitt)
Aufgabe

Aufgabe 9-5: Eintrittskarten

Ein Unternehmen verkauft Eintrittskarten für verschiedene Veranstaltungen.

Zu jeder Veranstaltung wird deren Titel und Eintrittspreis erfasst. Außerdem kann einer Veranstaltung ein Ermäßigungssatz zugewiesen werden. Berechtigte Personen, wie zum Beispiel Schüler oder Senioren, erhalten dann den entsprechenden prozentualen Nachlass auf den Eintrittspreis.

Jeder Eintrittskarte sind die entsprechende Veranstaltung und eine Sitzplatznummer zugeordnet. Des Weiteren ist vermerkt, ob es sich um eine ermäßigte Eintrittskarte handelt. Außerdem soll es möglich sein, unter Berücksichtigung einer etwaigen Ermäßigung, den Preis der Eintrittskarte zu berechnen.

Konsole
Bitte geben Sie die folgenden Veranstaltungsdaten ein:
Titel: Starlight
Eintrittspreis (in EUR): 69.0
Ermäßigungssatz (in %): 10

Bitte geben Sie die folgenden Daten der Eintrittskarte ein:
Sitzplatznummer: 520
Ermäßigung (true/false): true

-----------------------––––––––––––––----------------------
Preis der Eintrittskarte (in EUR): 62.1
Abb. 9-20: Konsole mit Benutzereingaben (Beispieldaten)
Aufgaben
  1. Entwickeln Sie ein geeignetes UML-Klassendiagramm. Lösung
    Lösung
    img/Abb_9_21_Aufgabe_9_5_UML.svg
    Abb. 9-21: Eintrittskarten (UML)

    Variante: Jeder Eintrittskarte ist stets eine Veranstaltung zugewiesen

    img/Abb_9_21_Aufgabe_9_5_UML_v2.svg
    Abb. 9-21b: Eintrittskarten (UML)
  2. Erstellen Sie den Quellcode der von Ihnen modellierten Klassen. Lösung
    Lösung
    JAVA
    package app;

    public class Veranstaltung {
        
        private String titel;
        private double eintrittspreis;
        private double ermaessigungssatz;
        
        public Veranstaltung() {

        }
                
        public Veranstaltung(String pTitel, double pEintrittspreis) {
            this.titel = pTitel;
            this.eintrittspreis = pEintrittspreis;
        }

        public String getTitel() {
            return titel;
        }

        public void setTitel(String pTitel) {
            this.titel = pTitel;
        }

        public double getEintrittspreis() {
            return eintrittspreis;
        }

        public void setEintrittspreis(double pEintrittspreis) {
            this.eintrittspreis = pEintrittspreis;
        }

        public double getErmaessigungssatz() {
            return ermaessigungssatz;
        }
        
        public void setErmaessigungssatz(double pErmaessigungssatz) {
            this.ermaessigungssatz = pErmaessigungssatz;
        }
        
    }
    Abb. 9-22: Klasse Veranstaltung (Quellcode)
    JAVA
    package app;

    public class Eintrittskarte {
        
        private Veranstaltung veranstaltung;
        private int sitzplatznummer;
        private boolean ermaessigt;
        
        public Eintrittskarte() {

        }
        
        public Eintrittskarte(Veranstaltung pVeranstaltung, int pSitzplatznummer) {
            this.veranstaltung = pVeranstaltung;
            this.sitzplatznummer = pSitzplatznummer;
        }

        public Veranstaltung getVeranstaltung() {
            return veranstaltung;
        }

        public void setVeranstaltung(Veranstaltung pVeranstaltung) {
            this.veranstaltung = pVeranstaltung;
        }

        public int getSitzplatznummer() {
            return sitzplatznummer;
        }

        public void setSitzplatznummer(int pSitzplatznummer) {
            this.sitzplatznummer = pSitzplatznummer;
        }

        public boolean isErmaessigt() {
            return ermaessigt;
        }

        public void setErmaessigt(boolean pErmaessigt) {
            this.ermaessigt = pErmaessigt;
        }

        public double berechneEndpreis() {
            double preis;
            double ermaessigungssatz;
            double endpreis;
            
            preis = veranstaltung.getEintrittspreis();
            ermaessigungssatz = veranstaltung.getErmaessigungssatz();
            
            if(ermaessigt) {
                endpreis = preis - preis * ermaessigungssatz/100;
            }
            else {
                endpreis = preis;
            }
            
            return endpreis;
        }

    }
    Abb. 9-23: Klasse Eintrittskarte (Quellcode)
    JAVA
    package ui;

    import app.Eintrittskarte;
    import app.Veranstaltung;

    public class Benutzerkonsole {
     
        private Veranstaltung veranstaltung;
        private Eintrittskarte eintrittskarte;
        
        public Benutzerkonsole (){
            this.erfasseVeranstaltung();
            this.erfasseEintrittskarte();
            this.zeigeEndpreis();
        }
        
        private void erfasseVeranstaltung() {
            ConsoleReader consoleReader = new ConsoleReader();
            String titel;
            double eintrittspreis;
            double ermaessigungssatz;

            
            System.out.println("Bitte geben Sie die folgenden Veranstaltungsdaten ein:");
            System.out.print("Titel: ");
            titel = consoleReader.nextString();
            System.out.print("Eintrittspreis (in EUR): ");
            eintrittspreis= consoleReader.nextDouble();
            System.out.print("Ermäßigungssatz (in %): ");
            ermaessigungssatz= consoleReader.nextDouble();
            
            veranstaltung = new Veranstaltung(titel, eintrittspreis);
            veranstaltung.setErmaessigungssatz(ermaessigungssatz);
        }
        
        private void erfasseEintrittskarte() {
            ConsoleReader consoleReader = new ConsoleReader();
            int sitzplatznummer;
            boolean ermaessigt;
            
            System.out.println("\nBitte geben Sie die folgenden Daten der Eintrittskarte ein:");
            System.out.print("Sitzplatznummer: ");
            sitzplatznummer = consoleReader.nextInt();
            System.out.print("Ermäßigung (true/false): ");
            ermaessigt = consoleReader.nextBoolean();
            
            eintrittskarte = new Eintrittskarte(veranstaltung, sitzplatznummer);
            eintrittskarte.setErmaessigt(ermaessigt);
        }

        private void zeigeEndpreis(){
            System.out.println("\n-----------------------––––––––––––––----------------------");
            System.out.println("Preis der Eintrittskarte (in EUR): " + eintrittskarte.berechneEndpreis());
        }

    }
    Abb. 9-24: Klasse Benutzerkonsole (Quellcode)

    Variante: Jeder Eintrittskarte ist stets eine Veranstaltung zugewiesen.

    JAVA
    package app;

    public class Eintrittskarte {
        
        private Veranstaltung veranstaltung;
        private int sitzplatznummer;
        private boolean ermaessigt;
        
        public Eintrittskarte(Veranstaltung pVeranstaltung) {
            this.veranstaltung = pVeranstaltung;
        }

        public Eintrittskarte(Veranstaltung pVeranstaltung, int pSitzplatznummer) {
            this.veranstaltung = pVeranstaltung;
            this.sitzplatznummer = pSitzplatznummer;
        }

        //...
    }
    Abb. 9-24b: Klasse Eintrittskarte (Quellcode)