• Keine Ergebnisse gefunden

Übungsblatt 4: Softwareentwicklung I (WS 2006/07) Ausgabe: 14. Oktober 2006 Abgabe: 20. November 2006, 12.00 Uhr Abnahme praktischer Teil: 20. - 24. November 2006

N/A
N/A
Protected

Academic year: 2022

Aktie "Übungsblatt 4: Softwareentwicklung I (WS 2006/07) Ausgabe: 14. Oktober 2006 Abgabe: 20. November 2006, 12.00 Uhr Abnahme praktischer Teil: 20. - 24. November 2006"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J.O. Blech Dipl.-Inform. M.J. Gawkowski Dipl.-Inform. N. Rauch

Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik

Übungsblatt 4: Softwareentwicklung I (WS 2006/07)

Ausgabe: 14. Oktober 2006 Abgabe: 20. November 2006, 12.00 Uhr Abnahme praktischer Teil: 20. - 24. November 2006

Aufgabe 1 Tupel (praktisch) (6 Punkte)

In dieser Aufgabe wollen wir eine Mini-Datenbank zur Verwaltung von Büchern in einer Buchhandlung entwickeln.

Wir modellieren den Zustand der Datenbank als eine Liste von Bucheinträgen und einen Bucheintrag als ein Tupel, das die folgenden Informationen über ein Buch enthält:

1. Die ISBN-Signatur des Buches wird als eine ganze Zahl modelliert.

2. Der Autor bzw. die Autorin des Buches wird als eine Zeichenreihe modelliert.

3. Der Titel des Buches wird als eine Zeichenreihe modelliert.

4. Das Erscheinungsjahr des Buches wird als eine ganze Zahl modelliert.

5. Das Verlag, in dem das Buch erchienen ist, wird als eine Zeichenreihe modelliert.

Der Typbuchdatenbank spiegelt unsere Auffassung der Datenbank über die Buchinformationen wider:

type isbn = int

type autor = string

type titel = string

type erscheinungsjahr = int

type verlag = string

type bucheintrag = isbn∗autor∗titel∗erscheinungsjahr∗verlag type buchdatenbank = bucheintrag list

a) 1. Schreiben Sie eine ML-Funktionisbnvon: bucheintrag → isbn, die einen Bucheintragbe als Parameter nimmt und die ISBN-Nummerides vonbebeschriebenen Buches zurückgibt.

2. Schreiben Sie eine ML-Funktionautorvon: bucheintrag → autor, die einen Bucheintragbeals Parameter nimmt und den Autorenamenades vonbebeschriebenen Buches zurückgibt.

3. Schreiben Sie eine ML-Funktiontitelvon: bucheintrag → titel, die einen Bucheintragbe als Parameter nimmt und den Titeltdes vonbebeschriebenen Buches zurückgibt.

4. Schreiben Sie eine ML-Funktionerschjahrvon: bucheintrag → erscheinungsjahr, die einen Bucheintrag beals Parameter nimmt und das Erscheinungsjahredes vonbebeschriebenen Buches zurückgibt.

5. Schreiben Sie eine ML-Funktionverlagvon: bucheintrag → verlag, die einen Bucheintragbeals Parame- ter nimmt und den Verlagsnamenvdes vonbebeschriebenen Buches zurückgibt.

(2 Punkte) b) Schreiben Sie eine ML-Funktionfinde_buch_mit_isbn: isbn ∗ buchdatenbank → bool ∗bucheintrag, die ei- ne ISBN-Nummerides Buches und eine Buchdatenbankbd als Parameter nimmt und nach dem entsprechenden Bucheintrag in der Datenbankbd nachschaut. Wird ein Bucheintragbe mit der ISBN-Nummerigefunden, dann wird von der Funktion ein Tupel(true, be)zurückgegeben. Anderenfalls wird ein Tupel(false,blindelement) zurückgegebenen, wobeiblindelementwird als ein Tupel von Fehlwerten(0,””,””,0,””)definiert. (2 Punkte) c) Schreiben Sie eine ML-Funktionfinde_buecher_von_autor: autor ∗ buchdatenbank → bucheintrag list, die einen Buchautornamenaund eine Buchdatenbankbd als Parameter nimmt und nach den Bucheinträgen, welche die Bücher des Autorsabeschreiben, in der Datenbankbd nachschaut. Werden irgendwelche Bucheinträge mit dem Autorennamenainbd gefunden, dann wird aus ihnen eine Suchergebnis-Liste gebildet und zurückgegeben.

