fakultät für informatik - Technische Universität München

Werbung
TECHNISCHE
UNIVERSITÄT
MÜNCHEN
FAKULTÄT FÜR INFORMATIK
Praktikum Grundlagen der Programmierung
Aufgabenblatt 7
Robert Eigner, Florian Forster
SS 2010
14.06.2010
Abgabe: Eine Woche nach Besprechung im Praktikum.
Praktikum Grundlagen der Programmierung
Aufgabe 34 (Ü)
Mehrfachvererbung
Java erlaubt nur Einfachvererbung. Gelegentlich ist für Objekte aber eine Zugehörigkeit zu unterschiedlichen Objektgruppen wünschenswert. Hierzu dienen Schnittstellenbeschreibungen, die
in Java interfaces heißen. Klassen können mehrere solcher Schnittstellen implementieren. Die
Objekte einer solchen Klasse können dann von Variablen vom Typ einer der implementierten
Schnittstellen aufgenommen werden.
a) Verschiedene Superhelden verfügen über verschiedene Fähigkeiten. Entwickeln sie ein grafisches Modell, das die Abhängigkeiten zwischen Ober- und Unterklassen klar macht und
zusätzlich Interfaces unterscheidet. Wenn Sie UML beherrschen, können Sie Ihr Modell gerne auch als UML-Klassendiagramm notieren. Die Superhelden verfügen über die folgenden
unterschiedlichen Fähigkeiten:
Conan
:
kämpfen
Superman
:
kämpfen, fliegen
Spiderman :
kämpfen, fliegen, denken
Chuck Norris :
kämpfen, Karate
Gemeinsame Eigenschaften mehrerer Gattungen sollen in ihrem Modell in geeignter Weise
in gemeinsamen Oberklassen bzw. Schnittstellen (Interfaces) zusammengeführt und dort als
Methoden spezifiziert werden.
b) Implementieren Sie die Klassen Ihres Modells. Die Methoden sollen nur Textausgaben produzieren.
Aufgabe 35 (Ü)
verkettete Listen
Implementieren Sie eine einfach verkettete Liste für int-Werte, die Werte dürfen dabei mehrmals in der Liste vorkommen Verwenden Sie dazu nicht die von Java bereitgestellten Klassen
java.util.LinkedList, java.util.LinkedList<E> oder das Interface java.util.List<E>.
Ihre verkettete Liste soll die folgenden Methoden unterstützen:
a) boolean isEmpty: testet, ob die gegebene Liste leer ist.
b) void insert(int i): fügt ein neues Element am Ende der Liste ein
c) void remove(int i): entfernt das erste Element aus der Liste, dessen Wert mit der übergebenen Nummer übereinstimmt. Die Funktion hat keine Wirkung, wenn es ein solches
Element nicht gibt.
–2–
Aufgabe 36 (Ü)
Overriding & Overloading
Gegeben seien folgende Beispielklassen:
class A {
public A (){
System . out . println (" Konstruktor A" );
}
void test () {
System . out . println ("A. test () " );
}
}
class B extends A {
public B () {
System . out . println (" Konstruktor B" );
}
@Override
void test () {
System . out . println ("B. test () " );
}
}
class C extends B {
private A a;
public C(A a) {
System . out . println (" Konstruktor C(A a)" );
this.a = a;
}
public C () {
System . out . println (" Konstruktor C" );
}
@Override
void test () {
System . out . println ("C. test () " );
a. test ();
}
}
class D {
void test (A a) {
a. test ();
System . out . println ("D. test (A a)" );
}
void test (B b) {
b. test ();
System . out . println ("D. test (B b)" );
}
}
public class LoadAndRideTest {
public static void main ( String [] args ) {
A a = new A ();
A b0 = new B ();
a. test ();
b0 . test ();
System . out . println (" ----------" );
–3–
B b1 = new B ();
b1 . test ();
System . out . println (" ----------" );
C c1 = new C(a );
c1 . test ();
System . out . println (" ----------" );
C c2 = new C( b0 );
c2 . test ();
System . out . println (" ----------" );
D d = new D ();
d. test (a );
d. test ( b0 );
d. test ( b1 );
}
}
Kompiliert das Programm? Wenn ja, welche Ausgabe erzeugt das Programm? Machen Sie sich
den Unterschied zwischen Overloading & Overriding klar und stellen Sie dar, welche Typüberprüfungen zur Laufzeit und welche beim Kompilieren durchgeführt werden.
Aufgabe 37 (H) generische verkettete Listen
(2 Punkte)
Implementieren Sie Aufgabe 35 noch einmal. Verwenden Sie aber diesmal die generische Listejava.util.LinkedList (siehe http://java.sun.com/j2se/1.5.0/docs/api/java/util/
LinkedList.html). Machen Sie sich mit der API dieser Klasse vertraut und verwenden Sie ein
Objekt der Klasse LinkedList<Integer>, und freuen Sie sich, dass das nun so wenig Aufwand
ist :-)
Aufgabe 38 (H) Getränkehändler
(16 Punkte)
Ein Getränkehändler verfügt über drei Fahrer, die Bestellungen ausliefern. Vormittags nimmt der
Händler Bestellungen auf und sortiert sie für seine Fahrer in Listen, die diese dann abzufahren haben. Grundsätzlich sollen die Fahrer die ihnen zugewiesenen Kunden in der Reihenfolge anfahren,
in der die Bestellung einging, aber der Händler weist den Kunden – je nach Umsatz – unterschiedliche Prioritäten zu: Falls sie mehr als 200 EUR haben sie die höchste Priorität, zwischen 100 und
200 EUR mittlere Priorität, und unter 100 EUR die niedrigste.
a) Implementieren Sie eine geeignete Klassenhierarchie zur Repräsentation von Personen,
Fahrern und den unterschiedlichen Kundenklassen. Verwenden Sie Abstraktion, ggf. auch
mehrschichtig, indem Sie z. B. eine abstrakte Oberklasse Person einführen, die nur durch
ihren Namen identifiziert wird und leiten Sie von dieser Klasse geeignete Unterklassen für
die anderen Personengruppen ab.
b) Implementieren Sie eine Methode, die das korrekte Einsortieren eines Kunden gemäß seiner
Priorität in die Liste eines Fahrers erledigt. Verwenden Sie dazu java.util.LinkedList<E>.
c) Die Fahrer werden am Umsatz beteiligt: sollte ihr Gesamtumsatz auf einer Tour unter 1000
EUR liegen, so erhalten sie 10% des Umsatzes, zwischen 1000 und 2000 EUR erhalten sie
20% und über 2000 EUR 30%. Implementieren Sie eine Methode, mit der der Händler die
auszuzahlenden Provisionen eines Fahrers berechnen kann.
d) Am Ende des Tages möchte der Händler eine Übersicht über die von seinen Fahrern angefahrenen Kunden, deren Umsätze und Provisionen. Implementieren Sie eine Methode, die
diese Daten ausgibt.
e) Testen Sie Ihre Implementierung ausgiebig mit drei Fahrern, die jeweils 10 Kunden haben.
Die Umsätze der Kunden sollen zufällig (z. B. mit der Hilfe von java.util.Random) ermittelt werden.
Herunterladen