• Keine Ergebnisse gefunden

Aufgabe 3 Funktionen in ML und Rekursion (Präsenzaufgabe)

N/A
N/A
Protected

Academic year: 2022

Aktie "Aufgabe 3 Funktionen in ML und Rekursion (Präsenzaufgabe)"

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 4: Software-Entwicklung 1 (WS 2008/09)

Ausgabe: in der Woche vom 10.11. bis zum 14.11.08 Abgabe: in der Woche vom 17.11. bis zum 21.11.08 Abnahme: max. zwei Tage nach Abgabe

Aufgabe 1 Elementares ML (Präsenzaufgabe)

0; 1; true ; false ; "0"; " Hallo Welt "; [1];

[1.2]; 1::2::[]; Repräsentieren diese (ML-)Ausdrücke unter-

schiedliche Werte?

int , char , bool , string , float Sind dies Typen in ML?

int -> int

( char * bool ) -> int Was haben diese beiden Typen gemeinsam?

val f = 17;

val g = fn (x: int ) => 2* x;

2+3=3 : int ;

" Hal "^" lo " : string ;

[# "H" ,#"a" ,#"l"]@ [# "a" ,#"l"] : char list ;

" Hal "@" lo " : string ; true = false : bool ;

#" "=" " : bool ; f = f : bool ; g = g : bool ; g f = g f : bool ;

fun h (x: int ) : int = h x;

Sind dies korrekt getypte Eingaben? Geben Sie die Ergebnisse der typkorrekten Ausdrücke an.

();

1+1;

1.0+1.0;

"a";

#"a";

" aa ";

#" aa ";

1 div 0;

Was sind die Typen dieser Ausdrücke?

explode " explode "; Geben Sie das Ergebnis dieses Ausdrucks an.

val s: string = " umdrehen "; Geben Sie einen Ausdruck an, der s umdreht.

"neherdmu"ist keine Lösung.Hinweis: Sie benöti- gen dazu lediglich drei Funktionen aus der Vor- lesung.

[1 ,1 ,2 ,3 ,5 ,8]; Konstruieren Sie diese Liste allein durch Ver-

wendung von_::_undnil.

(2)

val fibs : int list = [1 ,1 ,2 ,3 ,5 ,8];

null fibs ; null nil ; length fibs ; hd fibs ; tl fibs rev fibs ; hd ( tl fibs );

hd ( tl ( rev fibs ));

null ( tl ( tl ( tl ( tl ( tl ( tl fibs ))))));

Berechnen Sie.

Aufgabe 2 Syntax-, Typ- und Laufzeitfehler (Einreichaufgabe)

Überprüfen Sie die folgenden Ausdrücke auf Syntax-, Typ- und Laufzeitfehler. Wenn der Ausdruck syn- taktisch korrekt ist und einen Typ besitzt, geben Sie das Ergebnis und den Typ an. Versuchen Sie eventuell auftretende Fehler sinnvoll zu korrigieren.

Hinweis: Sie können hierfür den SML Interpreter verwenden.

val y = 2 * 2.0 ; hd ( tl [23]);

-3 = -3;

[[]] @ [[12] ,[1 ,2]];

1 :: 3 :: [3] @ [7];

[12] :: [3 ,4];

[1 ,2] :: [] @ [[]];

val x = 4 + ; fun f = 4 ;

fun f (x ,y) = if x > 0 then x + 5 else y;

Aufgabe 3 Funktionen in ML und Rekursion (Präsenzaufgabe)

a) Geben Sie eine Abstraktion für den folgenden ML Ausdruck in ML Notation an:(x+y)*(x-y) : int Können Sie auch noch andere Abstraktionen bilden?

b) Geben Sie Ihrer Abstraktion aus a) einen Namen und verwenden Sie dazu einmal eine Definition als

“Wertvereinbarung” und einmal die spezielle Syntax für Funktionen.

c) Werten Sie die ML Funktionfib : int -> int, gegeben durch folgende Definition, fürn=3 schritt- weise aus:

fun fib (n: int ): int = if n < 2 then 1 else fib (n - 1) + fib (n - 2)

Hinweis: Ersetzen Sie nach und nach Funktionsaufrufe auf Konstanten durch ihre Definition bzw. bei Basis-Funktionen durch ihr Ergebnis. Denken Sie daran, formale Parameter von Funktionen durch ak- tuelle zu ersetzen.

d) Gesucht ist eine ML-Funktionsum : int -> int, die eine ganze Zahlnals Eingabe erwartet und die Summe der erstennZahlen größer 0 berechnet. Bei negativen Eingaben soll die Funktion−1 zurückge- ben. Implementieren Sie diese Funktion auf zwei unterschiedliche Arten.

Beispiele:

