studyklar
GdI 2 · Übungsblatt 1 · Aufgabe 4

Online-Shop: Einkaufsregeln als boolesche Ausdrücke

Ein Online-Shop hat vier Regeln: wer einkaufen darf und wer Rabatt bekommt. Das Programm übersetzt sie in Wahrheitswerte, ganz ohne if. Danach wird es mit gezielt gewählten Eingaben getestet. Rechts steht das fertige Programm, die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 4

In einem Online-Shop gelten die folgenden Regeln:

  • Wenn man unter 16 ist, kann man gar nicht einkaufen.
  • Wenn man mindestens 16 aber noch nicht 18 ist, oder wenn man mindestens 65 ist, erhält man Rabatt – es sei denn, es existiert noch ein offener Rechnungsbetrag von über 50 Euro.
  • Ist die Bezeichnung der Ware „Tierfutter“, so gibt es in keinem Fall Rabatt.
  • Ist der offene Rechnungsbetrag jedoch über 500 Euro, so kann man gar nicht einkaufen.

a) Schreiben Sie ein Programm, bei dem man Alter (als ganze Zahl), Höhe des offenen Rechnungsbetrags (als ganze Zahl) und die Bezeichnung der Ware eingibt. Anschließend soll ausgegeben werden, ob die Person einkaufsberechtigt ist und ob sie einen Rabatt bekommt. Es soll jeweils einfach der boolesche Wert (Wahrheitswert) ausgegeben werden (also „true“ oder „false“).

Anleitung: Ihr Programm soll keine „if“-Abfragen enthalten. Nutzen Sie Variablen vom Typ „boolean“ um die Ergebnisse von Vergleichen zu speichern (z. B. „boolean b = (x > 5)“) und miteinander zu verknüpfen (z. B. „boolean b = b1 && b2“). In den Vorlesungsfolien finden Sie Übersichten der Vergleichsoperatoren (z. B. >, >=, ==) und der logischen Operatoren (z. B. &&, ||, !) sowie die Vorrangregeln der Operatoren (z. B. „Punkt vor Strich“, entsprechend „* vor +“, „&& vor ||“ usw.). Verwenden Sie ggf. Klammern um deutlich zu machen, was zusammengehört und was in welcher Reihenfolge ausgeführt wird.

b) Testen Sie Ihr Programm mit mindestens 5 sinnvoll gewählten, möglichst unterschiedlichen Kombinationen der eingegebenen Werte und prüfen Sie, ob das richtige Ergebnis ausgegeben wird.

Ein Wahrheitswert (Typ boolean) kann nur true (wahr) oder false (falsch) sein. Ein Vergleich wie alter >= 16 liefert so einen Wert. Mehrere Wahrheitswerte verknüpft man mit && (und), || (oder) und ! (nicht).

Merke: Jede Regel wird ein eigener boolean mit sprechendem Namen. Erst am Ende verknüpft man sie. So bleibt jede Zeile kurz und einzeln prüfbar.
  1. Teil a): einlesen, jede Regel als Wahrheitswert, verknüpfen, ausgeben.
  2. Teil b): Testfälle so wählen, dass jede Regel einmal entscheidet.

Alter, Betrag und Ware einlesen

        System.out.print("Alter: ");        int alter = scanner.nextInt();        System.out.print("Offener Rechnungsbetrag: ");        int offenerBetrag = scanner.nextInt();        scanner.nextLine();        System.out.print("Bezeichnung der Ware: ");        String ware = scanner.nextLine();

Alter und offener Betrag sind ganze Zahlen (nextInt). Die Ware ist ein Text, Typ String. nextLine() liest eine ganze Zeile als Text, auch mit Leerzeichen („Futter für Katzen“).

Aus Aufgabe 1 („Lohnrechner“) und Aufgabe 2 („Minimum dreier Zahlen mit Math.min“): Der Scanner (import java.util.Scanner;, new Scanner(System.in)) liest von der Tastatur, nextInt() eine ganze Zahl. Erst mit System.out.print fragen, dann einlesen.

Warum das zusätzliche nextLine nötig ist

Probelauf ohne Zeile 12 (falsch):

Alter: 17
Offener Rechnungsbetrag: 0
Bezeichnung der Ware: Einkaufsberechtigt: true
Rabatt: true

Tippt man 0 und Enter, nimmt nextInt nur die 0. Das Enter bleibt in der Eingabe liegen. Das nächste nextLine sieht sofort ein Zeilenende und liefert einen leeren Text, ohne auf die Ware zu warten.

Auch nach dem Alter bleibt ein Enter liegen. Das stört aber nicht: nextInt überspringt Leerzeichen und Enter, bevor es die Zahl liest. nextLine überspringt nichts, es liest bis zum nächsten Enter. Deshalb räumt man das Enter nur vor einem nextLine weg; das tut Zeile 12.

Ohne Zeile 12: Eine 17-Jährige will Tierfutter kaufen, kommt aber gar nicht dazu, es einzutippen. Das Programm liest einen leeren Text als Ware, rechnet sofort und gibt Rabatt aus.

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.

Das Programm OnlineShop

Regeln als boolean, ohne if

Abbildung 1Das Programm OnlineShop

Regeln als boolean, ohne if

import java.util.Scanner; public class OnlineShop {     public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);         System.out.print("Alter: ");        int alter = scanner.nextInt();        System.out.print("Offener Rechnungsbetrag: ");        int offenerBetrag = scanner.nextInt();        scanner.nextLine();        System.out.print("Bezeichnung der Ware: ");        String ware = scanner.nextLine();         boolean einkaufsberechtigt =                (alter >= 16) && (offenerBetrag <= 500);         boolean jugendlich = (alter >= 16) && (alter < 18);        boolean senior = alter >= 65;        boolean rabattAlter = jugendlich || senior;        boolean wenigOffen = offenerBetrag <= 50;        boolean keinTierfutter = !ware.equals("Tierfutter");         boolean rabatt = rabattAlter && wenigOffen                && keinTierfutter;         System.out.println("Einkaufsberechtigt: " + einkaufsberechtigt);        System.out.println("Rabatt: " + rabatt);    }}
LegendeDas ganze Programm.