ProInformatik: Funktionale Programmierung, 28.7

Werbung
ProInformatik: Funktionale Programmierung, 28.7-22.8.2008
Tag 3, 30.7.2008
Übungen
Für alle Programmieraufgaben gilt wie immer: testen Sie Ihr Programm in Hugs und
schreiben Sie eine Funktionsauswertung für eine konkrete Eingabe.
Aufgabe 3.1
a) In der Vorlesung wurde die Funktion zeroInPeriod vorgestellt, die prüft, ob es eine Woche
über alle Wochen 0 bis n gibt, die keinen Verkauf hatte. Schreiben Sie die Funktion
allZeroPeriod, die True zurück gibt, wenn alle Wochen von 0 bis n keinen Verkauf hatten.
b) Schreiben Sie jetzt die Funktionen
isAbovePeriod:: Int -> Int -> Bool
allAbovePeriod:: Int -> Int -> Bool
Die True zurück liefern, wenn eine oder alle Wochen einen Verkauf haben der höher ist als
der erste Eingabewert.
Aufgabe 3.2
a) Schreiben Sie eine Funktion printDigit::Char ->String, die überprüft ob die Eingabe eine Ziffer
ist und wenn dem so ist, wird der die Bezeichnung der Ziffer zurück gegeben, sonst “keine
Ziffer“:
>printDigit ‘7‘
>“sieben“
b) Schreiben Sie die Funktion nun so um, dass die Ziffer als römische Zahl dargestellt wird.
>printDigit ‘7‘
>“VII“
Aufgabe 3.3
Schreiben Sie die Funktion aufDreiZeilen:: String -> String -> String -> String die alle drei Strings zu
einem String vereint und der, wenn auf dem Bildschirm mit putStr ausgegeben, jeden String in einer
Zeile darstellt:
>putStr(aufDreiZeilen “Das“ “Haus“ “Nikolaus“)
Das
Haus
Nikolaus
Aufgabe 3.4
Schreiben Sie die Funktion duplicate::String->Int -> String, die einen String s und einen Int n>=0 hat.
Das Ergebnis ist der String s n-mal hintereinander gesetzt. Wenn n gleich Null ist, ist das Ergebnis
gleich ““. Benutzen Sie Pattern-Matching.
Aufgabe 3.5
In der Vorlesung wurde die Funktion maxSales vorgestellt, die den maximalen Verkauf über alle
Wochen 0 bis n berechnet und zurück gibt. Schreiben Sie die Funktion averageSales::Int->Float, die
den Mittelwert aller Verkäufe der Wochen 0 bis n liefert. Um einen Wert von Typ Int in einen Float
umzuwandeln, muss man ihn zunächst in einen Integer umwandeln mit toInteger und danach kann
man den Wert vom Typ Integer mit fromInteger in einen Float umwandeln.
Aufgabe 3.6
a) Schreiben Sie eine Funktion rJustify::Int->String->String, die die Eingabe n>=0 und den String
s hat und die einen String zurück gibt der s enthält und den Rest vorne mit so vielen
Leerzeichen auffüllt, dass die Länge des Ergebnisstring >=n ist. Ist die Länge von s größer als
n, dann wird s zurück gegeben.
>rJustify 4 “aa“
>“ aa“
b) Schreiben Sie nun unter Verwendung von rJustify und averageSales eine Funktion printTable,
die mit putStr aufgerufen eine Tabelle von allen Wochen 0 bis n aller Verkäufe, ihre
Gesamtsumme, sowie den Durchschnitt angibt:
> putStr(printTable 6)
Woche
Verkauf
0
3
1
2
2
7
3
5
4
4
5
3
6
2
Gesamt: 26
Durchschnitt: 4.333333
Gehen Sie das ganze im Top-Down-Verfahren an: überlegen Sie welche Funktionen printTable
aufruft, um das Gesamtergebnis zu erzeugen, überlegen Sie danach welche Funktionen wiederum
diese aufrufen müssen, usw. Versuchen Sie nicht das Ergebnis durch „ausprobieren“ zu erzielen, das
bringt nichts. Machen Sie stattdessen einen sauberen Entwurf auf dem Papier und überprüfen Sie ihn
erst dann am Computer.
Aufgabe 3.7
a) In der Vorlesung wurde die Funktion maxSales vorgestellt, die den maximalen Verkauf über
alle Wochen 0 bis n berechnet und zurück gibt. Schreiben Sie eine Funktion, die die Woche in
der der maximale Verkauf statt fand zurück gibt.
b) Überlegen Sie, was ihre Lösung macht, wenn es mehr als eine Woche mit dem maximalen
Verkauf gibt. Überlegen Sie, wie Ihre Lösung angepasst werden könnte.
c)
Schreiben Sie jetzt eine Funktion, die die Woche zurück gibt in der es keinen Verkauf gab.
Wenn so eine Woche nicht existiert, dann wird (-1) zurück gegeben.
d) Schreiben Sie eine Funktion, die die Anzahl der Wochen ohne Verkauf zurück gibt.
Aufgabe 3.8
Schreiben Sie eine Funktion double, die eine Liste vom Typ Int erhält und als Rückgabe eine Liste mit
den jeweils verdoppelten Werten der Eingabeliste zurück gibt.
Aufgabe 3.9
Schreiben Sie eine Funktion vereine, die eine Liste vom Typ Bool erhält und als Rückgabe alle
Listenelemente durch && verbindet und zurück gibt. Ist die Liste leer, so ist die Rückgabe True.
Aufgabe 3.10
Schreiben Sie die Funktion maxOccurs::[Int]->(Int,Int), die ei n Tupel zurück gibt, dessen erster Wert
das Maximum der Eingabeliste ist und dessen zweiter Wert angibt, wie oft das Maximum vorkommt.
>maxOccurs [1,5,3,5,2,5]
>(5,3)
Herunterladen