studyklar
GdI 1 · Übungsblatt 6 · Aufgabe 2

Klausurzulassung aus vier Testaten: if mit &&

Vier Testate, zwei Hürden: Wer in Testat 1 und 2 zusammen und in Testat 3 und 4 zusammen je mindestens die Hälfte der Punkte hat, darf in die Klausur. Das Programm liest die Punkte ein, prüft beide Hürden mit einer if-Abfrage und sagt im Fall „nicht zugelassen“, wo wie viele Punkte fehlen. Rechts steht das Programm, die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 6.2

Schreiben Sie ein Java-Programm A6_2, welches ermittelt, ob die Zulassungsvoraussetzung für eine fiktive Klausur erfüllt ist, gemäß der folgenden Spezifikation.

  • Das Programm liest zunächst die in vier separaten Testaten erreichbaren Punktzahlen als positive ganze Zahlen max_1, max_2, max_3 und max_4 ein.
  • Das Programm liest die in den vier Testaten erreichten Punktzahlen als positive ganze Zahlen p1, p2, p3 und p4 ein (es gibt keine halben Punke).
  • Das Programm prüft, ob die Zulassungsvoraussetzung erfüllt ist, welche lautet: Zugelassen wird, wer aus den Testaten 1 und 2 zusammengerechnet mindestens die Hälfte der Punkte UND aus den Testaten 3 und 4 zusammengerechnet ebenfalls mindestens die Hälfte der Punkte erreicht hat, und gibt das Ergebnis in angemessener Form aus.
  • Optional: Erweitern Sie das Programm nach eigenen Vorstellungen derart, dass es im Falle nicht erfüllter Zulassungsvoraussetzung am Ende genauer informiert, woran es gelegen hat.

Gegeben sind für jedes der vier Testate zwei Zahlen: wie viele Punkte man erreichen kann (max_1 bis max_4) und wie viele man erreicht hat (p1 bis p4). Gesucht ist ein Programm, das daraus „zugelassen“ oder „nicht zugelassen“ ausgibt. Die Erweiterung ist freiwillig; wir bauen sie ein: Bei „nicht zugelassen“ nennt das Programm die fehlenden Punkte.

Die Aufgabe gibt keine Zahlen vor. Für die Tests legen wir selbst fest: erreichbar sind 20, 25, 30 und 30 Punkte.

Merke: Zwei Bedingungen, die beide gelten müssen, verbindet Java mit && (UND). Gerechnet wird mit ganzen Zahlen, also aufpassen, wo eine Hälfte entsteht.
  1. Die Zulassungsregel als zwei Ungleichungen schreiben.
  2. Die acht Punktzahlen einlesen.
  3. Je Gruppe die Punkte zusammenzählen.
  4. Je Gruppe die nötige Punktzahl bestimmen.
  5. Den Zwischenstand ausgeben.
  6. Mit if und && entscheiden.
  7. Bei „nicht zugelassen“ die fehlenden Punkte nennen.
  8. Mit vier Testfällen ausführen.

Die Regel als zwei Ungleichungen

Zugelassen, wenn beide Ungleichungen stimmen
p1+p2  ≥  12 (max1+max2)UNDp3+p4  ≥  12 (max3+max4)p_1 + p_2 \;\ge\; \tfrac{1}{2}\,(\mathit{max}_1 + \mathit{max}_2) \quad\text{UND}\quad p_3 + p_4 \;\ge\; \tfrac{1}{2}\,(\mathit{max}_3 + \mathit{max}_4)

Die Regel hat zwei Teile. Erstens: Testat 1 und 2 zusammengerechnet, mindestens die Hälfte. Zweitens: Testat 3 und 4 zusammengerechnet, ebenfalls mindestens die Hälfte. „Zusammengerechnet“ heißt: Man vergleicht die Summe der erreichten Punkte mit der Summe der erreichbaren. Ein schwaches Testat 1 kann also ein starkes Testat 2 ausgleichen.

„Mindestens“ heißt: genau die Hälfte reicht schon, darum ≥\ge (größer oder gleich). Das UND heißt: Beide Ungleichungen müssen stimmen. Fällt eine durch, ist man nicht zugelassen.

Acht Punktzahlen einlesen

public class A6_2 {     public static void main(String[] args) {        Out.print("Erreichbare Punkte in Testat 1 bis 4: ");        int max_1 = In.readInt();        int max_2 = In.readInt();        int max_3 = In.readInt();        int max_4 = In.readInt();        Out.print("Erreichte Punkte in Testat 1 bis 4: ");        int p1 = In.readInt();        int p2 = In.readInt();        int p3 = In.readInt();        int p4 = In.readInt();
    }}

Erst die vier erreichbaren, dann die vier erreichten Punktzahlen, genau in der Reihenfolge der Aufgabe. Punkte sind ganze Zahlen (keine halben Punkte), darum int und In.readInt(). Die Namen max_1 bis max_4 und p1 bis p4 stammen aus der Aufgabe.

Jedes In.readInt() holt die nächste Zahl der Eingabe. Man kann alle vier Zahlen in eine Zeile tippen, getrennt durch Leerzeichen: 20 25 30 30. Darum reicht eine Frage je Vierergruppe.

Aus Skript 4, Folien 4-30, 4-33 und 4-34 („Ein-/Ausgabe“): Die Kursklassen In und Out lesen und schreiben auf der Konsole. In.readInt() liest eine ganze Zahl, Out.print(x) gibt x aus und bleibt in der Zeile, Out.println(x) beginnt danach eine neue Zeile.In und Out sind Hilfsklassen der Vorlesung, keine Klassen aus Java selbst: In.java und Out.java müssen im selben Ordner liegen wie das Programm.
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.

Abbildung 1

public class A6_2 {     public static void main(String[] args) {        Out.print("Erreichbare Punkte in Testat 1 bis 4: ");        int max_1 = In.readInt();        int max_2 = In.readInt();        int max_3 = In.readInt();        int max_4 = In.readInt();        Out.print("Erreichte Punkte in Testat 1 bis 4: ");        int p1 = In.readInt();        int p2 = In.readInt();        int p3 = In.readInt();        int p4 = In.readInt();         int max12 = max_1 + max_2;        int max34 = max_3 + max_4;        int p12 = p1 + p2;        int p34 = p3 + p4;        int noetig12 = (max12 + 1) / 2;        int noetig34 = (max34 + 1) / 2;         Out.println("Testate 1 und 2: " + p12 + " von " + max12 + " Punkten, nötig " + noetig12);        Out.println("Testate 3 und 4: " + p34 + " von " + max34 + " Punkten, nötig " + noetig34);         if (p12 >= noetig12 && p34 >= noetig34) {            Out.println("Zulassungsvoraussetzung erfüllt: zur Klausur zugelassen.");        } else {            Out.println("Zulassungsvoraussetzung nicht erfüllt: nicht zugelassen.");            if (p12 < noetig12) {                Out.println("Fehlende Punkte in Testat 1 und 2: " + (noetig12 - p12));            }            if (p34 < noetig34) {                Out.println("Fehlende Punkte in Testat 3 und 4: " + (noetig34 - p34));            }        }    }}
LegendeHervorgehoben: nur das Gerüst der Klasse A6_2. Die Schritte füllen es Teil für Teil.