*Gedächtnisprotokoll SWTPP 2. Klausur, erster Termin WS 17/18 (am besten auch Punktanzahl angeben, falls vorhanden) *1. Aufgabe Codequalität (3P) a) Markieren Sie, welcher der drei gegebenen Kontrollflussgraphen die meisten unterschiedlichen Pfade ermöglicht (1P). b) McCabe Wert für den Graph aus a) errechnen (Parameter p=1) (1P). c) (MC) Welches Refactoring bietet sich an wenn einige Methoden zu hohe Verschachtelungstiefe aufweisen? (1P) * Klassen Zusammenfügen * Methoden extrahieren * Variablen umbennen * Halstead *2. Aufgabe Testen (4P) Folgender Java-Code war gegeben: boolean shiftOne(String s1, String s2) { if (s1.length() == s2.length() && s1.length > 0) { for (int i = 0; i < s1.length(); i++) { if (s1.charAt(i) + 1 != s2.charAt(i)) { return false; } } } else { return false; } return true; } Die Methode shiftOne gibt True zurück, wenn String s1 (jeder Buchstabe um 1 verschoben) == String s2. a) Testfälle Verfollständigen bis vollständige Zeilenüebrdeckung gilt (3P) 3x assert_____(shiftOne("hallo",_________)); b) Ein weiterer Testfall wie a) der einfache Bedingungsüebrdeckung erzeugen sollte (1P) assertFalse(shiftOne(______,______)); *3. Aufgabe Haskell (4P) a) Rekursive Funktion squaresum schreiben, die die Summe der ersten n Quadratzahlen errechnet: squaresum :: Int -> Int (1P) Bsp.: squaresum 4 == 0 + 1*1 + 2*2 + 3*3 + 4*4 == 30 b) Die gleiche Funktion mit leicht abgewandelter Signatur und Tail Call Optimierung (1P) squaresum :: Int->Int->Int Bsp.: squaresum 4 0 == 30 c) Die gleiche Funktion mit Listenfuktional foldr und Range ohne Rekursion (2P) squaresum :: Int->Int squaresum n = foldr ______________________ *4. Aufgabe Haskell (5P) a) Signatur Verfollständigen die so allgemein wie möglich ist (1P). max :: ____________________ max x y = if x > y then x else y b) Richtige Signatur von (:) Funktion (Listen) ankreuzen (1P) * [a] -> [a] -> [a] * a -> [a] -> [a] * (a -> [a]) -> [a] * b -> [a] -> [b] c) Partial Application Funktion positive schreiben, welche zurückgibt ob eine Zahl größer gleich 0 ist. Signatur: Int -> Bool (1P) d) Rekursive Funktion positives schreiben welche nur positive Zahlen aus einer Liste filtert. (1P) positives :: [Int] -> [Int] e) Die gleiche Funktion mit Listenfuktional filter ohne Rekursion (1P). *5. Aufgabe Haskell (6P) data Nukleobase = Ad | Gu | Cy | Th data Helix = Paar Nukleobase Nukleobase Helix | Stop a) (MC) Was ist der Datentyp von Helix? (1P) * Parametrisiert * Rekursiv * Typklasse * Binärbaum b) Funktion partner schreiben, die für jeden Typ aus Nukleobase einen entsprechenden Partner zurückgibt (die Paare waren gegeben) (1P) partner :: Nukleobase -> Nukleobase c) DNA Kette als Helix Daten angeben für sowas wie Ad-Cy,Gu-Th(1P) d) Typklasse Eq auf Helix implementieren. Zwei Helixe sind gleich, wenn sie die selbe Länge haben und jedes ihrer Nukleobasen Paare identisch sind (auf Nukleobase gilt Eq schon) e) Funktion schreiben, die aus Liste von Nukleobasen eine Helix erstellt, wobei die richtigen Partner hinzugefügt werden. z.B.: [Ad,Gu] wird zu Helix wie in c erstellt. func :: [Nukleobase] -> Helix *6. Aufgabe Prolog (8P) Gegeben war eine Basis mit Regeln, so ähnliche wie im Tutorium die Städte nur mit Wachtürmen und Dörfern, dazu ein passender Graph. Bsp.: node(a). node(b). a ------ b ------ c node(c). ... sieht(a,b) sieht(b,c) ... a) MC nur ein Kreuz pro Anfrage(4 Anfragen): Anfrage True False Fehler sieht(c, t1) = X. sieht(a,c). X = c, Y = "o", Z = 2, [X,Y,Z] = L. X(c), sieht(a,b). b) Prädikat verbunden schreiben (wenn a b sieht , sieht b auch a). verbunden(X,Y) :- _________________________. c) Grad eines Knoten bestimmen (anzahl verbundener Kanten) grad(X,R) :- findall(________,________,_______), length(____,R). d) Prädikat Kette, wie Route im Tut. Von X nach Y, keinen doppelt besuchen, in richtiger Reihenfolge ausgeben. Bsp.: kette(a,b,[ ],R) = [a,b,c] kette(X,Y,__,[X,Y]) :- ___________________________. kette(X,Y,__,[X|RT]) :- __________________________. e) Prädikat paarweise schreiben, welches bei zwei Listen L1,L2 true zurückgibt falls sie paarweise verschieden sind, ansonsten false. Dabei soll das Letzte Element von L1 nicht mit beachtet werden. f) Prädikat schreiben, welches zwei paarweise verschiedene Ketten von X nach Y findet. -(X,Y,___,___) :- ____________________.