• Keine Ergebnisse gefunden

Hinweis: Auf diesem und den folgenden Übungsblättern finden Sie jeweils eine Pflicht- aufgabe. Ihre Lösung der Pflichtaufgabe dieses Übungsblatts müssen Sie in Ihrem zur Verfügung gestellten Repository bis spätestens am

N/A
N/A
Protected

Academic year: 2021

Aktie "Hinweis: Auf diesem und den folgenden Übungsblättern finden Sie jeweils eine Pflicht- aufgabe. Ihre Lösung der Pflichtaufgabe dieses Übungsblatts müssen Sie in Ihrem zur Verfügung gestellten Repository bis spätestens am"

Copied!
5
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 24. April 2018

Programmieren II

10. Übungsblatt

Hinweis: Auf diesem und den folgenden Übungsblättern finden Sie jeweils eine Pflicht- aufgabe. Ihre Lösung der Pflichtaufgabe dieses Übungsblatts müssen Sie in Ihrem zur Verfügung gestellten Repository bis spätestens am

6. Mai 2018 um 15 Uhr

auf der Web-Seite

https://ips1.ibr.cs.tu-bs.de/users/sign-in

hochladen. Beachten Sie, dass Sie Ihre Lösung auch Ihrem Tutor erläutern müssen.

Halten Sie sich bei der Programmierung an die in der Vorlesung vorgestellten Richtli- nien zur Formatierung von Java-Programmen. Auf der Internetseite zu dieser Veranstal- tung finden Sie eine Zusammenstellung dieser Richtlinien. Kommentieren Sie Ihre Lösung der Pflichtaufgabe. Der Kommentar muss Ihren Namen, Ihre Matrikelnummer und Ih- re Übungsgruppe, sowie eine Beschreibung Ihrer Lösung enthalten. Auf der Abgabeseite finden Sie eine Möglichkeit, die Formatierung Ihrer Lösung zu checken.

Aufgabe 54: (Wiederholung: Rekursion) Die durch die Ausdrücke

f(0) = 0, f(1) = 1, f (2n) = f (n), f(2n + 1) = f (n) + f(n + 1) für n ∈ N rekursiv definierte Funktion f : N → N heißt

Verkannte Schwester der Fibonacci-Folge.

Die Tabelle 1 1 2

1 3 2 3

1 4 3 5 2 5 3 4

1 5 4 7 3 8 5 7 2 7 5 8 3 7 4 5

1 6 5 9 4 11 7 10 3 11 8 13 5 12 7 9 ....

enthält die Funktionswerte f (1) = 1, f(2) = 1, f (3) = 2, ... , f (47) = 9. Die Summen

der Zeilen sind 3

0

= 1, 3

1

= 3, 3

2

= 9, 3

3

= 27, 3

4

= 81, . . .. Außerdem sind die Spalten

arithmetische Folgen, d. h., die Differenzen zwischen zwei Werten in einer Spalte sind stets

gleich. Schreiben Sie ein Programm, dass die Anfänger der ersten Spalten zeilenmäßig

ausgibt. Ihre Ausgabe könnte also wie folgt aussehen:

(2)

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ....

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ....

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ....

3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 ....

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ....

Diese Folge wurde von Moritz Stern und Achille Brocot definiert.

Aufgabe 55: Als einführendes Beispiel in die Programmierung dynamischer Datentypen wurde in der Vorlesung die Schnittstelle

interface List { boolean isEmpty();

boolean isInList(Element x);

Element firstElement();

int length();

List insert(Element x);

List append(Element x);

List delete(Element x);

List delete();

}

durch verkettete Listen implementiert. Der Implementierung lag die folgende Strukturin- variante zu Grunde:

xn

x1 x2 . . .

L:

Das erste Element L der Liste ist ein „Zeiger“ auf die Liste, d. h., das erste Item-Feld wird nicht genutzt. Der letzte Zeiger ist „null“. Die Schnittstelle List wird jetzt um die folgenden Methoden erweitert:

interface List { ...

List add(Element x, int n);

List remove(int n);

Element get(int n);

int firstIndexOf(Element x);

int lastIndexOf(Element x);

}

Die Methode add(Element x, int n) soll das Element x an Position n in die aktuelle

(3)

Implementieren Sie die erweiterte Schnittstelle List durch eine verkettete Liste. Die Strukturinvariante Ihrer Implementierung soll analog zur obigen Strukturinvariante sein, aber das erste Item-Feld nutzen. Achten Sie darauf, dass beim Aufruf jeder Methode die Strukturinvariante erhalten bleibt.

Es sind fehlerhafte Aufrufe möglich. Die Methode add(Element x, int n) könnte beispielsweise mit dem Wert 10 für den Parameter n aufgerufen werden, obwohl die Liste nur 2 Elemente enthält. In diesen Fällen soll eine IllegalArgumentException ausgelöst werden.

Kommentieren Sie Ihre Lösung und erzeugen Sie die Dokumentation mit dem Pro- gramm javadoc.

Aufgabe 56: In der Vorlesung wurde die Schnittstelle interface List {

boolean isEmpty();

boolean isInList(Element x);

Element firstElement();

int length();

List insert(Element x);

List append(Element x);

List delete(Element x);

List delete();

}

durch verkettete Listen und durch Felder implementiert. Diese Schnittstelle wird jetzt um die folgenden Methoden erweitert:

interface List { ...

List insert(Element x, int n);

List swap(int m, int n);

List deleteAll(Element x);

List deleteLast();

Element maximum();

}

Die Methode insert(Element x, int n) soll das Element x an Position n in die ak-

tuelle Liste einfügen. Die Methode swap(int m, int n) soll das m-te mit dem n-ten

Element der aktuellen Liste durch Änderung der Verkettung vertauschen. Die Methode

deleteAll(Element x) soll alle Elemente der aktuellen Liste entfernen, die den gleichen

Inhalt wie der Parameter x besitzen. Die Methode deleteLast() soll das letzte Element

der aktuellen Liste löschen. Die Methode maximum() soll das größte Element der aktuellen

Liste liefern.

(4)

Implementieren Sie die erweiterte Schnittstelle List. Verwenden Sie dabei statt einer einzelnen Klasse LinkedList die beiden folgenden Klassen Node und LinkedList:

public class LinkedList implements List { protected Node node;

...

}

public class Node {

protected Element item;

protected LinkedList next;

...

}

Lösen Sie die Aufgabe, indem Sie sich zuerst die Strukturinvariante der Implementierung klar machen.

Testen Sie Ihr Programm mit Beispielen der Klasse Element. Vervollständigen Sie dazu die Methoden equals, compareTo und toString:

public class Element implements Comparable<Element> { private int i;

public Element(int i) { this.i = i; } public boolean equals(Object x) { ... } public int compareTo(Element e) { ... } public String toString() { ... }

}

Aufgabe 57: Implementieren Sie die erweiterte Schnittstelle List aus Aufgabe 56 durch

Arrays.

(5)

Pflichtaufgabe 58: In dieser Pflichtaufgabe sollen Sie eine doppelt-verkettete, zirkuläre Item-Liste implementieren. Ihre Liste soll die vorgegebenen Methoden vollständig imple- mentieren! Verwenden Sie in dieser Aufgabe noch keine Generizität, sondern arbeiten Sie mit den Rohtypen. Also statt Comparable<T> verwenden Sie Comparable. Sie dürfen für diese Aufgabe keine Klassen oder Methoden des JCF (Java Collections Framework) verwenden.

Player Der Player soll über eine Liste von Items verfügen. Nutzen Sie an dieser Stelle die von Ihnen implementierte Liste. Wird ein Alien besiegt, soll ein neues Item gedroppt werden. Das heißt, in die Liste soll ein neues Item mit zufälliger Heilkraft aufgenommen werden.

