• Keine Ergebnisse gefunden

Übungsblatt 5: Softwareentwicklung I (WS 2006/07) Ausgabe: 21. November 2006 Abgabe: 27. November 2006, 12.00 Uhr Abnahme praktischer Teil: 27. November - 01. Dezember 2006

N/A
N/A
Protected

Academic year: 2022

Aktie "Übungsblatt 5: Softwareentwicklung I (WS 2006/07) Ausgabe: 21. November 2006 Abgabe: 27. November 2006, 12.00 Uhr Abnahme praktischer Teil: 27. November - 01. Dezember 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 5: Softwareentwicklung I (WS 2006/07)

Ausgabe: 21. November 2006 Abgabe: 27. November 2006, 12.00 Uhr Abnahme praktischer Teil: 27. November - 01. Dezember 2006

Aufgabe 1 Sortieren durch Auswahl (Auswahlsort) (praktisch) (10 Punkte)

In der Vorlesung wurde eine Deklaration der Funktionselectionsortvorgestellt. In dieser Aufgabe wollen wir zwei Aspekte dieser Implementierung untersuchen: Effizienz und Allgemeinheit.

a) Verbesserung der Allgemeinheit: Ein Programmierer soll eine Datenbank zur Verwaltung von Produkten für einen Online-Laden erweitern: Wegen des Winterschlussverkaufs in einem Online-Laden wurden die Preisen von allen Produkten in dem Laden mit einem Rabatt versehen. Aus diesem Grund sollen alle Informationen über die in dem Laden angebotenen Produkte durch einer Information über den Rabatt, den es für das entsprechende Produkt gibt, erweitert werden. Ausserdem, um die Kunden-Anfragen bedienen zu können, soll es möglich sein, alle in der Datenbank enthaltenen Produkte in einer nach der Produktnummer sortierten Liste auszugeben.

Den Zustand der Datenbank modelliert der Programmierer als eine Liste von Produkteinträgen und einen Pro- dukteintrag als ein Tupel, das die folgenden Informationen enthält:

1. Die Produktnummer des Eintrags wird als eine ganze Zahl modelliert.

2. Die Produkttyp-Information beschreibt alle Eigenschaften eines Produkts, die für einen Kunden von Interesse sein können. Diese Information wird in unserer Aufgabe durch den Datentypprodukttypmodelliert.

3. Der Rabatt wird als eine reelle Zahl modelliert.

Der Typproduktdatenbankspiegelt die Auffassung der Datenbank über die Produktinformationen wieder:

datatypeprodukttyp = p1|p2 |p3|p4 |p5|p6

type prodnr = int

type rabatt = real

type dataset = prodnr∗produkttyp∗rabatt type proddatenbank = dataset list

Der Programmierer schreib folgendes Programmselectionsort2, welches das Auswahlsort-Verfahren anwendete, um die Produktfinformationen-Liste zu sortieren

datatype produkttyp = p1 | p2 | p3 | p4 | p5 | p6 type laufnr = int

type rabatt = real

type dataset = laufnr * produkttyp * rabatt type proddatenbank = dataset list

infix 4 leq

fun op leq ((kx:int,_,_),(ky:int,_,_)) = kx<=ky fun select2 x [] = x

| select2 x (y::yl) = if x leq y then select2 x yl else select2 y yl

fun delete2 x [] = []

| delete2 x (y::yl) = if x=y then yl else y::delete2 x yl

fun selectionsort2 [] = []

| selectionsort2 (l as (x::xl)) = let val min = select2 x xl

val rest = delete2 min l in

min :: selectionsort2 rest end

und übersetzte die das Programm erfolgreich. Beim Testen des Programms erlebte der Programmier eine böse Überaschung. Bei der folgenden Anwendung vonselectionsort2

val test1 = selectionsort2 [(1,p1,3.56),(2,p2,23.45),(3,p3,0.23),(4,p4,34.34)]

