CD-Verleih
Hier ein paar Quellcode-Ausschnitte aus dem CD-Verleih-Programm aus der Übung.
Die Klasse CD:
[java]
public class CD {
//Die Attribute der Klasse
private int cdnummer;
private String bandName;
private String albumTitle;
//der Standard-Konstruktor
public CD(){
cdnummer = -1;
bandName = "";
albumTitle = "";
}
//der Konstruktor mit Parametern
public CD(int cdnummer, String bandName, String albumTitle){
this.setCdnummer(cdnummer);
this.bandName = bandName;
this.albumTitle = albumTitle;
}
//Methode zum Anzeigen der CD am Bildschirm
public void ausgeben(){
System.out.println("CDNummer:\t" + this.getCdnummer());
System.out.println("BandName:\t" + this.bandName);
System.out.println("AlbumTitel:\t" + this.albumTitle);
}
public void setCdnummer(int cdnummer){
if(cdnummer > 0){
this.cdnummer = cdnummer;
}
}
public int getCdnummer(){
return this.cdnummer;
}
//getter und setter der anderen Attribute sind äquivalent}
[/java]
Die Klasse für den Kunden ist Äquivalent zur Klasse CD
Die Klasse CDVerleih ist die Hauptklasse mit der Main-Methode. Ausserdem enthält sie folgende Methoden:
[java]
//read() ist dafür da um einen String von der Konsole einzulesen
public static String read(){
String temp = "";
BufferedReader eingabe = new BufferedReader(
new InputStreamReader(System.in));
try{
temp = eingabe.readLine();
}catch(IOException e){};
return temp;
} [/java]
[java] //Die Methode liest die Werte einer CD von der Konsole ein und erzeugt daraus ein neues CD-Objekt.
//Die CD-Nummer wird dabei beim Aufruf übergeben und die erzeugte CD an den Aufrufer zurückgegeben
public static CD CDEinlesen(int cdnummer){
String Bandname;
String Albumtitel;
System.out.println("Gib Bandnamen ein:");
Bandname = read();
System.out.println("Gib Albumtitel ein:");
Albumtitel = read();
return new CD(cdnummer,Bandname,Albumtitel);
} [/java]
Die Methode Kunde KundeEinlesen(int knummer) ist äquivalent dafür da um einen Kunden einzulesen
[java] //Die Methode bekommt den CD-Bestand als Parameter übergeben und findet heraus welches der nächste freie Index ist.
public static int getNextFreeCdId(CD[] bestand){
int zaehler = 0;
while(bestand[zaehler] != null){
zaehler++;
}
return zaehler;
} [/java]
Die Methode int getNextFreeKundeId(Kunde[] bestand) ist äquivalent dazu da um die nächste freie Kunden-ID heraus zu bekommen. Zum Schluss die Main-Methode: Zuerst sollten Arrays für die CDs und die Kunden angelegt werden:
[java] CD[] cdBestand = new CD[1000];
Kunde[] kundenBestand = new Kunde[1000]; [/java]
Danach wird ein Menü realisiert, mit welchem der Nutzer seine nächste Aktion auswählt.
[java]
int auswahl;
do {
System.out.println("Wählen Sie eine Option aus:\n");
System.out.println("1. neue CD");
System.out.println("2. neuer Kunde");
System.out.println("3. anzeigen");
System.out.println("4. verleihen");
System.out.println("5. zurueckgeben");
System.out.println("6. ENDE");
System.out.print("Ihre Auswahl:");
auswahl = Integer.parseInt(read());
switch(auswahl){
case 1: ....
case 2:....
//usw
}
[/java]
Innerhalb der einzelnen Case-Zweige wird nun der dazugehörige Code realisiert. Zum Anlegen von neuen Kunden und neuen CDs muss lediglich die nächste freie ID mit der oben beschriebenen Methode herausbekommen werden und anschließend die Methode zum Einlesen der CD/Kunde aufgerufen werden. Das Objekt, welches diese Methode zurückgibt muss anschließend in das Bestands-Array an der korrekten Stelle (die freie ID) gespeichert werden.
Zum Anzeigen der Kunden bzw. der CDs muss lediglich mit einer For-Schleife durch das jeweilige Bestands-Array iteriert werden und in jedem Iterationsschritt die anzeigen()-Methode des jeweiligen Array-Elements ausgeführt werden. Um eine NULL-Pointer-Exception zu vermeiden sollte jedoch vor dem Aufruf der anzeigen-Methode überprüft werden, ob denn überhaupt an der aktuellen Position im Array bereits ein Objekt hinterlegt wurde oder ob dort noch NULL drin steht.
[java]
for(int i=0 ; i< cdBestand.length ; i++){
if(cdBestand[i] != null){
cdBestand[i].anzeigen();
}
}
[/java]
Für das Ausleihen und Zurückgeben sind laut Aufgabenstellung in der Klasse CD die Methoden void ausleihen() sowie void zurueckgeben() vorgesehen. Das lässt darauf schließen, dass sich die CD selbst darum kümmert, an wen sie grade ausgeliehen ist. Dies macht auch Sinn da die Realisierung denkbar einfach ist. Jede CD ist einzigartig, kann also zu jeder Zeit an nur höchstens einen Kunden ausgeliehen sein. Der Kunde hingegen kann selbst verständlich mehrere CDs auf einmal ausliehen. Würde man die Speicherung beim Kunden realisieren, so müsste man für jeden Kunden ein Array mit seinen ausgeliehnen CDs anlegen. Dies ist allerdings relativ viel Aufwand.
Die Einfachere Lösung ist wie gesagt, die Speicherung der ausleihen innerhalb der CD. Später in der Vorlesung Datenbanken werden ähnliche Probleme nocheinmal genauer betrachtet und genau geklärt, warum die Speicherung innerhalb der CD mehr Sinn ergibt.
Die Klasse CD bekommt ein Neues Attribut kundennummer. In diesem wird die Kundennummer des Kunden gespeichert, der aktuell die CD ausgeliehen hat. Sollte die CD nicht verliehen sein, so wird ein Standardwert von -1 verwendet.
Die Methode ausleihen() bekommt einen Parameter, nämlich die Kundennummer übergeben.
[java]
public void ausleihen(int knummer){
this.knummer = knummer;
}
[/java]
Damit ist eine Verbindung zwischen Kunden und CD hergestellt. Die Methode zurueckgeben löscht im Prinzip die Kundennummer von der CD und setzt diese wieder auf den Standardwert zurück.
[java]
public void zurueckgeben(){
this.knummer = -1;
}
[/java]
In der Main-Methode kann ich nun das Ausleihen ganz einfach realisieren. Wenn der User in den entsprechenden Zweig im Menü kommt, frage ich die Kundennummer und die CD-Nummer ab, die verliehen werden soll. Anschließend Rufe ich die Methode ausleihen der entsprechenden CD mit der Kundennummer als Parameter auf. Für das Zurückgeben muss lediglich die CD-Nummer abgefragt werden, welche zurückgegeben werden soll. Für diese CD wird dann die Methode zureuckgeben aufgerufen und fertig.
Achtung: Beim Ausleihen sollten unbedingt ein paar Sicherheitsprüfungen vorgenommen werden. Zu erst sollte geprüft werden, ob die CD mit der eingegebenen CD-Nummer und der Kunde mit der eingegebenen Kundennummer überhaupt existiert. Anschließend sollte abgefragt werden, ob die CD nicht schon verliehen ist. Falls das der Fall ist, sollte eine entsprechende Ausgabe am Bildschirm erfolgen. In dem Moment kann man sogar den Namen des Kunden ausgeben, der die CD aktuell ausgeliehen hat.
Ein wenig anspruchsvoller ist jetz nur noch die Anzeige aller ausgeliehenen CDs. Dazu muss ich über das gesamte cdBestand-Array iterieren. In jedem Iterationsschritt prüfe ich mittels der getter-Methode des neuen kundennummer-Attributes, ob dieses -1 ist. Falls das der Fall ist, heisst das, dass die CD nicht verliehen ist und somit nicht angezeigt werden braucht.
Sollte die kundennummer jedoch ungleich -1 sein, so muss sie angezeigt werden. Zunächst werden die Daten der CD angezeigt und die gespeicherte Kundennummer. Über diese Kundennummer kann ich nun zustätzlich sogar auf den Entsprechenden Kunden in dem kundenbestand-Array zugreifen und dessen Namen direkt zur Anzeige bringen.
[java]
System.out.println("CD \t KundenID\tKundenname\n--------------------------------");
for(int i=0 ; i<cdBestand.length ; i++){
if(cdBestand[i] != null){
int knummer = cdBestand[i].getKnummer();
if(knummer != -1){
System.out.print(i + "\t");
System.out.print(knummer + "\t\t");
System.out.println(kundenBestand[knummer].getName());
}
}
}
[/java]
Damit ist das CD-Verleih-Programm weitgehend komplett. Die Zusatzaufgabe mit dem Abspeichern in eine Datei werde ich hier nicht erläutern. Kompliziert ist dies jedoch nicht unbedingt. Wie ich schon in der Übung hin und wieder erwähnt habe, ist das Prinzip sehr ähnlich dem Streams-Konzept beim Einlesen von der Tastatur. Statt dem InputStreamReader muss hier nämlich lediglich andere Streams verwendet werden. Um in eine Datei zu schreiben bzw. zu lesen ist z.B. der FileOutputStream/FileInputStream eine gute Wahl. Diesem kann nun ein ObjectOutputStream/ObjectInputStream angehängt werden, mit dem ganze Objekte in einem Rutsch in die Datei gespeichert werden. Alle Objekte bzw. die Klassen dieser Objekte müssen dazu aber das Interface Serializable implementieren. Als Tipps sollte das Reichen denke ich. Die Java API bietet hier eine sehr gute Anlaufstelle um mehr zu erfahren.
Viel Spaß beim Programmieren und Viel Erfolg bei der Prüfungsvorbereitung. Fragen und Anmerkungen gerne Persönlich an mich oder in den Kommentaren.





