Fachbereich Informatik & Mathematik (12) Professur für Graphische Datenverarbeitung Prof. Dr. Detlef Krömker Ashraf Abu Baker Varrentrappstr. 40-42 60486 Frankfurt am Main Tel.: +49 (0)69798-24600 Fax: +49 (0)69798-24603 EMail: [email protected] Aufgabe 5.1: (continue, break, Datenstrukturen) a) (1 Punkt) continue Programme, die unnötige Rechenoperationen durchführen, werden als ineffizient bezeichnet. Skript3 aus Aufgabe 4.3.c des 4. Übungsblattes ist deshalb ineffizient, weil die Summe in der inneren Schleife bei jedem Durchlauf der äußeren Schleife erneut gebildet wird, was ja nicht nötig ist. Effizienter wäre es, wenn die innere Schleife nur einmal die Summe berechnen und das Ergebnis in einer Variable s speichern würde. Die äußere Schleife soll nun mit Hilfe einer booleschen Variable b erkennen, ob die innere Schleife schon mal durchgelaufen ist. Ist das der Fall, so greift sie auf den in s gespeicherten Wert zu. Verbessern Sie Skript3 so, dass die Summe wie oben beschrieben nur einmal berechnet wird. Die Verschachtelung der beiden Schleifen muss bestehen bleiben. Ist das Skript jetzt effizient? Begründen Sie kurz Ihre Antwort! Hinweis: continue (0,5 Punkte) break Nun soll davon ausgegangen werden, dass die Liste L2 unsortiert ist und sowohl positive als auch negative Zahlen enthält. Statt die Summe aller Zahlen zu bilden, soll nun nur die Summe der Zahlen gebildet werden, welche vor der ersten negativen Zahl in der Liste stehen. Mit anderen Worten: Steht die erste negative Zahl an Index i, so enthält die Summe s nur noch die Elemente L2[0]+L2[1]+...+L2[i-1]. Beachten Sie, dass die Summe hierbei nur noch positive Zahlen enthält. Hinweis: break b) (1 Punkt) Tupel (tuples) Vervollständigen Sie die unten stehende Tabelle nach Ausführung des folgenden Skriptes: [Skript-Anfang] S="A string is an immutable ordered sequence of characters" L="A list is a mutable ordered sequence of items" T="A tuple is an immutable ordered sequence of items" I="An item can be a number, a string, a data structure or an object" n=5 T1=5, T2=tuple(["c",T1]) Liste=list(L[2:4]) Liste=Liste+["st",["e"]] T3=(n,T1, Liste,T[:len(T)/2]) T4=7,tuple(T1),(),T[0:3] [Skript-Ende] Ausdruck Wert des Ausdrucks Typ des Ausdrucks T3[1:1] T4[0]*T3[1][0] tuple(T3[2]) 2*T3[2][3][0] (T4[1],Liste[3][0]) Begründen Sie kurz warum die folgenden Anweisungen unzulässig sind: T2[0]="c" T4[0]=T1[0] Bemerkung: Wir empfehlen, die Aufgabe (zuerst) durch Überlegen zu lösen und nicht gleich den Interpreter zu benutzen. Das könnte in einer Klausur sehr hilfreich sein. c) (1 Punkt) Mengen (sets) A, B, C, D und E sind im folgenden Skript Mengen. [Skript-Anfang] S="A set is a mutable unordered collection of unique items" A= set(tuple("hello")) h=3 B=set("2*h-1") C=set(list([1,-1])) D= set([1-len(C)]) E=A^B [Skript-Ende] Schreiben Sie ein einfaches übersichtliches Python-Skript das die folgenden Mengenoperationen durchführt und die Ergebnisse auf dem Bildschirm ausgibt: M1 = A ∪ B M2 = C ∩ D M3 = B \ C M 4 = E \ ((A ∪ B) \ (A ∩ B)) M5 = Potenzmenge(C) M6 = Komplementmenge von D bezüglich der Grundmenge C. Begründen Sie kurz warum die folgende Anweisung fehlerhaft ist: print 3*A[0] d) (1 Punkt) Dictionaries [Skript-Anfang] D="A dictionary is a mutable unordered collection of key/item pairs" DS="Lists, sets, tuples, dictionaries, queues and stacks are data structures" dic={"1":"k","b":5,2:dict([tuple((-1,""))]),"3":4} [Skript-Ende] Welchen Wert gibt die Anweisung print dic[dic["3"]/2][-1*dic["b"]/5] auf dem Bildschirm aus? Begründen Sie Ihre Antwort! Begründen Sie kurz warum die folgende Anweisung unzulässig ist: print "o"+dic[1], Aufgabe 5.2: (Funktionen) a) (1 Punkt) (formale Parameter) Nennen Sie den Unterschied zwischen den obligatorischen (mandatory) und den optionalen (optional, default) Parametern bei Funktionsaufrufen in Python. Wie oft werden die optionalen Parameter evaluiert? Hinweise zur dieser Aufgabe erhalten Sie von Ihrem Tutor. b) (1,5 Punkte) (call-by-value, call-by-reference) Was versteht man unter call-by-value und call-by-reference beim Aufruf einer Funktion (Prozedur, Methode) in einer Programmiersprache? Was ist eine Referenz? Welche Arten der Parameterübergabe kennt Python? c) (1 Punkt) Gegeben sei das folgende Skript: [Skript-Anfang] x=10 L=list(xrange(x)) def f(x,z): x=x-1# change x del z[x]# change z print "value of x before calling f: ",x print "value of L before calling f: ",L f(x,L) print "value of x after calling f: ",x print "value of L after calling f: ",L [Skript-Ende] Erläutern Sie, warum eine Veränderung von z im Funktionsrumpf eine Veränderung von L impliziert, während eine Veränderung von x im Funktionsrumpf keinerlei Wirkung auf x außerhalb der Funktion hat. d) (1,5 Punkte) Positionsargumente (positional arguments), Schlüsselargumente (keyword arguments) Was sind Positions- und Schlüsselargumente einer Funktion, woran erkennt man sie, in welcher Reihenfolge kommen sie im Funktionskopf und in welchen Datenstrukturen werden sie übergeben? Geben Sie ein einfaches Beispiel für eine Funktion, welche sowohl Positions- als auch Schlüsselargumente übergeben bekommt. Die Funktion soll alle übergebenen Parameter mit einer print-Anweisung auf dem Bildschirm ausgeben. Hinweis: siehe Python-Tutorial Abschnitt 4.7.2 Aufgabe 5.3: (Rekursion) a) (1,5 Punkt) Rekursionstiefe Was ist der Unterschied zwischen rekursiven und iterativen Programmen? Stellen Sie sie gegenüber und nennen Sie ihre Vor- und Nachteile! Wie groß ist die maximale Rekursionstiefe einer rekursiven Funktion in Python? Mit anderen Worten: Wie oft darf sich eine rekursive Funktion in Python aufrufen? b) (1 Punkt) ggt Der euklidische Algorithmus ist ein rekursives Verfahren zur Bestimmung des größten gemeinsamen Teilers (ggT) zweier natürlicher Zahlen a und b. Er lässt sich wie folgt formulieren: ggt(a,b): Schritt1: wenn b = 0, dann ist a=ggt(a,b), gebe a aus, Ende, sonst gehe zu Schrit2 Schritt2: a=b, b= a modulo b, gehe zu Schritt1. a modulo b ist dabei der Rest der ganzzahligen Division von a durch b. Schreiben Sie eine rekursive Funktion zur Bestimmung des größten gemeinsamen Teilers zweier natürlichen Zahlen. c) (1,5 Punkte) rekursive Zahlenfolgen Gegeben sei die folgende, auf natürliche Zahlen rekursiv definierte Zahlenfolge: 0, wenn n = 0 a ( n) = 2 , wenn n = 1 n n +1 ), sonst 0,4 * a ( ) + 0,7 * a ( 4 2 Schreiben Sie eine rekursive Funktion, welche die Elemente von a für ein gegebenes n berechnet und auf dem Bildschirm durch Komma getrennt ausgibt. Zeichnen Sie für n=3 den zugehörigen Rekursionsbaum. d) (1,5 Punkte) Binomialkoeffizient n Der k-te Binomialkoeffizient der binomischen Formel (a + b) n kann sowohl iterativ als auch k rekursiv wie folgt definiert werden: n n! = Iterativ: k k!(n − k )! 1, wenn k = 0 oder n = k n n −1 Rekursiv: = n −1 + , sonst k k k −1 Implementieren Sie die rekursive Variante als Python-Funktion. Aufgabe 5.4: Lerngruppenaufgabe (Module) a) (0,5 Punkte) Importieren von Modulen Was sind Module in Python? Sie haben Ihre Module irgendwo in Ihrem Rechner gespeichert. Was müssen Sie nun tun, damit die Python-Umgebung beim Importieren der von Ihnen erstellten Module sie findet und lädt? b) (1,5 Punkte) Modul matrix Erstellen Sie ein Python-Modul namens matrix. Das Modul soll zwei Funktion transpose(A) und mult(A,B,C) zur Verfügung stellen. transpose bekommt eine Matrix Amxk und liefert die transponierte Matrix von A zurück. mult erhält als Eingabe drei Matrizen Amxk , Bkxn und Cmxn , bildet das Produkt von Amxk und Bkxn , schreibt das Ergebnis in Cmxn und liefert Cmxn als Rückgabewert zurück. c) (3 Punkte) Modul converter Schreiben Sie ein zweites möglichst effizientes Modul namens converter. Das Modul soll eine Funktion convert(number, base1, base2) zur Verfügung stellen, welche eine natürliche Zahl zur Basis base1 bekommt und sie in eine Zahl zur Basis base2 konvertiert und zurückgibt. Das Modul soll u. a. eine Hilfsfunktion checkSyntax(number, base1, base2) implementieren, die sicherstellt, dass base1 und base2 unterschiedliche Zahlen zwischen 2 und 16 sind und, dass number tatsächlich eine Zahl zur Basis base1 ist. Die Zahl muss nicht immer zunächst in eine Dezimalzahl und anschließend in eine Zahl zur gegebenen Basis konvertiert werden. Die direkte Konvertierung soll u. Umständen möglich sein. Hinweis: Zur Implementierung, siehe Aufgabe 2.3 des zweiten Übungsblatts.