antwortete der Interpreter mit

(2)

Error: operator and operand don’t agree [equality type required]

operator domain: (int * produkttyp * ’’Z) list operand: (int * produkttyp * real) list in expression:

selectionsort2

((1,p1,3.56) :: (2,p2,23.45) :: (<exp>,<exp>,<exp>) :: <exp> :: <exp>) -

Aufgabenstellung: Beschreiben Sie, welchen Fehler der Programmierer gemacht hat. Helfen Sie dem Programmie- rer und modifizieren Sie das Programm so, dass man die Produkteinträge in der Datenbank nach ihren laufenden

Nummer sortieren kann. (2 Punkte)

b) Effizienzsteigerung durch Verbesserung des Algorithmus: Betrachten Sie nochmal die Deklaration der Funtion selectionsortaus der Vorlesung. Wieviele Vergleiche werden durchgeführt um eine absteigend sortierte Liste der Längenaufsteigend zu sortieren? Zählen Sie jede Anwendung einer der Funktionenleqbeziehungsweiseeqals einen Vergleich. Verbessern Sie den Algorithmus so, dass die Anzahl der Vergleiche für jede Eingabeliste geringer wird.

Hinweis: Beobachten Sie, dass die Funktion selectionsort2 bei jedem rekursiven Aufruf zwei mal die glei- che Liste bearbeitet: Zunächst wird das minimale Element min in der Eingabe-Liste l bestimmt und dann wirdmin ausl entfernt (das Ergebnis des Entfernens istrest). Schreiben Sie eine Funktion, welche die beiden Aufgaben gleichzeitig, d.h. in einem Durchgang durch die Eingabe-Liste, erledigt und ein Tupel (min,rest)

zurückgibt. (4 Punkte)

c) Effizienzsteigerung durch Anwendung einer effizienten Datenstruktur: Wie Sie schon aus der Vorlesung wis- sen, kann man aus einer Produkteintragsliste l aus der Teilaufgabe a) direkt ein Feld mit den Elementen ausl mit dem fogenden Aufruf der FunktionList.fromList: αlist → αarrayerzeugen. Schreiben Sie eine Funktion auswahlsortmitfeld: dataset array → unitdie ein Feldamit den Produktinformationen als Parameter nimmt und diesen durch Awendung des Auswahlsort-Verfahrens sortiert. (4 Punkte) Beispiel:

val testdb = [(4,p4,34.34),(3,p3,0.23),(2,p2,23.45),(1,p1,3.56)]

val testarray = Array.fromList testdb

val _ = auswahlsortmitarray testarray val erg = testarray

val testdb = [(4,p4,34.34),(3,p3,0.23),(2,p2,23.45),(1,p1,3.56)]

: (int * produkttyp * real) list

val testarray = [|(1,p1,3.56),(2,p2,23.45),(3,p3,0.23),(4,p4,34.34)|]

: (int * produkttyp * real) array

val erg = [|(1,p1,3.56),(2,p2,23.45),(3,p3,0.23),(4,p4,34.34)|]

: (int * produkttyp * real) array val it = () : unit

-

Aufgabe 2 Bubblesort (praktisch) (6 Punkte)

Betrachten Sie die unten dargestellte Deklaration der Funktionbubblesort, die gegenüber der Vorlesungsfassung leicht verändert wurde: Statt der Funktion@ : αlist ∗ αlist → αlistverwenden wir eine Variante der Funktionappend, die zwei Listen wie@zusammenhängt und zusätzlich Informationen über die zusammengehängten Listen auf dem Terminal ausdruckt.

type dataset2 = int * string infix 4 leq

fun op leq (((kx,_),(ky,_)) :

dataset2 * dataset2) = kx <= ky fun append (l1,l2) =