Anderenfalls wird eine leere Liste zurückgegebenen. (2 Punkte)

(2)

Aufgabe 2 Aufzählungstypen (praktisch) (4 Punkte)

Die Programmiersprache SML stellt in der StrukturStringeiner Funktioncompare: string ∗ string → orderzur Verfügung, mit der man zwei Zeichenreihen bezüglich der lexikographischen Ordung vergleichen kann, siehe unten die Definition des Datentypesorderund Beispiele.

datatypeorder =LESS|EQUAL|GREATER

String.compare("abc","ab") = GREATER String.compare("ab","abc") = LESS String.compare("","") = EQUAL String.compare("Ab","ab") = LESS String.compare("","ab") = LESS

Aufgabenstellung:Schreiben Sie eine ML-Funktionlexord: string ∗ string → order, welche die gleiche Funk- tionalität wie die FunktionString.comparebesitzt. Dabei dürfen Sie in Ihrer Funktionsdeklarationwederdie ML- FunktionString.compareverwendennochzwei Zeichenreihen mit irgendeinem Vergleichsoperator, z.B. <, verglei- chen.

Aufgabe 3 Pattern Matching (praktisch) (4 Punkte)

Die folgenden Funktionen sollen mit Hilfe des Pattern Matching implementiert werden. Geben Sie zu jeder Funktion die Signatur und die Definition an!

a) Definieren Sie eine ML-Funktionmake_tripel, die eine Liste von Zahlen in eine Liste von Tripeln umwandelt, wobei jeweils drei aufeinanderfolgende Zahlen der Liste in ein Tripel umgewandelt werden sollen. Übrigbleibende Zahlen, die nicht mehr in ein Tripel umgewandelt werden können, sollen ignoriert werden. (1 Punkt) b) Definieren Sie eine ML-Funktionmake_quad, die eine Liste von Zahlenpaaren in eine Liste von Quadrupeln (d. h. von 4-Tupeln) umwandelt, wobei jeweils zwei aufeinanderfolgende Paare zusammengefasst werden sollen.

Übrigbleibende Paare werden auch hier ignoriert. (1 Punkt)

c) Definieren Sie eine ML-Funktionadd2, die zwei Listen mit ganzen Zahlen als Argumente bekommt und eine Liste zurückliefert, die die Summe der Elemente der übergebenen Listen enthält. Sind die Listen unterschiedlich lang, soll die Funktion so verfahren, als wäre die kürzere Liste am Ende mit Nullen aufgefüllt. (1 Punkt) Beispiel:add2 ([1,2,3], [4]) = [5,2,3]

d) Definieren Sie eine ML-Funktion my_rev, die die Reihenfolge der Elemente einer Liste (beliebigen Inhalts) umkehrt. Dabei dürfen Sie die ML-Funktionrevnicht verwenden!

Was passiert, wenn Sie die Funktion auf der leeren Liste aufrufen? (1 Punkt)

Aufgabe 4 Mini-Dateisystem (praktisch) (7 Punkte)

In dieser Aufgabe wollen wir ein Mini-Dateisystem entwickeln. Wir modellieren den Zustand des Dateisystems als ei- ne baumartige Datenstruktur, d. h. die Blätter des Baumes sind die Dateien des Dateisystems selbst und die Knoten des Baumes modellieren die Verzeichnisse. Beide tragen einen Namen. Dateien enthalten Zeichenlisten, Verzeichnisse ent- halten Listen von Dateien und Unterverzeichnisse. Der Datentypentry spiegelt unsere Auffassung des Dateisystems wider:

datatype entry = FILE of string ∗ (char list)

| DIR of string ∗ (entry list);

Definieren Sie eine ML-FunktionprintFS: entry → string, die ein Dateisystemds vom Typentry als Argument nimmt und alle Namen der Verzeichnisse und Dateien, die indsvorhanden sind, mit korrekter Einrückung ausdruckt.

Beispiel: einentry-Wert und seine Ausgabe:

ds = DIR("d1",[DIR("d1_1",[FILE("f1_1",[#"n", #"o"]),FILE ("f1_2", [#"n",#"o"])]),DIR("d1_2",[]),FILE("f1_1",[#"n",#"o"])]);

(3)

[D] d1 [D] d1_1

[F] f1_1 [F] f1_2 [D] d1_2 [F] f1_1

Aufgabe 5 Rekursive Aufrufe (praktisch) (3 Punkte)

In dieser Aufgabe sollen Sie lernen, selbst zu bestimmen, wie groß die Anzahl der rekursiven Aufrufe einer rekursi- ven Funktion abhängig vom Wert des übergebenen Parameters ist. Dies soll jetzt an einem Beispiel veranschaulicht werden.

Beispiel:Betrachten Sie nochmals die Deklaration der Fakultätsfuntion aus dem Übungsblatt 3.

fun fakultaet n = if n=0 then 1 else fakultaet (n-1) * n

Wie viele Male wird die Funktionfakultaetrekursiv aufgerufen um einen Ausdruckfakultaet(n)auszuwerten? Wir rechnen zwei Beispiele aus. In den eckigen Klammern neben dem Gleichheitszeichen markieren wir die aktuelle Anzahl der Aufrufe der Funktion.

fakultaet(0) =[0] if 0=0 then 1 else fakultaet(0-1) * 0

fakultaet(3) =[0] if 3=0 then 1 else fakultaet(3-1) * 3

=[0] fakultaet(2) * 3

=[1] (if 2=0 then 1 else fakultaet(2-1) * 2) * 3

=[1] fakultaet(1) * 2 * 3

=[2] (if 1=0 then 1 else fakultaet(1-1) * 1) * 2 * 3

=[2] fakultaet(0) * 1 * 2 * 3

=[3] (if 0=0 then 1 else fakultaet(0-1)) * 1 * 2 * 3

=[3] 1 * 1 * 2 * 3

Wir sehen an dem Beispiel, dass die Funktion, welche zu einer ganzen Zahlndie Anzahl der rekursiven Aufrufe von fakultaetwährend der Auswertung des Ausdrucksfakultaet(n)berechnet, die Identitätsfunktion auf die natürlichen Zahlen ist.

Aufgabenstellung: Schreiben Sie eine ML-Funktionanz_rek_aufruefe_fib: int → int, die eine natürliche Zahln als Parameter nimmt und die Anzahl der rekursiven Aufrufe der Fibonacci-Funktion, die während der Auswertung des Ausdrucksfib(n)vorgenommen werden, zurückgibt. Dabei ist die Funktionfibwie folgt definiert.

fun fib n = if n<2 then 1

else fib(n-1) + fib(n-2)

Aufgabe 6 Sortieren (praktisch) (6 Punkte)

Betrachten Sie nochmals die Mini-Buchdatenbank aus der Aufgabe 1. Die Datenbank soll jetzt in einer Buchhandlung eingesetzt werden. Um die Kunden-Anfragen bedienen zu können, soll die Funktionalität dieser Datenbank um zwei zusätzliche Anfrage-Funktionen erweitert werden:

1. Es soll möglich werden alle Bucheinträge, welche zur Zeit in der Datenbank enthälten sind, in einer Liste auszugeben. Um die Lesbarkeit der Suchergebnise zu verbessern, sollen die ausgegebenen Bucheintragslisten sortiert ausgegeben werden. Eine sortierte Ausgabe soll die folgenden Kriterien erfüllen:

(a) Alle Bücher sollen sortiert nach dem Erscheinungsjahr in der Liste vorkommen.

(b) Alle Bücher, die in einem Jahr ausgegeben wurden, sollen lexikographisch nach den Autorennamen sortiert in der Liste vorkommen.

(c) Alle Bücher, die in einem Jahr von dem gleichen Autor veröffentlicht wurden, sollen lexikographisch nach dem Titel sortiert in der Liste vorkommen.

(4)

(d) Alle Bücher, die in einem Jahr von dem gleichen Autor und unter dem gleichen Titel veröffentlicht wurden, sollen lexikographisch nach dem Verlag sortiert in der Liste vorkommen.

2. Es soll möglich werden zu einem gegebenen Autorennamen Informationen über alle seine erschienenen Bücher zu bekommen. Um die Lesbarkeit der Suchergebnise zu verbessern, soll die Liste, der ausgegebenen Buchein- träge sortiert ausgegeben werden. Eine sortierte Ausgabe soll die folgenden Kriterien erfüllen:

(a) Alle Bücher sollen sortiert nach dem Erscheinungsjahr in der Liste vorkommen.

(b) Alle Bücher, die in einem Jahr veröffentlicht wurden, sollen lexikographisch nach dem Titel sortiert in der Liste vorkommen.

(c) Alle Bücher, die in einem Jahr unter dem gleichen Titel veröffentlicht wurden, sollen lexikographisch nach dem Verlag sortiert in der Liste vorkommen.

a) Implementieren Sie eine ML-Funktionausgabe: buchdatenbank → bucheintrag list, die eine Buchdatenbank dbals Parameter nimmt und eine sortierte Liste alle Bucheinträge indbzurückgibt. Die Sortierung der Einträge in der ausgegebenen Liste soll den in 1) beschriebenen Anforderungen genügen. (3 Punkte) b) Implementieren Sie eine ML-Funktion anfrage_zu_autor: buchdatenbank ∗ autor → bucheintrag list, die eine Buchdatenbankdbund den Autorennamenaals Parameter nimmt und eine sortierte Liste alle Bucheinträge indb, die Bücher vom Autorabeschreiben, zurückgibt. Die Sortierung der Einträge in der ausgegebenen Liste

soll den in 2) beschriebenen Anforderungen genügen. (3 Punkte)

Referenzen

ÄHNLICHE DOKUMENTE

Aber wenn man sich einmal kurz an das Einsteinjahr erinnert, an die wunderba- ren großen roten Buchstaben, mit denen in Berlin an Lebensstationen des

Die Bemerkung „Z“ wird für Stoffe verge- ben, die bezüglich der entwicklungstoxischen Wirkung bewertet werden können und für die ein Risiko der Fruchtschädigung auch bei

 oma kooli valmisolekut eestikeelsele aineõppele üleminekuks hinnatakse paremaks kui varem, kasvanud on eesti keeles oma ainet õpetavate õpetajate osakaal; paranenud on õpetajate

tick soll eine Liste von boole- schen Werten b, die eine binäre Zahl darstellt (hierbei soll true den Wert 1 repräsentieren und false den Wert 0), als Eingabe nehmen und eine Liste

a) Schreiben Sie eine ML-Funktion binsearch : : int list → int option, die eine aufsteigend sortierte Liste ganzer Zahlen l und eine ganze Zahl k als Eingabe nimmt und in l nach

Ist die Warteschlange q nicht leer und ist das vorderste Element von q ein Zeichen c, dann wird von der Funktion SOME (c, q 0 ) zurückgegeben, wobei q 0 eine Warteschlange ist, die

In dieser Aufgabe sollen Sie eine vereinfachte Version der Klasse ArrayList aus dem Package java.util im- plementieren. Dabei dürfen Sie in Ihrer Implementierung die Schnittstelle

Die Klasse soll genau eine Deklaration einer statischen Methode public static AListModulo selection_sort( AListModulo l) {...} enthalten. Die Methode wird folgendermaßen spezifiert:.