6. ¨Ubung Informatik A WS 09/10

Werbung
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.
Herunterladen