(print (concat["append(l1,l2): Laenge von l1 = ", Int.toString(length l1),

", Laenge von l2= ", Int.toString(length l1)^"\n"

]);

if l1=[] then l2

else hd l1 :: append(tl l1, l2)) fun bubble rl e [] = (rl,e)

| bubble rl e (y::yl) = if (e leq y)

then bubble (append(rl,[e])) y yl else bubble (append(rl,[y])) e yl fun bubblesort [] = []

| bubblesort (x::xl) = let

val (rl,max) = bubble [] x xl

(3)

in

append(bubblesort rl,[max])

end

Deklarieren Sie verschiedene Listen und rufen Siebubblesortmit den Listen als Eingaben auf. Analysieren Sie wie man den Algorithmus des Bubblesort-Verfahrens effizienter machen kann und schreiben Sie eine effizientere Version, bubblesort2vom gleichen Typ, in der Sie versuchen die Funktionappendgar nicht aufzurufen. Deklarieren Sie die Funktioncons:

fun cons (e,l) =

(print (concat["cons(e,l): Laenge von l = ", Int.toString(length l),"\n"]);

e::l)

und ersetzen Sie jeden Aufruf von@und::inbubblesort2durch einen entsprechenden Aufruf vonappendundcons.

Testen Sie die Funktionenbubblesortundbubblesort2auf die Anzahl der ausgedruckten Zeilen, indem Sie diese mit den von Ihnen definierten Testeingaben aufrufen.

Aufgabe 3 Binäre Suche (praktisch) (8 Punkte)

In dieser Aufgabe sollen Sie das Verfahren binäre Suche selber als eine ML-Funktion schreiben. Das binäre Suchen folgt der Divide-and-conquer Strategie und kann am einfachsten rekursiv beschrieben werden. Um die Beschreibung zu vereinfachen, beschreiben wir das Verfahren für den einfachsten Fall der Eingabe: wir suchen nach einer ganzen Zahl in einer Liste ganzer Zahlen. Ausserdem vereinbaren wir für die nachfolgende Beschreibung die NotationL[m]

fürList.nth(L,m)

Eingaben: L : eine Liste mit aufsteigend sortierten ganzen Zahlen der Länge n k : eine ganze Zahl

Name: binsearch(L,k)

Beschreibung: binäreSuche(L,k) sucht nach der Zahl k in der Liste L.

Wird k in L gefunden, dann ist das Ergebnis der Suche der Listen-Index, an dem k in L vorkommt.

Ansonsten endet die Suche erfolglos.

Algorithmusidee:

1. Falls L leer ist, endet die Suche erfolglos; sonst betrachte das Element an der mittleren Position m in L, L[m].

2. Falls k < L[m], durchsuche die linke Teilliste L[0],. . . ,L[m-1] nach dem selben Verfahren.

3. Falls k > L[m], durchsuche die rechte Teilliste L[m+1],. . . ,L[n-1] nach dem selben Verfahren.

4. Sonst ist k=L[m] und das gesuchte Element ist gefunden. Das Ergebnis der Suche ist m.

Aufgabenstellung:

a) Schreiben Sie eine ML-Funktionbinsearch: : int list → int option, die eine aufsteigend sortierte Liste ganzer Zahlenlund eine ganze Zahlkals Eingabe nimmt und inl nachksucht. Die Funktion soll das Verfahren der binären Suche anwenden und das Ergebnis der Suche soll wie folgt definiert werden:

1. Existiert inlkein Element gleichk, dann wird als ErgebnisNONEzurückgegeben.

2. Existiert in lein Element gleich k, dann soll das Ergebnis der Suche alsSOME imitk = List.nth(k, i) definiert sein.

(5 Punkte) b) Schreiben Sie eine ML-Funktionbinsearch : : proddatenbank ∗ prodnr → int option, die eine aufsteigend nach den Produktnummern sortierte Datenbankdbund eine Produktnummernals Eingabe nimmt und indbnach einem Produkteintrag p mit der Produktnummer n sucht. Die Funktion soll das Verfahren der binären Suche anwenden und das Ergebnis der Suche soll wie folgt definiert werden:

1. Existiert indbkein Produkteintrag mit der Produktnummern, dann wird als ErgebnisNONEzurückgegeben.

2. Existiert indbein Produkteintragpmit der Produktnummern, dann soll das Ergebnis der Suche alsSOMEi mitp=List.nth(db, i)definiert sein.

(3 Punkte)

(4)

Aufgabe 4 Durchlaufen von Bäumen (praktisch) (6 Punkte)

Wir modellieren die Menge der binären Bäume mit dem folgenden Datentypbinbaum:

datatypebinbaum = BLATT of string | KNOTEN of binbaum ∗ binbaum

a) Implementieren Sie eine ML-Funktionausgabe: binbaum → string list, die einen binären Baumbals Para- meter nimmt und eine Liste der Zeichenreihen l zurückgibt. Die Liste l soll alle in den Blättern des Baumes gespeichterten Zeichenreihen enthälten und zwar in der gleichen Reihenfolge, wie die entsprechenden Blätter in

dem Baum vorkommen. (2 Punkte)

Beispiel:

val baum = KNOTEN(KNOTEN(BLATT "a", BLATT "b"), KNOTEN(BLATT "c",

KNOTEN(BLATT "d", BLATT "e"))) val erg1 = ausgabe baum

- erg1;

val it = ["a","b","c","d","e"] : string list -

b) Implementieren Sie eine ML-Funktionrevausgabe: binbaum → string list, die einen binären Baumbals Pa- rameter nimmt und eine Liste der Zeichenreihenl zurückgibt. Die Listel soll alle in den Blättern des Baumes gespeichterten Zeichenreihen enthälten und zwar in der umgekehrten Reihenfolge, wie die entsprechenden Blätter in dem Baum vorkommen. Die Funktionrevdürfen Sie in Ihrer Funktionsdeklaration nicht verwenden. (2 Punkte) Beispiel:

val erg2 = revausgabe baum - erg2;

val it = ["e","d","c","b","a"] : string list -

c) Implementieren Sie eine ML-Funktionspiegelung: binbaum → binbaum, die einen binären Baumbals Para- meter nimmt und einen binären Baumb0zurückgibt. Dabei istb0die gespiegelte Version des Baumesb.

(2 Punkte) Beispiel:

val erg 3 = spiegelung baum;

- erg3;

val it = KNOTEN(KNOTEN(KNOTEN(BLATT "e", BLATT "d"), BLATT "c"),

KNOTEN(BLATT "b", BLATT "a")) : binbaum

Referenzen

ÄHNLICHE DOKUMENTE

In den letzten Jahren wurden von den verschie- denen Akteuren des Gesundheitssystems in Sachsen (Sächsisches Staatsministe- rium für Soziales, Sächsische Landesärz- tekammer

Es kam deshalb wesentlich darauf an, wer die Beweislast trägt: Muss der Arzt beweisen, dass auch bei Durch- führung der Reanimation die Schäden eingetreten wären, oder

Satzung zur Änderung der Satzung Fortbildung und Fortbildungs- zertifikat der Sächsischen Landesärztekammer Bericht: Prof.. Otto Bach, Vorstandsmitglied Vorsitzender der

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

„Riehen 2000 - 2015“ und den kommunalen Richtplan vom August 2003 sowie auf die Volksabstimmung zum Moostal vom 28. November 2004 wird das Zonenänderungsverfahren für die

Im weiteren des Berichtes soll die Umsetzung der Beschlüsse der Kirchenleitung und deren Konsequenzen für die Personal- und Stellenplanung in der EKKPS dargestellt werden..

der Landessynode der ELKTH und der Synode der EKKPS zum Stellungnahmeverfahren.. zur Leitungs-, Verwaltungs- und Finanzstruktur der