studyklar
GdI 2 · Übungsblatt 3 · Aufgabe 5

Kinosaal: Plätze reservieren mit einem zweidimensionalen Array

Ein kleines Buchungsprogramm für ein Kino. Es zeigt den Saalplan, nimmt eine Reservierung an und zeigt den Plan danach erneut. Neu ist ein zweidimensionales Array: ein Array, dessen Plätze selbst Arrays sind, hier eins je Reihe. Rechts steht das fertige Programm, die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 5

Es sollen Platzreservierungen für einen Kinosaal vorgenommen werden, der fünf Reihen mit je 10 Plätzen enthält. Es soll ein Programm geschrieben werden, das auf der Konsole einen Saalplan in der folgenden Form ausgibt:

   1  2  3  4  5  6  7  8  9  10 
1  -  -  -  -  -  -  -  -  -  - 
2  -  -  -  -  -  -  -  -  -  - 
3  -  -  -  -  -  -  -  -  -  - 
4  -  -  -  -  -  -  -  -  -  - 
5  -  -  -  -  -  -  -  -  -  - 

Bei unbesetzten Plätzen ist ein Minus eingetragen. Um einen Platz zu reservieren, muss man zunächst die Nummer der Reihe und anschließend die Nummer des Platzes eingeben. Ist der Platz bereits reserviert, erhält man einen entsprechenden Hinweis. Ansonsten wird die Reservierung für den gewünschten Platz vorgenommen.

Nun wird der Saalplan erneut angezeigt, wobei für jeden reservierten Platz ein „x“ eingetragen ist, und man kann eine weitere Reservierung durchführen.

Der Saal hat 5 Reihen mit je 10 Plätzen, zusammen 50. Für jeden Platz muss das Programm wissen: frei oder besetzt. Es zeigt den Plan mit „-“ für frei und „x“ für besetzt. Dann fragt es nach Reihe und Platz. Ist der Platz schon besetzt, kommt ein Hinweis, sonst wird er reserviert. Danach beginnt alles von vorn.

Die Aufgabe sagt nicht, wie das Programm endet. Wie die Musterlösung beenden wir es mit der Reihe 0.

Merke: Für eine Tabelle aus Reihen und Spalten nimmt man ein zweidimensionales Array. Der Zugriff braucht zwei Nummern: besetzteSitze[reihe][platz].
  1. Ein Array, das sich jeden Platz merkt.
  2. Die Nummern so wählen, dass sie bei 1 beginnen.
  3. Eine Endlosschleife für Runde um Runde.
  4. Den Saalplan ausgeben: Kopfzeile, dann die Reihen.
  5. Reihe und Platz einlesen, prüfen, reservieren.
  6. Ein Probelauf.

Ein zweidimensionales Array aus boolean

        boolean[][] besetzteSitze = new boolean[6][11];

Je Platz gibt es nur zwei Zustände: besetzt oder frei. Dafür passt der Typ boolean mit den Werten true (besetzt) und false (frei).

boolean[][] mit zwei eckigen Klammern ist ein Array aus Arrays. Das äußere Array hält die Reihen, jede Reihe ist ein Array aus Plätzen. Ein neu angelegtes boolean-Array steht überall auf false. Am Anfang ist also jeder Platz frei, ohne dass wir etwas tun müssen.

Aus Vorlesung 3, Folie 16 („Leeres mehrdimensionales Array“): new int[3][2] legt 3 innere Arrays mit je 2 Plätzen an. Beim Zugriff nennt die erste Nummer das innere Array, die zweite den Platz darin.

Warum 6 und 11 statt 5 und 10?

        // Arrays in jede Richtung um 1 größer als der Saal, daher können wir mit        // Reihe und Platz "1" statt mit Reihe und Platz "0" beginnen.        boolean[][] besetzteSitze = new boolean[6][11];
GrößeNummernbenutzt
Reihen60 bis 51 bis 5
Plätze je Reihe110 bis 101 bis 10

Ein Array zählt ab 0. Mit new boolean[5][10] hießen die Reihen 0 bis 4. Der Benutzer tippt aber Reihe 1 bis 5. Man müsste jede Eingabe um 1 verkleinern.

Die Musterlösung macht das Array darum in jede Richtung um 1 größer. Dann gibt es Reihe 0 bis 5 und Platz 0 bis 10. Reihe 0 und Platz 0 bleiben ungenutzt. Dafür gilt: Reihe 2, Platz 5 ist besetzteSitze[2][5], genau wie eingetippt.

Noch 7 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 Kino

Saalplan und Reservierung

Abbildung 1Das Programm Kino

Saalplan und Reservierung

import java.util.Scanner; public class Kino {     public static void main(String[] args) {         Scanner scanner = new Scanner(System.in);         // Arrays in jede Richtung um 1 größer als der Saal, daher können wir mit        // Reihe und Platz "1" statt mit Reihe und Platz "0" beginnen.        boolean[][] besetzteSitze = new boolean[6][11];         while (true) {             // Platznummern als Überschriften            System.out.print("  ");            for (int sitznr = 1; sitznr <= 10; sitznr++) {                System.out.print(" " + sitznr + " ");            }            System.out.println();             for (int reihe = 1; reihe <= 5; reihe++) {                System.out.print(reihe + " "); // Reihennummer ausgeben                for (int sitznr = 1; sitznr <= 10; sitznr++) {                    String zeichen = " - ";                    if (besetzteSitze[reihe][sitznr]) {                        zeichen = " x ";                    }                    System.out.print(zeichen);                }                System.out.println();            }            System.out.println();             System.out.print("Wähle Reihe (oder 0 zum Beenden): ");            int reihe = scanner.nextInt();            if (reihe == 0) {                break;            }            System.out.print("Wähle Platz: ");            int platz = scanner.nextInt();            if (besetzteSitze[reihe][platz]) {                System.out.println("Der gewünschte Platz ist bereits besetzt.\n");            } else {                besetzteSitze[reihe][platz] = true;                System.out.println("Reservierung durchgeführt.\n");            }        }    }}
LegendeDas ganze Programm.