studyklar
GdI 2 · Übungsblatt 4 · Aufgabe 2

Lager für Quietsche-Enten: Bestand mit Methoden verwalten

Ein Online-Shop für Quietsche-Enten braucht eine Bestandsverwaltung: Enten kommen ins Lager, Enten gehen hinaus. Das Programm hat dafür ein Menü. Die Arbeit erledigen kleine Methoden, also benannte Programmstücke, die main aufruft. Rechts steht das fertige Programm, die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 2

Für einen Online-Shop, der Quietsche-Enten verkauft, soll eine Bestandsverwaltung programmiert werden. Man soll erfassen können, wenn neue Enten ins Lager gebracht werden und wenn Enten aus dem Lager entnommen werden. Dabei soll auch die jeweilige hinzugefügte oder entfernte Menge eingegeben werden.

Hierfür wurde die Klasse shop.Lager erstellt. Fügen Sie die fehlenden Attribute, Methoden und Methodenaufrufe hinzu.

Gibt man eine negative Menge ein, so soll das Programm darauf hinweisen, und man kann die Eingabe wiederholen.

Versucht man, mehr Enten zu entnehmen als vorhanden sind, so soll das Programm darauf hinweisen und die Buchung nicht durchführen.

Die Klasse shop.Lager ist vorgegeben, liegt uns aber nicht vor. Den Rahmen (Zeilen 1 bis 16 und 27 bis 29: Menü in einer Schleife, Ende mit Q) haben wir passend zur Musterlösung selbst geschrieben; Menütext und Buchstaben sind unsere Wahl. Neu zu schreiben sind Zeile 7, die Zeilen 17 bis 26 und die vier Methoden ab Zeile 31.

Merke: Was mehrere Methoden brauchen, gehört nicht in eine lokale Variable von main, sondern in ein Attribut der Klasse. Der Lagerbestand ist so ein Wert.
  1. Den Rahmen verstehen.
  2. Den Bestand als Attribut anlegen.
  3. Die Auswahl auf Methoden verteilen.
  4. Die Methoden schreiben: ausgeben, Menge fragen, einbuchen, entnehmen.
  5. Ein Probelauf mit allen Fällen.

Der Rahmen: ein Menü in einer Schleife

    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        String auswahl = "";         while (!auswahl.equals("Q")) {            System.out.print("(B)estand, (H)inzufügen, (E)ntnehmen, (Q)uit: ");            auswahl = scanner.nextLine();
        }        System.out.println("Programm beendet.");

Das Programm zeigt immer wieder ein Menü und liest die Auswahl als Text. B steht für Bestand, H für Hinzufügen, E für Entnehmen, Q für Quit (Beenden). Die while-Schleife läuft, solange die Auswahl nicht „Q“ ist; das ! dreht die Bedingung um.

Damit die Bedingung schon beim ersten Mal geprüft werden kann, beginnt auswahl als leerer Text. Die Lücke für unseren Code liegt in der Schleife, unter dem Einlesen.

Aus Vorlesung 2, Folie 22 („While-Schleife“): while (Bedingung) { … } wiederholt den Block, solange die Bedingung true ist. Ist sie gleich zu Anfang falsch, läuft er kein Mal.

Der Bestand als statisches Attribut

    private static int lagerbestand = 0;

Den Bestand brauchen mehrere Methoden: Ausgeben liest ihn, Einbuchen und Entnehmen ändern ihn. Eine Variable in main sähen die anderen Methoden nicht. Darum steht er als Attribut direkt in der Klasse, außerhalb jeder Methode.

private heißt: nur diese Klasse greift darauf zu. static heißt: Er gehört zur Klasse selbst, wie die Methoden. Am Anfang liegen 0 Enten im Lager.

Aus Vorlesung 4, Folie 12 („Attribute“): Ein Attribut wird direkt in der Klasse deklariert, außerhalb von main. Alle Methoden der Klasse können es lesen und ändern.
Noch 8 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Die Klasse shop.Lager

neu: Zeile 7, 17–26, 31–61

Abbildung 1Die Klasse shop.Lager

neu: Zeile 7, 17–26, 31–61

package shop; import java.util.Scanner; public class Lager {     private static int lagerbestand = 0;     public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        String auswahl = "";         while (!auswahl.equals("Q")) {            System.out.print("(B)estand, (H)inzufügen, (E)ntnehmen, (Q)uit: ");            auswahl = scanner.nextLine();             if (auswahl.equals("B")) {                gibBestandAus();            } else if (auswahl.equals("H") || auswahl.equals("E")) {                int menge = frageNachMenge(scanner);                if (auswahl.equals("H")) {                    bucheZu(menge);                } else {                    bucheAb(menge);                }            }        }        System.out.println("Programm beendet.");    }     public static void gibBestandAus() {        System.out.println("Aktueller Bestand: " + lagerbestand);    }     public static int frageNachMenge(Scanner scanner) {        System.out.print("Menge: ");        int menge = 0;        while (menge <= 0) {            menge = scanner.nextInt();            if (menge <= 0) {                System.out.println("Bitte positive Menge eingeben.");            }        }        scanner.nextLine();        return menge;    }     public static void bucheZu(int menge) {        lagerbestand += menge;        System.out.println(menge + " Enten hinzugefügt.");    }     public static void bucheAb(int menge) {        if (lagerbestand - menge < 0) {            System.out.println("Die Entnahme wurde nicht gebucht, "                    + "da so viel nicht auf Lager ist.");        } else {            lagerbestand -= menge;            System.out.println(menge + " Enten entnommen.");        }    }}
LegendeDas ganze Programm.