• Keine Ergebnisse gefunden

TU Kaiserslautern

N/A
N/A
Protected

Academic year: 2022

Aktie "TU Kaiserslautern"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prof. Dr. A. Poetzsch-Heffter Dipl.-Inf. J.-M. Gaillourdet Dipl.-Inform. M. Reitz Dipl.-Inform. K. Geilmann Dipl.-Inf. P. Michel M. Sc. Y. Welsch

TU Kaiserslautern

Fachbereich Informatik AG Softwaretechnik

Übungsblatt 11: Software-Entwicklung 1 (WS 2008/09)

Ausgabe: in der Woche vom 12.01. bis zum 16.01.

Abgabe: in der Woche vom 19.01. bis zum 23.01.

Abnahme: max 2 Tage nach Abgabe

Aufgabe 1 Speicherverwaltung (Präsenzaufgabe)

Kreuzen Sie an, ob folgende Aussagen wahr oder falsch sind. Falls eine Aussage nicht eindeutig ist, disku- tieren Sie die verschiedenen Interpretationsmöglichkeiten. Wenn nicht anders angegeben, beziehen sich alle Fragen auf die Programmiersprache Java.

wahr falsch

Speicher für Verbunde und Felder wird auf der Halde allokiert.

Lokale Variablen werden auf dem Keller angelegt.

Der Kellerspeicher wird vom Programmierer verwaltet.

Der Programmierer muss die Halde selbst verwalten.

Ein nicht erreichbares Objekt kann von der Speicherbereinigung aus dem Speicher ent- fernt werden.

Ein nicht erreichbares Objekt kann später im Programm wieder erreichbar sein.

Mitnewwird Speicher auf der Halde allokiert.

Das Nichtfreigeben von Speicher ist in Sprachen ohne automatische Speicherbereini- gung eine häufige Problemquelle.

Einnew-Ausdruck kann immer erfolgreich ausgewertet werden.

Aufgabe 2 Heapsort (Präsenzaufgabe)

Sortieren Sie die Liste [23,1701,42,815,13] unter Verwendung des Heapsort-Algorithmus und geben Sie dabei alle entstehenden Bäume an. Kennzeichnen Sie Bäume, welche die Heap-Eigenschaft verletzen.

Aufgabe 3 Listen (Präsenzaufgabe)

Implementieren Sie einen Verbunddatentyp für die Verwaltung von Listen vondouble-Werten in Java. Die- sen werden Sie für die nächsten zwei Aufgaben benötigen. Die Liste soll mit Hilfe eines Arrays realisiert werden, d.h. alle Elemente der Liste werden in einem Array der passenden Größe verwaltet. Folgende Ver- bunde und Prozeduren sollen Sie realisieren:

(2)

Programmkonstrukt Beschreibung

class List { .. } der zu entwerfende Verbunddatentyp

List create() Erzeugt eine neue leere Liste.

void append(List l, double elem) Hängt ein weiteres Element an die Liste an.

int size(List l) Liefert die Anzahl der Listenelemente.

double get(List l, int index) Liefert das Element der Liste an der Stelleindex.

void remove(List l, int index) Entfernt das Element mitindexausl. Alle nachfol- genden Elemente ändern ihren Index.

boolean contains(List l, doubleelem) Testet, obeleminlenthalten ist.

Aufgabe 4 Listen (Einreichaufgabe)

a) Analysieren Sie die Zeitkomplexität vonnAufrufen der Prozedurappendmit vorheriger Erzeugung der leeren Liste. Leiten Sie zunächst die Aufwandsfunktion wie in der Vorlesung her.

b) Nun optimieren wir die implementierten Listen. Dazu erweitern Sie den Zustand des Listenverbunds um eine Komponente für die Anzahl der tatsächlich belegten Arrayzellen. Jedesmal wenn Sie das Array vergrößern müssen, legen Sie es größer an als nötig, Sie verdoppeln es in der Länge. Implementie- ren Sie diese Optimierung. Passen Sie die restlichen Prozeduren dementsprechend an. Warum ist diese Veränderung eine Optimierung, falls Sie viele Aufrufe vonappendhaben? Was ist ein Nachteil dieser Optimierung?

c) Analysieren Sie die Zeitkomplexität von nAufrufen der Prozedurappendbeginnend auf einer leeren Liste, basierend auf ihrer optimierten Implementierung. Gehen Sie vereinfachend davon aus, dass es ein kmitn=2kgibt.

Aufgabe 5 Speicherverbrauch (Einreichaufgabe)

In dieser Aufgabe betrachten wir eine Graphimplementierung, wo Knoten durch Verbunde dargestellt wer- den, die aus einem Wert und einem Feld von Knoten-Nachfolgern bestehen:

class Knoten { int wert ;

Knoten [] nachfolger ; }

Wir wollen nun den Speicherbedarf von Graph-Geflechten bestimmen. Dabei dürfen Sie folgendes anneh- men:

• Der Speicherverbrauch eines Wertes vom Typintist gleich 4. Der Speicherverbrauch eines Wertes vom Typbooleanist gleich 1.

• Der Speicherverbrauch einer Referenz ist 4 (egal ob Referenz auf ein Verbund, Feld oder dernull Referenz).

• Der Speicherverbrauch eines Feldes ist die Summe des Speicherverbrauchs seiner Komponenten und der Konstanten 4 (für denint-Eintrag, der die Länge des Feldes repräsentiert).

• Der Speicherverbrauch eines Verbunds ist die Summe des Speicherverbrauchs seiner Komponenten.

• Der Speicherverbrauch eines Geflechtes ist die Summe des Speicherverbrauchs aller Verbunde, die zu diesem Geflecht gehören.

a) Schreiben Sie eine Prozedurint speicherVerbrauch(Knoten k), die rekursiv den Speicherbedarf des vonkerreichbaren Graphen bestimmt. Welche Art von Graphen sind besonders problematisch?

Hinweis: Sie können in ihrer Implementierung eine Listen-Implementierung ausAufgabe 3oderAufgabe 4verwenden, indem Sie den Element-Typ anpassen.

(3)

b) Bestimmen Sie die Zeitkomplexität ihrerspeicherVerbrauchFunktion. Entwickeln Sie eine andere Lösung, die bei gleicher Speicherkomplexität eine bessere Zeitkomplexität besitzt, indem Sie Anpas- sungen amKnotenVerbund vornehmen.

Aufgabe 6 Netzplantechnik (Einreichaufgabe)

Diese Aufgabe ist erst zusammen mit dem nächsten Blatt 12 abzugeben!

Das Bachelorstudium kann als ein aus vielen einzelnen Teilschritten bestehender Arbeitsablauf modelliert werden. Ein Teilschritt ist dann beispielsweise der Besuch einer Vorlesung, das Absolvieren einer Übungs- stunde oder die Teilnahme an einem Seminar. Teilschritte können von anderen Teilschritten abhängen, die sich im Fall des Bachelorstudiums aus der Studienordnung oder entsprechenden Erfahrungswerten ergeben.

Beispiel: Vor der Absolvierung desSoftware-Entwicklungsprojekts(SEP) ist es sinnvoll, unter anderem die VorlesungSoftwareentwicklung 1(SE-1) besucht zu haben.

Mit Hilfe der Netzplantechnik ist es möglich, einen aus verschiedenen Teilen bestehenden Arbeitsablauf im Bezug auf die zeitliche Verteilung der einzelnen Schritte hin zu untersuchen und zu optimieren. Der Netzplantechnik-Algorithmus arbeitet auf gerichteten Graphen, die folgendermaßen erzeugt werden:

1. Zerlege den zu betrachtenden Prozess in seine verschiedenen Bestandteile (Prozessschritte). Jeder dieser Prozessschritte stellt einen Knoten im Netzplangraphen dar.

2. Stelle die Abhängigkeit zweier Vorgänge durch gerichtete Kanten dar. Die Richtung der Kante gibt die Reihenfolge der zueinander in Beziehung stehenden Prozessschritte an.

Im Rahmen dieser Aufgabe sollen die einzelnen Bestandteile eines Netzplanalgorithmus in der Program- miersprache Java entwickelt werden.

a) Jeder Knoten lässt sich graphisch wie in der folgenden Abbildung dargestellt modellieren.

FAZ FEZ SEZ SAZ Bezeichner

Dauer

Frühestmöglicher Endzeitpunkt

Spätestmöglicher Endzeitpunkt Frühestmöglicher

Anfangszeitpunkt

Spätestmöglicher Anfangszeitpunkt

Entwickeln Sie durch Design eines geeigneten Verbund-DatentypsNodeeine Knotenimplementierung, welche nur die für den zu realisierenden Algorithmus unbedingt notwendigen Attribute enthält.

Hinweis: Der Bezeichner des Knotens lässt sich alslaufende Nummer(beginnend bei Eins) des Schritts bezogen auf den Gesamtprozess realisieren. Sie können davon ausgehen, dass die aufgelisteten Knote- nattribute nur ganzzahlige Werte aufnehmen müssen.

b) Erweitern Sie den im vorherigen Aufgabenteil entworfenen Verbund, sodass sich die in einem Netzplan vorhandenen Kanten entsprechend berücksichtigen lassen. Bedenken Sie dabei, dass ein Knoten sowohl mehrere Nachfolger als auch mehrere Vorgänger haben kann.

Hinweis: Verwenden Sie auch hier eine Listen-Implementierung, die Sie in Aufgabe 3oderAufgabe 4 entwickelt haben, indem Sie den Element-Typ entsprechend anpassen.

c) Entwerfen Sie eine Prozedur void connect(Node first, Node second), welche zur Erzeugung einer gerichteten Kante vonfirstnachsecondverwendet werden kann.

