6. Übung Informatik A Klaus Kriegel WS 09/10 Abgabe: 02.12.2009, 10:00 Uhr Allgemeine Anforderungen bei Programmieraufgaben: Die Haskell–Dateien mit dem Code müssen per email an den Tutor geschickt werden. Zusätzlich sollte der Code gedruckt oder handschriftlich abgegeben werden. Alle Lösungen müssen die folgenden Forderungen erfüllen: • Auswahl sinnvoller Bezeichner für alle Funktionen; Bereits in der Aufgabenstellung spezifizierte Funktionsnamen sind zu übernehmen. • Für alle neu definierten Funktionen ist die Signatur anzugeben. • Die Programme müssen nicht nur lauffähig, sondern auch mit verschiedenen Eingabebeispielen getestet sein. • Ausreichende Kommentierung der Lösungen; Aufgabe 0: Hugs (0 Punkte) Machen Sie sich mit Hugs vertraut! Implementieren Sie einige der Beispiele, die in Vorlesung und Übung besprochen wurden, bauen Sie absichtliche Fehler ein (Funktionsname mit Großbuchstaben am Anfang, Wächtersymbol nicht eingerückt, Parameterliste widersprüchlich zur Signatur, . . .) und sehen Sie sich die Fehlermeldungen an. Aufgabe 1: Warming up (8 Punkte) Implementieren Sie die folgenden Funktionen in Haskell. a) Die Funktion avgIncluded :: Int -> Int -> Int -> Bool erhält drei beliebige Int–Werte als Eingabe und soll True ausgeben, wenn einer der Werte der Durchschnitt dieser drei Werte ist, sonst False. Der Gebrauch anderer Datentypen sollte dabei möglichst vermieden werden. b) Die Funktion smallestDifference3 erhält drei beliebige Int–Werte als Eingabe und soll den kleinsten Absolutbetrag einer Differenz aus zwei der drei Eingabewerte ausgeben. c) Die Funktion smallestDifference4 soll das analoge Problem wie in b) für vier Eingabewerte lösen. Versuchen Sie dazu, die Funktion aus b) zu verwenden. d) Die Funktion antival4 erhält vier beliebige Bool–Werte und soll die Antivalenz aus diesen Werten bestimmen. Aufgabe 2: Polynome (1 + 3 + 3 Punkte) Ein reelles Polynom vom Grad n ist ein Ausdruck der Form an xn + an−1 xn−1 + . . . + a1 x + a0 wobei alle Koeffizienten ai reelle Zahlen sind und an 6= 0 ist. Man kann ein Polynom an einer Stelle r ∈ R auswerten, indem die Variable x durch die Zahl r ersetzt und der Wert des so entstandenen arithmetischen Ausdrucks ausgerechnet wird. a) Implementieren Sie eine Haskell-Funktion eval3 :: Float -> Float -> Float -> Float -> Float -> Float zur Auswertung von Polynomen vom Grad 3, wobei die erste Eingabestelle dem Wert r und die folgenden Stellen die Koeffizienten in der Reihenfolge a3 , a2 , a1 , a0 angeben. b) Implementieren Sie eine Haskell-Funktion nullstellenTest2 :: Float -> Float -> Float -> Bool, die für ein durch eine Koeffizientenfolge a2 , a1 , a0 gegebenes Polynom vom Grad ≤ 2 testet, ob es eine reelle Nullstelle hat. Achtung: Hier kann a2 auch den Wert 0 haben, dann ist der Grad kleiner als 2. c) Implementieren Sie eine Haskell-Funktion smallestVal :: Float -> Float -> Float -> Float, die für ein durch eine Koeffizientenfolge a2 , a1 , a0 gegebenes Polynom vom Grad ≤ 2 den kleinsten Absolutbetrag berechnet, den das Polynom bei der Auswertung annehmen kann. Hinweis: Überlegen Sie, was das mit der Teilaufgabe b) zu tun hat.