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)