sum 4 = 10 sum (~7) = ~1 sum 0 = 0

Aufgabe 4 Rekursion in ML (Einreichaufgabe)

a) Schreiben Sie eine ML-Funktion replicate: (int * string) -> string list, die eine ganze Zahl n und einen Wert w als Eingabe erwartet und eine Liste der Länge n zurückgibt, wobei alle Elemente der Liste den Wert w haben. Im Falln<0 soll die leere Liste zurückgegeben werden.

(3)

Beispiele:

replicate (3 , " Hallo ") = [" Hallo " , " Hallo " , " Hallo "]

replicate (~7 , " Welt ") = []

b) Schreiben Sie eine ML-Funktion zipl: (int list * int list) -> int list list, die zwei Listen als Eingabe erwartet und die Liste der Listen mit zwei Elementen berechnet, so dass das erste Element dieser Zweier-Liste aus der ersten und das zweite Element aus der zweiten Eingabeliste stammt.

Wenn eine der Eingabelisten kürzer als die andere ist, werden Elemente der längeren Liste verworfen.

Beispiele:

zipl ([1 ,2] , [3 ,4]) = [[1 , 3] , [2 , 4]]

zipl ([] , [1]) = []

c) Schreiben Sie eine ML-Funktionmin: int list -> int, die von einer Liste von ganzen Zahlen das Minimum bestimmt.

Beispiele:

min [12 ,4 ,67 ,5] = 4 min [] = 0

d) Schreiben Sie eine ML-Funktionnub: int list -> int list, die eine Liste l als Eingabe erwartet und alle Duplikate in l entfernt.

Hinweis: Schreiben Sie zuerst eine ML-Funktion remove: int * int list -> int listdie alle Vorkommnisse eines Elementes aus einer Liste entfernt.

Beispiel:

nub [1 ,2 ,4 ,2 ,5 ,4] = [1 ,2 ,4 ,5]

e) Schreiben Sie eine ML-Funktion primfaktoren: int -> int list, die eine ganze Zahl größer 0 als Parameter erwartet und auf die Liste ihrer Primfaktoren abbildet.

Hinweis: Schreiben Sie zunächst eine Funktion, die eine Zahl in zwei Faktoren zerlegt, wenn möglich, und sonst die Zahl selbst als Liste zurück gibt. Überlegen Sie sich dann was Sie anpassen müssen, um das gewünschte Ergebnis zu erhalten.

f) Schreiben Sie eine ML Funktionpascal: int -> int list, die für gegebenesndien-te Zeile des Pascalschen Dreiecks berechnet.

1. Zeile : 1

2. Zeile : 1 1

3. Zeile : 1 2 1 4. Zeile : 1 3 3 1 5. Zeile : 1 4 6 4 1

6. Zeile : ...

Aufgabe 5 Namensketten (Einreichaufgabe)

Namensketten sind ringförmige Schnüre, auf die kleine Würfel aufgereiht sind. Auf jedem Würfel ist ein Großbuchstabe aufgedruckt. In dieser Aufgabe wollen wir solche Ketten näher betrachten. Um eine Kette in ML darzustellen, wird sie an einer Stelle aufgetrennt und dann als Liste von Buchstaben betrachtet. Als Datentyp wirdchar listverwendet.

Beispiel: Eine Listendarstellung einer Kette mit dem Text UEBUNG

[#"U",#"E",#"B",#"U",#"N",#"G"]

a) Entwerfen Sie eine Funktion isKette: char list -> bool, die überprüft ob eine gegebene Liste von Buchstaben eine korrekte Darstellung einer Namenskette ist. Beachten Sie dabei, dass es nur Würfel mit Großbuchstaben gibt.

(4)

b) Schreiben Sie eine FunktiontoKette: string -> char list, die einen String in die Listendarstel- lung einer Namenskette überführt. Wenn der String sich nicht in eine korrekte Kette transformieren lässt, soll das Ergebnis eine leere Kette sein.

c) Ein Problem der Listendarstellung ist, dass sich ein und dieselbe Kette durch verschiedene Listen dar- stellen lässt. Entwerfen Sie eine Funktionshift: char list -> char list, die eine Kette in Lis- tendarstellung um eine Position (Würfel) rotiert.

d) Geben Sie eine Funktion shiftN: (int * char list) -> char list an, die eine Listendarstel- lung einer Kette umnPositionen rotiert.

e) Ab sofort gibt es einen zusätzlichen Würfel mit dem Aufdruck$, der den Anfang des Textes einer Kette markiert. Dieser Würfel kommt auf jeder Kette genau einmal vor. Beachten Sie, dass es jetzt keine leeren Ketten mehr gibt. Erweitern Sie die Funktionen der Aufgabenteile b) und c) entsprechend.