Liste und Items Erstellen Sie eine neue Klasse Item, welche die Schnittstelle Comparable implementiert. Programmieren Sie eine für die Nutzung in der Liste sinnvolle compareTo()- Methode. Jedes Item soll derzeit ein Heil-Item sein. Wird ein neues Item erstellt, wird der Wert der Heilung dieses Items zufällig festgelegt. Die Klasse Item soll außerdem über eine equals() und eine toString()-Methode verfügen. Immer, wenn der Spieler ein Alien getroffen hat, soll der Spieler als Belohnung ein Item erhalten. Dieses soll nun auf- oder absteigend nach Heilkraft sortiert in die Liste eingefügt werden. Erweitern Sie die Ausgabe um eine Anzeige der Itemliste vor der Bewegung des Spielers. An dieser Stelle soll der Spieler außerdem die Möglichkeit besitzen, ein Item einzusetzen. Beachten Sie, dass höchstens ein Item pro Runde eingesetzt werden darf. Dafür soll der Spieler den Index des Items in der angezeigten Liste eingeben können. Nun erhält der Spieler die Heilpunkte, welche der Trank besitzt, zu seinen Lebenspunkten dazu.

Liste Schreiben Sie eine Klasse MyList, die die folgenden Methoden eines von Ihnen zu erstellendes List-Interfaces vollständig implementiert. Als Strukturinvariante sollen Sie eine doppelt-verkette, zirkuläre Liste benutzen. Die einzelnen Methoden sollen wie folgt umgesetzt werden:

isEmpty() Gibt true zurück, wenn die Liste keine Elemente enthält.

length() Gibt die Anzahl der enthaltenden Elemente zurück.

first() Gibt das erste Element der Liste zurück.

insert(e) Fügt das Element e am Anfang der Liste ein.

append(e) Fügt das Element e am Ende der Liste ein.

sortedInsert(e) Fügt das Element e sortiert in die Liste ein.

delete(e) Löscht das erste Vorkommen vom Element e aus der Liste.

iterator() Gibt einen Iterator, der das iterator -Interface

1

implementiert zurück.

getItem(i) Gibt das Element an der übergebenen Stelle in der Liste zurück.

1

https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

Referenzen

ÄHNLICHE DOKUMENTE

Implementieren Sie eine Zahlenmenge mit Hilfe einer linearen Liste (Hinweise: Ein Menge enthält niemals mehrere Exemplare der

Implementieren Sie eine Zahlenmenge mit Hilfe einer linearen Liste (Hinweise: Ein Menge enthält niemals mehrere Exemplare der

Die Klasse soll folgende Methoden haben: search prüft ob eine Zahl vorhanden ist, delete entfernt eine Zahl, size liefert die Anzahl der Zahlen, und iterator liefert einen Iterator

Die Schnittstelle ist durch die abstrak- te Klasse List gegeben (für Methodenbeschreibungen siehe Java-Dokumentation in der Vorgabedatei).

Implementieren Sie eine doppelt verkettete Liste für Objekte in der Klasse LinkedList.. Die Schnittstelle ist durch die abstrakte Klasse List gegeben (für Methodenbeschreibungen

Implementieren Sie eine doppelt verkettete Liste für Objekte in der Klasse LinkedList.. Die Schnittstelle ist durch die abstrakte Klasse List gegeben (für Methodenbeschreibungen

Die Projektverantwortlichen hatten ursprünglich gemeinsam mit der Polizei- und Militärdirektion vereinbart, das Detailkonzept für das Gotthelf Zentrum in der

Es muss dem Nutzer zudem möglich gemacht werden, dass er mehrere Entitäten zu einem neuen Datentyp kombinieren kann, welcher dann auch ausgelesen, gespeichert und aktualisiert