d) Die Eignung eines Graphen für den Netzplantechnik-Algorithmus ist an die Erfüllung der folgenden Bedingungen geknüpft:

(4)

1. Der entstehende Graph darf keine Schleifen enthalten.

2. Es muss mindestens ein Pfad existieren, der Anfangs- und Endarbeitsschritt miteinander verbindet.

Realisieren Sie eine Prozedurboolean isValid(Node start, Node end), welche die Eignung ei- nes Knotennetzwerks für den Netzplantechnik-Algorithmus überprüft.

e) Kernpunkt des Netzplantechnik-Algorithmus ist die Bestimmung vonFAZ,FEZ,SAZundSEZfür jeden Knoten des Prozessgraphen. Deren Bestimmung ist durch folgende Regeln beschrieben:

1. Der Prozessschritt am Anfang des Prozesses hat eineFAZvon Null.

2. DieFEZeines Knotens berechnet sich durchFEZ=FAZ+Dauer.

3. DerFAZeines Knotens ist der spätesteFEZaller seiner Vorgänger.

4. DerSEZdes Prozesses ist identisch mit demFEZdes letzten Prozessschrittes.

5. DerSAZeines Knotens berechnet sich zuSAZ=SEZ−Dauer.

6. DerSEZeines Knotens ist der frühesteSAZaller seiner Nachfolger.

Implementieren Sie eine Methodevoid calculate(Node start), welche einen vorgegebenen Gra- phen beginnend mit dem Knotenstartin geeigneter Weise durchläuft und dabeiFAZ,FEZ,SAZ und SEZ für jeden Knoten gemäß obigen Regeln berechnet. Die folgende Abbildung illustriert die Auswir- kung der Regeln an einem konkreten Beispiel:

0 2

2 0

1

2

9 21 21 9

4

12

2 6

9 5

3

4

21 29 29 21

5

8

2 9

9 2

2

7

f) Überprüfen Sie die Korrektheit ihrer Implementierung bezüglich des Codefragments “NetzTest.java”, welches als Resultat folgende Werte in den einzelnen Knoten des hierdurch repräsentierten Netzplan- Graphen ermitteln sollte:

n1: FAZ= 0, FEZ= 10, SAZ= 0, SEZ= 10, Duration= 10 n2: FAZ= 33, FEZ= 37, SAZ= 33, SEZ= 37, Duration= 4 n3: FAZ= 10, FEZ= 33, SAZ= 10, SEZ= 33, Duration= 23 n4: FAZ= 37, FEZ= 49, SAZ= 37, SEZ= 49, Duration= 12 n5: FAZ= 37, FEZ= 39, SAZ= 47, SEZ= 49, Duration= 2 n6: FAZ= 49, FEZ= 53, SAZ= 49, SEZ= 53, Duration= 4

Hinweis: Die Datei finden Sie wie üblich auf der Vorlesungsseite.

g) Wie lässt sich die kürzeste Zeit für die Ausführung des Gesamtprozesses ermitteln? Geben Sie eine entsprechende Java-Implementierung an.

h) Realisieren Sie eine Prozedur für die Ermittlung sogenannter kritischer Knoten. Ein Knoten ist kri- tisch, wenn keine Zeitreserven für seine Ausführung vorhanden sind, d.h. wenn frühestmögliche und spätestmögliche Anfangszeit zusammenfallen. Die Prozedur soll eine Liste der entsprechenden Knoten zurückliefern.

i) (freiwillige Zusatzaufgabe) Welche Auswirkungen hat eine Überschreitung der vorgesehenen Ausfüh- rungszeit eines Prozessschritts im Bezug auf die Gesamtausführungsdauer?

Referenzen

ÄHNLICHE DOKUMENTE

Entscheiden Sie, ob die folgenden Formeln Axiome des deduktiven Systems F sind. Falls ja, geben Sie an zu welchem der 6 Schemata die Formel

Geben Sie jeweils einen konstruktiven Beweis für die beiden folgenden Aussagen an. “Konstruktiv” heißt hier, dass aus dem Beweis hervorgehen soll, wie man die gewünschte

Fachbereich Informatik AG Softwaretechnik. Übungsblatt 13: Logik

Wenn der Rest der Liste die leere Liste ist, kann diese auch weggelassen werden.. Wir wollen in dieser Aufgabe zum Üben unsere eigenen

Fachbereich Informatik AG Softwaretechnik. Übungsblatt 3: Logik

Zeigen Sie, dass sich Beweise in F 0 verallgemeinern lassen: Wenn es einen Beweis mit einer Variablen p gibt, dann lässt sich p durch eine beliebige Formel ersetzen und man erhält

b) Schreiben Sie eine Funktion addLineNumbers: string -> string -> unit, die jeder Zeile aus Datei 1 (1. Parameter) eine Zeilennummer voranstellt und das Ergebnis in eine

Wenn v eine lokale Variable einer Prozedur ist, dann wird mit v immer die gleiche Spei- chervariable angesprochen... Auf jede Variable kann während der gesamten