f) Die Standarddarstellung einer Kette ist die Listendarstellung einer Kette, bei der das erste Element der Liste der $-Würfel ist. Schreiben Sie eine Funktion toStandard: char list -> char list, die eine beliebige Kette in die Standarddarstellung transformiert.

g) Schreiben Sie eine FunktiontoString: char list -> string, die den Text einer beliebigen Na- menskette in einen String umwandelt. Der$-Würfel soll nicht in den String aufgenommen werden.

h) Damit nicht jeder sofort weiß was auf der Kette steht, soll der Text ROT13 verschlüsselt werden. Bei der ROT13-Verschlüsselung wird jeder Buchstabe durch den um 13 Stellen dahinter liegenden Buchstaben des Alphabets ersetzt. AusAwird damitNund ausXwirdK. Als Sonderfall haben wir das Zeichen $, das auch verschlüsselt$ist. Schreiben Sie eine Funktionrot13: char list -> char list, die den Kettentext ROT13 verschlüsselt. Wie können Sie einen verschlüsselten Text wieder entschlüsseln?

Aufgabe 6 Namensketten (freiwillige Zusatzaufgabe)

Wir betrachten wieder Ketten ohne den $-Würfel. Schreiben Sie eine Funktion equal: char list * char list -> booldie zwei Ketten auf Gleichheit prüft. Beachten Sie, dass eine Kette keinen ausge- zeichneten Anfang hat und evtl. spiegelverkehrt vor ihnen liegen kann. So sind z.B. die folgenden Ketten gleich:

[# "A" ,#"U" ,#"F" ,#"G" ,#"A" ,#"B" ,#"E"] und [# "U" ,#"A" ,#"E" ,#"B" ,#"A" ,#"G" ,#"F"]

Aufgabe 7 Listen und natürliche Zahlen (freiwillige Zusatzaufgabe)

Datenstrukturen erlauben es Informationen zu kodieren, bzw. darzustellen. Hier verwenden wir Listen von Unit aus ML um natürliche Zahlen darzustellen. Unsere Kodierung sei wie folgt:

• Die leere Listenilrepräsentiert die Zahl 0.

• Die Liste()::xsrepräsentiert 1 plus die Zahl, die durchxsrepräsentiert wird.

Die Zahl 5 wird also durch()::()::()::()::()::nilrepräsentiert. Positive Zahlen vom Typintwer- den mit der FunktionzahlAlsListein die Listenkodierung umgewandelt.

fun zahlAlsListe (x: int ) : unit list = if x =0 then nil else ()::( zahlAlsListe (x -1));

a) Schreiben Sie eine FunktionlisteAlsZahl (xs::unit list) : intdie eine Liste wieder zurück in eine Zahl konvertiert.

b) Zahlen in Listenkodierung lassen sich mit der Funktionaddiereaddieren. Schreiben Sie eine Funktion multipliziere (a:unit list, b:unit list) : unit list, die zwei Zahlen in Listendarstel- lung multipliziert ohne die Zahlen zwischendurch inintumzuwandeln.

fun addiere1 (a: unit list ) : unit list = ():: a;

fun addiere (a: unit list , b: unit list ) : unit list = if ( null a) then b else addiere ( tl a , addiere1 (b ));

Referenzen

ÄHNLICHE DOKUMENTE

Oben drei stumpfe Winkel Hohe Symmetrie.. Das Rhombendodekaeder ist

Gegenstück punktsymmetrisch und spiegelbildlich Schnitt mit Affensattel... Gegenstück punktsymmetrisch und spiegelbildlich Schnitt

Dem Compiler wird die Datei übergeben, die eine main-Methode enthält. Er erstellt dann zu jeder be- nutzen Klasse eine “.class”-Datei, die sich im selben Verzeichnis befindet.

In dieser Aufgabe wollen wir einen Mini-Interpreter sowohl in ML als auch in Java entwickeln, sowie Vor- und Nachteile der Implementierungen diskutieren. Wir betrachten die Sprache,

Perlenketten sind ringförmige Schnüre, auf die kleine Perlen aufgereit sind. In dieser Aufgabe wollen wir solche Ketten näher betrachten. Perlen können sechs verschiedene Farben

Eine Absage werden wir auch weiterhin den Bestrebungen hin zu einer ökonomi- sierten Checklistenmedizin und einer staatlichen Eingriffsverwaltung erteilen.. Der

Bei dem Netz sind 5 Quadrate in einer Reihe/Spalte, also kann man keinen Würfel falten. Was fällt dir bei den übrigen

Einen Bleistift, Buntstifte sowie ein Blatt Papier (in Querformat). Die ersten zwei Blöcke werden mit dem Bleistift gemalt. 1) - Male in der Mitte des Blattes ein großes Haus. -