8.2 Die Klasse Benutzerkonsole
Um Benutzereingaben mit möglichst wenig Aufwand erfassen zu können, verzichten wir zunächst auf eine grafische Benutzeroberfläche. Stattdessen greifen wir auf die Konsole zurück, die wir bereits zur Ausgabe von Daten eingesetzt haben.
Aufgabe 8-1: Benutzereingaben über die Konsole
Ziel ist ein einfaches Programm, das den Benutzer dabei unterstützt, die Daten eines neuen Buches zu erfassen.
Abb. 8-2 zeigt beispielhaft die Erfassung der Daten. Die Benutzereingaben sind in der Abbildung kursiv dargestellt, dies ist im Programm jedoch nicht notwendig. Die abschließende Ausgabe dient dazu festzustellen, ob alle eingegebenen Daten vom Programm richtig verarbeitet worden sind.
Anforderungen an die UI-Klasse Benutzerkonsole
Alle Funktionalitäten, die die Interaktion mit dem Benutzer betreffen, bündeln wir in der Klasse Benutzerkonsole
(UI-Klasse). In dieser Aufgabe werden an die Benutzerkonsole die folgenden Anforderungen gestellt:
-
Zunächst soll sie dem Benutzer die Möglichkeit geben, die relevanten Daten eines neuen Buches zu erfassen. Auf Grundlage dieser Daten soll die Benutzerkonsole dann ein neues Objekt der Klasse
Buch
erzeugen. Alle hierfür notwendigen Anweisungen werden in der privaten MethodeerfasseBuchdaten()
zusammengefasst. -
Anschließend soll sie alle Daten des eben erzeugten Buches abfragen und zu Kontrollzwecken auf der Konsole ausgeben. Die entsprechenden Anweisungen werden in der privaten Methode
zeigeBuchdaten()
zusammengefasst. -
Nach dem Erzeugen eines Objekts der Klasse Benutzerkonsole soll dieses automatisch die Datenerfassung starten und anschließend die erfassten Daten anzeigen. Hierzu werden innerhalb des Konstruktors
Benutzerkonsole()
die entsprechenden Methoden,erfasseBuchdaten()
undzeigeBuchdaten()
, aufgerufen.
Vorbereitung
- Legen Sie in Eclipse ein neues Java-Projekt 08-1_Benutzerkonsole_Buch an.
-
Erstellen Sie ein Paket namens
app
und kopieren Sie die FachklasseBuch
, die wir in Aufgabe 5-5 erstellt haben, in das Paket. -
Legen Sie das Paket
ui
an und kopieren die KlasseConsoleReader
in das Paket.
Quellcode der UI-Klasse Benutzerkonsole
-
Erstellen Sie im Paket
ui
die KlasseBenutzerkonsole
. Halten Sie sich dabei an die Vorgaben des UML-Klassendiagramms (vgl. Abb. 8-2) und berücksichtigen Sie die genannten Anforderungen.Erläuterungen
-
Da sich die Klasse
Benutzerkonsole
in einem Paket befindet, muss zu Beginn des Quellcodes das Paket, falls es sich um ein Unterpaket handelt auch alle übergeordneten Pakete, bekannt gegeben werden. Dies erreichen wir mir der Anweisungpackage ui;
. -
Da sich die Klasse
Buch
in einem anderen Paket befindet, müssen wir sie zunächst mit Hilfe der Anweisungimport app.Buch;
importieren, bevor wir sie verwenden dürfen. Dieimport
-Anweisung muss im Quellcode unmittelbar vor dem Beginn der Klassendefinition stehen. -
Die Methoden
erfasseBuchdaten()
undzeigeBuchdaten()
enthalten zunächst noch keine Anweisungen.
-
Da sich die Klasse
-
Vervollständigen Sie nun den Java-Quellcode der Methode
erfasseBuchdaten()
. Lesen Sie dazu zunächst den Abschnitt „Merke: Benutzereingaben mit Hilfe der Klasse ConsoleReader“.Schritte
- Wir benötigen ein Objekt der Klasse ConsoleReader, mit dessen Hilfe wir die Benutzereingaben von der Konsole einlesen können. Außerdem benötigen wir für jede Eingabe eine lokale Variable, in der wir diese zwischenspeichern können. Anzeigen
- Der Benutzer soll durch entsprechende Textausgaben auf der Konsole informiert werden, welche Daten er jeweils eingeben soll. Gestalten Sie die Beschriftungen entsprechend Abb. 8-2. Anzeigen
-
Durch den Aufruf einer geeigneten Methode des Objekts
consoleReader
(vgl. Abb. 8-1) soll die jeweilige Benutzereingabe eingelesen werden. Als Antwort gibt diese Methode den Eingabewert zurück, den wir in der für ihn vorgesehenen lokalen Variable zwischengespeichern. Anzeigen -
Die in lokalen Variablen zwischengespeicherten Werte werden dem neu erzeugten Objekt
buch
zugewiesen. Anzeigen
-
Vervollständigen Sie zum Abschluss den Java-Quellcode der Methode
LösungzeigeBuchdaten()
. Dabei sollen alle Daten des neu erzeugten Buch-Objektes abgefragt und zu Kontrollzwecken mit einer kurzen Beschreibung auf der Konsole ausgegeben werden (vgl. Abb. 8-2).
Aufgabe 8-2: Halbjahresleistung
Nehmen Sie vereinfachend an, in jedem Fach der Jahrgangsstufe 1 und 2 werden pro Halbjahr genau zwei Klassenarbeiten geschrieben und genau eine Note für die mündliche Leistung vergeben. Dabei handelt es sich stets um ganze Noten. Bei der Berechnung des Notendurchschnitts wird der Schnitt der schriftlichen Leistungen dreifach und die mündliche Note einfach gewichtet.
Ziel ist eine Java-Applikation, mit deren Hilfe die Halbjahresleistung eines Schülers erfasst werden kann. Anschließend soll das Programm daraus den Notendurchschnitt berechnen und anzeigen. Die Ein- und Ausgabe der Daten soll über die Konsole erfolgen (vgl. Abb. 8-9).
Aus Vereinfachungsgründen werden in dem Programm ausschließlich die Noten erfasst, nicht jedoch das betroffene Fach beziehungsweise der jeweilige Schüler.
==================
Bitte geben Sie die folgenden Noten ein:
----------------------------------------
1. Klassenarbeit: 10
2. Klassenarbeit: 11
Mündliche Note: 12
----------------------------------------
Notendurchschnitt: 10.875
Aufgaben
-
Entwickeln Sie ein geeignetes UML-Klassendiagramm.
Lösung
Abb. 8-10: Benutzereingaben über die Konsole (Halbjahresleistung) -
Erstellen Sie den Quellcode der von Ihnen modellierten Klassen.
Lösung
JAVApackage app;
public class Halbjahresleistung {
private int noteKlArb1;
private int noteKlArb2;
private int noteMuendlich;
public void setNoteKlArb1(int pNoteKlArb1) {
this.noteKlArb1 = pNoteKlArb1;
}
public int getNoteKlArb1() {
return this.noteKlArb1;
}
public void setNoteKlArb2(int pNoteKlArb2) {
this.noteKlArb2 = pNoteKlArb2;
}
public int getNoteKlArb2() {
return this.noteKlArb2;
}
public void setNoteMuendlich(int pNoteMuendl) {
this.noteMuendlich = pNoteMuendl;
}
public int getNoteMuendlich() {
return this.noteMuendlich;
}
public double berechneNotendurchschnitt() {
double schnittKlArb;
schnittKlArb = (noteKlArb1 + noteKlArb2) / 2.0;
return (3 * schnittKlArb + noteMuendlich) / 4;
}
}Abb. 8-11: Klasse Halbjahresleistung
(Quellcode)JAVApackage ui;
import app.Halbjahresleistung;
public class Benutzerkonsole {
private Halbjahresleistung halbjahresleistung;
public Benutzerkonsole() {
this.erfasseHalbjahresleistung();
this.zeigeNotendurchschnitt();
}
private void erfasseHalbjahresleistung() {
ConsoleReader consoleReader = new ConsoleReader();
int noteKlArb1;
int noteKlArb2;
int noteMuendlich;
System.out.println("Halbjahresleistung");
System.out.println("=====\n");
System.out.println("Bitte geben Sie die folgenden Noten ein:");
System.out.println("----------------------------------------");
System.out.print("Note 1. Klassenarbeit: ");
noteKlArb1 = consoleReader.nextInt();
System.out.print("Note 2. Klassenarbeit: ");
noteKlArb2 = consoleReader.nextInt();
System.out.print("Mündliche Note: ");
noteMuendlich = consoleReader.nextInt();
halbjahresleistung = new Halbjahresleistung();
halbjahresleistung.setNoteKlArb1(noteKlArb1);
halbjahresleistung.setNoteKlArb2(noteKlArb2);
halbjahresleistung.setNoteMuendlich(noteMuendlich);
}
private void zeigeNotendurchschnitt() {
System.out.println("\n----------------------------------------");
System.out.println("Notendurchschnitt: " + halbjahresleistung.berechneNotendurchschnitt());
}
}Abb. 8-12: Klasse Benutzerkonsole
(Quellcode) - Testen Sie Ihre Java-Applikation mit den angegebenen Beispieldaten. Wird dabei ein falscher Notendurchschnitt ausgegeben, lesen Sie bitte den Abschnitt Rechnen mit int-Werten.
Aufgabe 8-3: Rechteck
Ziel ist eine Java-Applikation, die aufgrund der vom Benutzer eingegebenen Daten den Flächeninhalt eines Rechtecks berechnet und diesen auf der Konsole ausgibt (vgl. Abb. 8-13).
========
Bitte geben Sie Breite und Höhe des Rechtecks ein:
--------------------------------------------------
Breite: 10
Höhe: 2.5
--------------------------------------------------
Flächeninhalt: 25.0
Aufgaben
-
Entwickeln Sie ein geeignetes UML-Klassendiagramm.
Lösung
Abb. 8-14: Benutzereingaben über die Konsole (Rechteck) -
Erstellen Sie den Quellcode der von Ihnen modellierten Klassen.
Lösung
JAVApackage app;
public class Rechteck {
private double breite;
private double hoehe;
public void setBreite(double pBreite){
this.breite = pBreite;
}
public double getBreite(){
return this.breite;
}
public void setHoehe(double pHoehe){
this.hoehe = pHoehe;
}
public double getHoehe(){
return this.hoehe;
}
public double berechneFlaecheninhalt(){
return breite*hoehe;
}
}Abb. 8-15: Klasse Rechteck
(Quellcode)JAVApackage ui;
import app.Rechteck;
public class Benutzerkonsole {
private Rechteck rechteck;
public Benutzerkonsole(){
this.erfasseRechteckdaten();
this.zeigeRechteckdaten();
}
private void erfasseRechteckdaten(){
ConsoleReader consoleReader = new ConsoleReader();
double breite;
double hoehe;
System.out.println("Rechtecks");
System.out.println("=========\n");
System.out.println("Bitte geben Sie Breite und Höhe des Rechtecks ein:");
System.out.println("--------------------------------------------------");
System.out.print("Breite: ");
breite = consoleReader.nextDouble();
System.out.print("Höhe: ");
hoehe = consoleReader.nextDouble();
rechteck = new Rechteck();
rechteck.setBreite(breite);
rechteck.setHoehe(hoehe);
}
private void zeigeRechteckdaten(){
System.out.println("\n--------------------------------------------------");
System.out.println("Flaecheninhalt: " + rechteck.berechneFlaecheninhalt());
}
}Abb. 8-16: Klasse Benutzerkonsole
(Quellcode) - Testen Sie Ihre Java-Applikation mit den angegebenen Beispieldaten.
Aufgabe 8-4: Bibliothek
Ziel ist eine Java-Applikation, die es einem Bibliotheksmitarbeiter ermöglicht die Daten eines neu angeschafften Buchexemplars zu erfassen.
Buchexemplar und Buch werden durch getrennte Klassen abgebildet, da von einem bestimmten Buch mehrerer Exemplare vorhanden sein können. Jedes Buchexemplar
-Objekt enthält einen Verweis auf das zu ihm gehörende Buch
-Objekt. Darüber hinaus verfügt es über eine eindeutige Signatur, die verrät wo (z. B. Gebäude, Raum, Regal, ...) das betreffende Buchexemplar aufbewahrt wird. Außerdem wird vermerkt, ob das Buchexemplar ausleihbar ist oder nicht (Präsenzexemplar). Ein Objekt der Klasse Bibliothek
verwaltet alle vorhandenen Buch
-Objekte.
Die Datenerfassung soll über die Konsole erfolgen (vgl. Abb. 8-19).
Vorbereitung
- Legen Sie in Eclipse ein neues Java-Projekt 08-4_Bibliothek an.
-
Erstellen Sie ein Paket namens
app
und kopieren Sie die FachklassenBuch
undBibliothek
in das Paket. -
Legen Sie das Paket
ui
an und kopieren die KlasseConsoleReader
in das Paket.
Aufgaben
-
Erstellen Sie im Paket
app
den Quellcode der FachklasseBuchexemplar
. Informieren Sie sich hierfür zunächst über den primitiven Datentypboolean
(vgl. Infokasten). LösungJAVApackage app;
public class Buchexemplar {
private Buch buch;
private String signatur;
private boolean ausleihbar;
public Buchexemplar(Buch pBuch, String pSignatur) {
this.buch = pBuch;
this.signatur = pSignatur;
}
public Buch getBuch() {
return buch;
}
public void setBuch(Buch pBuch) {
this.buch = pBuch;
}
public String getSignatur() {
return signatur;
}
public void setSignatur(String pSignatur) {
this.signatur = pSignatur;
}
public boolean isAusleihbar() {
return ausleihbar;
}
public void setAusleihbar(boolean pAusleihbar) {
this.ausleihbar = pAusleihbar;
}
}Abb. 8-18: Klasse Buchexemplar
(Quellcode) -
Erstellen Sie im Paket
ui
den Quellcode der UI-KlasseBenutzerkonsole
:KonsoleBitte geben Sie die folgenden Daten des Buchexemplares ein:
-----------------------------------------------------------
ISBN: 978-3-95982-044-8
Signatur: 75/ST 250 J35(1)+2
ausleihbar (true/false): true
Folgende Daten wurden für das neue Buchexemplar erfasst:
-----------------------------------------------------------
Titel des Buches: Jetzt lerne ich Java
Signatur des Exemplars: 75/ST 250 J35(1)+2
Exemplar ausleihbar: true
Abb. 8-19: Konsole mit Benutzereingaben (Beispieldaten) -
Dem einzigen Konstruktor der Klasse wird ein Verweis auf ein Objekt der Klasse
Bibliothek
übergeben, das alle vorhandenenBuch
-Objekte kennt. Im Konstruktor wird der übergebene Wert dem Attributbibliothek
zugewiesen.
Außerdem ruft der Konstruktor die privaten MethodenerfasseBuchexemplar()
undzeigeBuchexemplar()
auf. LösungJAVApackage ui;
import app.Bibliothek;
import app.Buch;
import app.Buchexemplar;
public class Benutzerkonsole {
private Buchexemplar buchexemplar;
private Bibliothek bibliothek;
public Benutzerkonsole(Bibliothek pBibliothek){
this.bibliothek = pBibliothek;
this.erfasseBuchexemplar();
this.zeigeBuchexemplar();
}
public void erfasseBuchexemplar(){
}
public void zeigeBuchexemplar(){
}
}Abb. 8-20: Klasse Buchexemplar
(Quellcode) -
Die private Methode
erfasseBuchexemplar()
erfragt vom Benutzer die ISBN des Buches, sowie die Signatur und die Möglichkeit der Ausleihbarkeit des betreffenden Buchexemplars.
Anschließend fordert sie mit Hilfe der eben erfassten ISBN beim Attributbibliothek
das entsprechendeBuch
-Objekt an. Dazu nutzt sie dessengetBuch(pIsbn: String)
-Methode.
Das so erhalteneBuch
-Objekt, die erfasste Signatur sowie die Möglichkeit der Ausleihbarkeit wird anschließend einem neu erzeugten Objekt der KlasseBuchexemplar
zugewiesen, das unter dem Attributbuchexemplar
verfügbar sein soll. LösungJAVApackage ui;
import app.Bibliothek;
import app.Buch;
import app.Buchexemplar;
public class Benutzerkonsole {
private Buchexemplar buchexemplar;
private Bibliothek bibliothek;
public Benutzerkonsole(Bibliothek pBibliothek){
this.bibliothek = pBibliothek;
this.erfasseBuchexemplar();
this.zeigeBuchexemplar();
}
public void erfasseBuchexemplar(){
ConsoleReader consoleReader = new ConsoleReader();
String isbn;
String signatur;
boolean ausleihbar;
Buch buch;
System.out.println("Bitte geben Sie die folgenden Daten des Buchexemplares ein:");
System.out.println("-----------------------------------------------------------");
System.out.print("ISBN: ");
isbn = consoleReader.nextString();
System.out.print("Signatur: ");
signatur = consoleReader.nextString();
System.out.print("ausleihbar (true/false): ");
ausleihbar = consoleReader.nextBoolean();
buch = bibliothek.getBuch(isbn);
buchexemplar = new Buchexemplar(buch, signatur);
buchexemplar.setAusleihbar(ausleihbar);
}
public void zeigeBuchexemplar(){
}
}Abb. 8-21: Klasse Buchexemplar
(Quellcode) -
Die private Methode
zeigeBuchexemplar()
gibt den Titel, die ISBN, die Signatur und die Möglichkeit der Ausleihbarkeit des eben erfassten Buchexemplars zu Kontrollzwecken auf der Konsole aus. LösungJAVApackage ui;
import app.Bibliothek;
import app.Buch;
import app.Buchexemplar;
public class Benutzerkonsole {
private Buchexemplar buchexemplar;
private Bibliothek bibliothek;
public Benutzerkonsole(Bibliothek pBibliothek){
this.bibliothek = pBibliothek;
this.erfasseBuchexemplar();
this.zeigeBuchexemplar();
}
public void erfasseBuchexemplar(){
ConsoleReader consoleReader = new ConsoleReader();
String isbn;
String signatur;
boolean ausleihbar;
Buch buch;
System.out.println("Bitte geben Sie die folgenden Daten des Buchexemplares ein:");
System.out.println("-----------------------------------------------------------");
System.out.print("ISBN: ");
isbn = consoleReader.nextString();
System.out.print("Signatur: ");
signatur = consoleReader.nextString();
System.out.print("ausleihbar (true/false): ");
ausleihbar = consoleReader.nextBoolean();
buch = bibliothek.getBuch(isbn);
buchexemplar = new Buchexemplar(buch, signatur);
buchexemplar.setAusleihbar(ausleihbar);
}
public void zeigeBuchexemplar(){
System.out.println("\nFolgende Daten wurden für das neue Buchexemplar erfasst:");
System.out.println("-----------------------------------------------------------");
System.out.println("Titel des Buches: " + buchexemplar.getBuch().getTitel());
System.out.println("Signatur des Exemplars: " + buchexemplar.getSignatur());
System.out.println("Exemplar ausleihbar: " + buchexemplar.isAusleihbar());
}
}Abb. 8-22: Klasse Benutzerkonsole
(Quellcode)
-
Dem einzigen Konstruktor der Klasse wird ein Verweis auf ein Objekt der Klasse
-
Erstellen Sie im Paket
ui
den Quellcode der StartklasseStartBenutzerkonsole
:-
Erzeugen Sie ein Objekt der Klassen
Buch
und weisen Sie ihm die Testwerte aus Aufgabe 8-1 zu (vgl. Abb. 8-1). LösungJAVApackage ui;
import app.Bibliothek;
import app.Buch;
public class StarteBenutzerkonsole {
public static void main(String[] args) {
Buch buch;
buch = new Buch("Jetzt lerne ich Java");
buch.setIsbn("978-3-95982-044-8");
buch.setErscheinungsjahr(2016);
}
}
Abb. 8-23: Klasse StartBenutzerkonsole
(Quellcode) -
Erzeugen Sie ein Objekt der Klasse
Bibliothek
und fügen Sie ihm anschließend das eben erzeugte Buchobjekt hinzu. LösungJAVApackage ui;
import app.Bibliothek;
import app.Buch;
public class StarteBenutzerkonsole {
public static void main(String[] args) {
Buch buch;
Bibliothek bibliothek;
buch = new Buch("Jetzt lerne ich Java");
buch.setIsbn("978-3-95982-044-8");
buch.setErscheinungsjahr(2016);
bibliothek = new Bibliothek();
bibliothek.addBuch(buch);
}
}
Abb. 8-24: Klasse StartBenutzerkonsole
(Quellcode) -
Erzeugen Sie ein Objekt der Klasse
Benutzerkonsole
und übergeben Sie dem Konstruktor die eben erzeugte Bibliothek. Führen Sie anschließend das Programm mit den angegebenen Testwerten (vgl. Abb. 8-19) aus. LösungJAVApackage ui;
import app.Bibliothek;
import app.Buch;
public class StarteBenutzerkonsole {
public static void main(String[] args) {
Buch buch;
Bibliothek bibliothek;
buch = new Buch("Jetzt lerne ich Java");
buch.setIsbn("978-3-95982-044-8");
buch.setErscheinungsjahr(2016);
bibliothek = new Bibliothek();
bibliothek.addBuch(buch);
new Benutzerkonsole(bibliothek);
}
}
Abb. 8-25: Klasse StartBenutzerkonsole
(Quellcode)
-
Erzeugen Sie ein Objekt der Klassen
Primitiver Datentyp boolean
Der primitive Datentyp boolean dient zum Speichern der logischen Werte true
und false
. Da nur diese beiden Werte gespeichert werden können, benötigt eine Variable vom Typ boolean
nur sehr wenig Speicherplatz.
Der Name der öffentlichen Methode, die den Wert eines Attributs vom Typ boolean
ausliest und zurückgibt, beginnt üblicherweise nicht mit dem Präfix get
, sondern mit is
.
boolean
Typ | Inhalt | Speicherbedarf | Wertebereich | Beispiel |
---|---|---|---|---|
int | ganze Zahl | 4 Byte | [-2.147.483.648; 2.147.483.647] | int anzahl = 4; |
long | ganze Zahl | 8 Byte | [- 9.223.372.036.854.775.808; 9.223.372.036.854.775.807] | int anzahl = 4l; |
double | Gleitkommazahl2 | 8 Byte | [-1,7 *10308; 1,7 *10308] | double pi = 3.1415927; |
boolean | Wahrheitswert | JVM-spezifisch | [false; true] | boolean belegt = true; |