Lange Nacht des Python Programmierens I. Rogina 21. Januar 2010 Allgemeines In diesem Dokument finden Sie Programmieraufgaben (meist mit Skelett mit zu füllenden Lücken), Aufgaben zum Ergebnisse vorhersagen, Aufgaben zum Fehlersuchen und Aufgaben mit Flussdiagrammen. Bitte versuchen Sie sich nicht auf Minimalanforderungen der Klausur zu tunen. Wenn Sie die Programmieraufgaben verstanden haben, werden Sie die Lücken, die in die Quellcodes geschossen würden auch ausfüllen können, und Sie können vorhersagen, was die Programme für Ausgaben produzieren, und sie können Fehler endecken, die jemand hinein machen würde. Wenn Sie aufs Programmieren verzichten und versuchen nur mit den Aufgabentypen auszukommen von denen Sie vermuten oder hoffen, dass Sie genau so in der Klausur dran kommen, werden Sie nie das nötige Verständnis entwickeln. Ich schätze die primäre Fokusierung auf vermutlich klausurtypische Aufgabentypen eher als kontraproduktiv ein, weil ich glaube, dass sie dazu verleitet, die Muskulatur statt das Gehirn zu trainieren. Übersicht Im folgenden finden Sie reichlich Aufgaben unterschiedlichster Art. Vermutlich werden Sie nicht alle an einem Abend schaffen. Suchen Sie sich die Aufgaben, die Sie bearbeiten wollen, aus der folgenden Tabelle aus. Zu den Programmieraufgaben erhalten Sie auch Skelette, damit Sie nicht alles abtippen müssen. Diese Skelette sind in der Aufgabenstellung mit abgedruckt. Ebenso finden Sie die erwarteten Ausgaben der Programme, damit klar wird, was sie tun. Die Lösungen bekommen Sie natürlich auch, aber nicht von Anfang an, um Ihnen dabei behilflich zu sein, den inneren Schweinehund zu besiegen, der vorzeitig in die Lösung schauen will bzw. vorzeitig auf irgend eine doofe Party will und Ihnen versucht einzureden, mit dem Besitz der Lösungen hätten Sie diese schon im Kopf und alles sei in bester Ordnung und Sie müssten nur noch am Vorabend der Klausur kurz mal reinschauen. Die Lösungen sind alle einzeln getestet und geprüft. Aber das können Sie ja mit Hilfe des Computers auch selbst tun. Ich empfehle Ihnen, Zwecks Frustvermeidung, mit der einen oder anderen “billigen Aufgabe zu beginnen und sich im Laufe des Abends zu ” steigern. Einige der Aufgaben sind als Preisrätsel gekennzeichnet. Wenn Sie eine dieser Aufgaben gelöst haben, dann schicken Sie die Lösung per E-Mail an [email protected] und melden Sie sich mit Sirenengeheul und fordern den ausgeschriebenen Preis ein (bzw. ein Lob, falls Ihnen jemand zuvor gekommen ist – Eingang der E-Mail zählt). Auch unter den Preisaufgaben gibt es unterschiedliche Schwierigkeitsgrade – erkennbar an den ungefähren Klausuräquivalentpunkten. Wenn Sie vor Mitternacht nach Hause gehen, demonstrieren Sie, dass Sie schon gut genug vorbereitet sind, um Ihre gewünschte Note zu erzielen, oder dass sie gar nicht vor haben zu bestehen, oder dass Ihr Studium in Ihrer Prioriätenskala nicht besonder hoch aufgehängt ist. 1 Nr. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. Seite 3 3 3 3 3 4 4 5 5 5 6 6 6 6 7 7 8 8 9 9 9 10 10 11 11 13 14 16 16 17 17 17 17 18 18 18 18 18 19 20 20 21 21 21 22 22 22 23 23 23 24 25 25 26 26 26 27 27 27 28 28 29 29 30 30 31 31 31 32 32 33 33 34 34 35 35 36 36 37 37 37 38 38 39 39 40 40 40 41 42 42 42 43 43 43 44 44 44 45 Aufgabe Zwei Zahlen addieren Wiederholtes addieren Zwei Zahlen dividieren Kleinster Listenwert Kleinste Listenposition Sequentielle Suche Liste umdrehen Sequentielle Suchfunktion Listen addieren Listensumme Listenminimum Listenminimum Listensumme Zahl in Text wandeln Text in Zahl wandeln Texte addieren Listensumme gerade? Palindromtest Palindromtest 3 Werte sortieren Liste Sortieren Teiler zählen Nullstellen (Halbierung) Funktionsplotter Fehlersuche Ausgabevorhersage Flussdiagramme Plus gleich Mal Perfekte Zahlen Währungsumrechner Anagramme Brüche addieren Primfaktorzerlegung Hasen sortieren Ziffernreihenfolge Hunderterstelle Stellenzahl einer Zahl Zweierlogarithmus Nullen zählen Nichtnullprodukt Geometrische Reihe Nichtnullprodukt Verschiedene zählen Polarkoordinatendarstellung Prüfung auf Full House Quadratische Gleichung Ungefähr-Vergleich Hornerschema Faire Aufteilung prüfen Exakte Teilsumme Elementweise größer Disjunktivitätsprüfung Summe ausgewählter Elemente Quadrat ohne Multiplikation Divisonsrest ohne Division Differenz ohne Minus Funktionsaufruf (Produkt) Mehrwertsteueranteil Inflationsrate Klammercheck Elemente zählen Teilstring finden Geldüberweisung Run-Length-Encoding Liste als Rückgabewert Quersumme rekursiv Wort rekursiv umdrehen Induktive Suche Induktive Suche Kompakt Induktive Wurzelberechnung Striche Zeichnen Sinus/Cosinus megacool Wochentag bestimmen Datum weiterschalten ggT rekursiv n-Damen Zeiten addieren Fließkomma zu Ganzzahl runden Kleinstes gemeinsames Vielfaches Wert einer Geldanlage Zinsatzsuche für Sparvertrag ISBN Prüfziffer bestimmen Notenhistogramm malen Numerische Integration Biblischer Stammbaum Wert einer Geldanalge Stellenzahl einer Zahl Länge einer Tour Zahl = Summe zweier Quadrate? Billigster Laden Skalarprodukt Matrixprodukt Determinante Durchschnittsgeschwindigkeit Durchfallquote Primfaktoren Primfaktoren Bibelopa for in while wandeln Rekursion? – – – – – – – – – Induktion Induktion Teile-Herrsche Teile-Herrsche – – – Teile-Herrsche – Induktion – – Teile-Herrsche ja – – – – – – – ja – – – – – – ja Teile-Herrsche Teile-Herrsche induktiv induktiv – – – – – – – ja alles alles – – – – – – – – alles Induktion – – – Induktion ja Induktion Induktion Induktion Induktion birekursiv – – ja oh ja – – – – – – – – ja Induktion Induktion – – – – – allerdings – Induktion – ja – – 2 Empf. * * * * ** ** **** ** *** **** **** **** **** *** *** *** **** *** *** ** ** *** *** * **** ***** **** ** ** ** ** ** ** ** ** ** ** ** ***** **** ***** **** ** ** ** ** ** **** ** **** ***** ***** ** ** ** ** *** ** ** ** ***** **** *** * **** **** **** **** * ** *** ** ** ** *** * *** ** ** *** ** ** ** *** ***** **** *** *** ** ** * ** ** ** *** *** ** ** ** UKÄP 0 0 0 1 2 2 6 4 4 4 4 4 5 5 5 6 5 6 7 3 5 6 6 6 22x2 je 2 bis 4 je 4 bis 8 20 10 15 30 10 8 7 8 2 3 5 6 6 5 3 3 3 4 3 2 4 5 8 3+5+5 7+7 4 4 5 3 2 2 1 6 3+6+7 5+7 5 15 1 2 3 5 10 4 2 8 7 7 8 20 6 4 5 4 15 3 5 5 6 4 4 5 8 7 4 7 11 3 7 4 7 7 4 Preis Kindercountry Gummibärentüte Kinderriegel Red Bull Dose Prosecco Nervenfutter Jules Mumm Kinderriegel Mini-Hanutas Respekt Pfirsichcocktail Mumm Sekt Schokokekse Marsriegel Riesenlob Dose Erdnüsse Hochschullineal Snickers Rotkäppchen Nuts Twix Mini Hanutas Colorado Kindercountry Mini Hanutas Kinderriegel roher ESP Chip Mini Hanutas 9V Blockbatterie Rumkugeln Aufgabe 1 Schreiben Sie ein Programm, das den Benutzer auffordert, zwei Zahlen x und y einzugeben und dann die Summe der beiden eingegebenen Zahlen auf dem Bildschirm ausgibt. (Ein Skelett für diese Einfache Aufgabe gibt es nicht.) Auf dem Bildschirm sollte dann z. B. das erscheinen: x = 7 y = 5 x+y = 12 Aufgabe 2 Verpacken“ Sie das Programm von Aufgabe 1 in eine Schleife, so dass es immer wieder ” abläuft, und zwar so lange bis der Benutzer für x und y jeweils null eingegeben hat. Aufgabe 3 Schreiben Sie ein Programm, das den Benutzer auffordert, zwei Zahlen x und y einzugeben und dann den Quotienten x/y auf dem Bildschirm ausgibt. Wenn allerdings y gleich null sein sollte, sagt das Programm dass das nicht geht. Auf dem Bildschirm sollte z. B. x = 14 oder x = 2 y = 3 y = 0 x/y = 4 Division durch 0 geht nicht. erscheinen. Aufgabe 4 Schreiben Sie ein Programm, das von einer gegebenen Liste den Wert des kleinsten a = [18,15,22,25,11,29,31] Elements ausgibt. Verwenden Sie dazu das n = len(a) nebenstehende Programmskelett. Ersetzen Sie auch hier nur die ausgeixte stelle durch XXXXXXXXXX (ein paar Zeilen) Python-Code. Verzichten Sie auch hier aufs Klugscheißen und verprint "min(",a,") ist",min wenden Sie nicht die von Python vordefinierte Funktion sort(). Ersetzen Sie auch hier nur die ausgeixte stelle durch (ein paar Zeilen) Python-Code. Verzichten Sie auch hier aufs Klugscheißen und verwenden Sie nicht die von Python vordefinierte Funktion sort(). Die Ausgabe sollte dann wie folgt aussehen: min( [18, 15, 22, 25, 11, 29, 31] ) ist 11 Wenn Sie in Ihrer Lösung eine while-Schleife verwendet haben, dann probieren Sie es noch einmal mit einer for-Schleife. Und wenn Sie eine for-Schleife verwendet haben, dann machen Sie es mit einer while-Schleife. Aufgabe 5 3 Schreiben Sie ein Programm, das zu einer gegebenen Liste die Position berechnet, an a = [18,15,22,25,11,29,31] welcher das kleinste Element steht. Vern = len(a) wenden Sie dazu das nebenstehende Programmskelett. Bemerkung: das vorderste XXXXXXXXXX Elemente steht an der 0-ten Position, das zweitvorderste an der 1-ten Position usw. print "min(",a,") steht an Stelle",min (Informatiker fangen halt gerne bei 0 an zu zählen.) Ersetzen Sie auch hier nur die ausgeixte stelle durch (ein paar Zeilen) Python-Code. Die Ausgabe sollte dann wie folgt aussehen:· min( [18, 15, 22, 25, 11, 29, 31] ) steht an Stelle 4 Aufgabe 6 Schreiben Sie ein Programm, das vom Benutzer die Eingabe einer Zahl anfordert und dann diese Zahl in einer gegebenen Liste sucht. Am Ende soll auf dem Bildschirm ausgegeben werden, ob die Zahl in der Liste vorkommt oder nicht. Verwenden Sie dazu das nebenstehende Programmskelett und ersetzen Sie nur die ausgeixte Stelle. Verzichten Sie auf die Verwendung der von Python schon vordefinierten Funktion index(). a = [ 18, 15, 22, 24, 11, 29, 31 ] x = input("Was soll ich suchen? ") XXXXXXXXXX if gefunden: print x,"kommt in",a,"vor" else: print x,"kommt nicht in",a,"vor" Wenn sie das Programm (z.B. zwei mal wie unten dargestellt) aufrufen sollte die Ausgabe wie folgt aussehen: Was soll ich suchen? 14 14 kommt nicht in [18, 15, 22, 24, 11, 29, 31] vor ... Was soll ich suchen? 22 22 kommt in [18, 15, 22, 24, 11, 29, 31] vor Aufgabe 7 Schreiben Sie ein Programm, das die Elemente einer Python-Liste umkehrt, so dass hinterher das ursprünglich vorderste Element ganz hinten und das a = [ 18, 15, 22, 24, 11, 29, 31 ] ursprünglich hinterste Element ganz vorne steht. Verwenden Sie dazu das nebenstehende Skelett, und print "vorwaerts: ",a ersetzen die die ausgeixte Stelle mit (ein paar Zeilen) Python Code, so dass die Ausgabe dann wie un- n=len(a) ten dargestellt aussieht. (Ändern Sie aber nichts am XXXXXXXXXX Rest des Programms, nur die ausgeixte Stelle. Und verwenden Sie nicht die von Python schon vordefi- print "rueckwaerts: ",a nierte Funktion reverse()). Erzeugen Sie auch keine neue Liste. Ausgabe: vorwaerts: [18, 15, 22, 24, 11, 29, 31] rueckwaerts: [31, 29, 11, 24, 22, 15, 18] 4 Aufgabe 8 Schreiben Sie eine Funktion finde(L,z), die in der ihr übergebenen Liste L nach der ihr übergebenen Zahl z sucht und genau dann True zurückliefert, wenn z in L vorkommt. Verwenden Sie dazu das nebenstehende Programmskelett und ersetzen Sie nur die ausgeixte Stelle. Die erwartete Ausgabe ist dann wie bei Aufgabe 6, nur dass diesmal nicht eine Variable namens gefun” den“ verwendet wird, sondern direkt der Rückgabewert der Funktion finde(. . . ). Was soll 29 kommt ... Was soll 17 kommt a = [ 18, 15, 22, 24, 11, 29, 31 ] def finde(L,z): XXXXXXXXXX x = input("Was soll ich suchen? ") if finde(a,x): print x,"kommt in",a,"vor" else: print x,"kommt nicht in",a,"vor" ich suchen? 29 nicht in [18, 15, 22, 24, 11, 29, 31] vor ich suchen? 17 in [18, 15, 22, 24, 11, 29, 31] vor Aufgabe 9 Schreiben Sie eine Funktion Summe(L1,L2), die zwei Listen als Argumente erhält und als Rückgabe wert eine weitere Liste zurückgibt, deren i-tes Element die Summe der beiden i-ten Elemente der zwei Argumentlisten ist. Ersetzen Sie im nebenstehenden Programmskelett die ausgeixte Stelle durch (ein paar Zeilen) Python Code, so dass dann das Programm die unten dargestellten Ausgaben auf dem Bildschirm macht. (Beachten Sie, dass sich die Inhalte der Listen a und b nicht ändern dürfen.) a = [18, 15, 22, 24, 11, 29, 31] b = [11, 16, 30, 20, 10, 28, 28] Summe = [29, 31, 52, 44, 21, 57, 59] a = [ 18, 15, 22, 24, 11, 29, 31 ] b = [ 11, 16, 30, 20, 10, 28, 28 ] def Summe(L1,L2): XXXXXXXXXX c = Summe(a,b) print "a =",a print "b =",b print "Summe =",c Aufgabe 10 Schreiben Sie eine rekursive Funktion Summe(L,n), die nach dem Schema der Induktion die Summe der ersten n Elemente der ihr übergebenen Liste L berechnet. (In der Klausur gäbe es 0 Punkte, wenn sie die Funktion nicht induktiv programmieren würden. Bei dieser Aufgabe bedeutet das auch, dass Sie keine Schleife verwenden dürfen. 5 a = [ 18, 15, 22, 24, 11, 29, 31 ] def Summe(L,n): XXXXXXXXXX print "Summe =",Summe(a,len(a)-1) Aufgabe 11 Schreiben Sie eine rekursive Funktion Minimum(L,n), die nach dem Schema der Ina = [ 18, 15, 22, 24, 11, 29, 31 ] duktion das kleinste der ersten n Elemente der ihr übergebenen Liste L berechnet. def Minimum(L,n): (In der Klausur gäbe es 0 Punkte, wenn sie XXXXXXXXXX die Funktion nicht induktiv programmieren würden. Bei dieser Aufgabe bedeutet print "Minimum von",a,"ist", das auch, dass Sie keine Schleife verwenden print Minimum(a,len(a)-1) dürfen. Die Ausgabe sind dann so aus: Minimum von [18, 15, 22, 24, 11, 29, 31] ist 11 Aufgabe 12 Schreiben Sie eine rekursive Funktion Minimum(L,von,bis), die nach dem Schema a = [ 18, 15, 22, 24, 11, 29, 31 ] Teile-und-herrsche das kleinste der zwischen der von-ten und bis-ten Position stedef Minimum(L,von,bis): henden Elemente der ihr übergebenen LisXXXXXXXXXX te L berechnet. (In der Klausur gäbe es 0 Punkte, wenn sie die Funktion nicht inprint "Minimum von",a,"ist", duktiv programmieren würden. Bei dieser print Minimum(a,0,len(a)-1) Aufgabe bedeutet das auch, dass Sie keine Schleife verwenden dürfen. Die Ausgabe sind dann so aus: Minimum von [18, 15, 22, 24, 11, 29, 31] ist 11 Aufgabe 13 Schreiben Sie eine rekursive Funktion Summe(L,von,bis), die nach dem Schema Teilea = [ 18, 15, 22, 24, 11, 29, 31 ] und-herrsche die Summe der zwischen der von-ten und bis-ten Position stehenden Eledef Summe(L,von,bis): mente der ihr übergebenen Liste L berechXXXXXXXXXX net. (In der Klausur gäbe es 0 Punkte, wenn sie die Funktion nicht induktiv programprint "Summe von",a,"ist", mieren würden. Bei dieser Aufgabe bedeuprint Summe(a,0,len(a)-1) tet das auch, dass Sie keine Schleife verwenden dürfen. Die Ausgabe sind dann so aus: Summe von [18, 15, 22, 24, 11, 29, 31] ist 150 Aufgabe 14 Schreiben Sie eine Funktion drucke(. . . ), die zwei Listen als Argumente erhält, von denen die erste ganze Zahlen (>=0) enthält und die zweite Strings (so dass an ihrer i-ten Stelle die textuelle Darstellung der Zahl i steht). Die Funktion soll bei ihrem Aufruf die textuelle Darstellung der Zahlen in der ersten Liste auf dem Bildschirm ausgeben. Zahl = ["null", "eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"] a = [8, 4, 2, 1, 5, 3, 1] def drucke(intListe,stringListe): XXXXXXXXXX drucke(a,Zahl) 6 Das sieht dann so aus: acht vier zwei eins fuenf drei eins Aufgabe 15 Schreiben Sie eine Funktion drucke(. . . ), die zwei Listen als Argumente erhält, beide enthalten Strings. Die zweite enthält wie in der vorigen Aufgabe die textuelle Darstellung der Ziffern (an der i-ten Stelle den Text für die i-te Ziffer). Die erste enthält auch Texte von Ziffern. Ihre Funktion soll nun auf dem Bildschirm die Dezimaldarstellung dieser Texte ausgeben, so dass die Ausgabe wie unten darsgestellt aussieht. (Verwenden Sie auch hier nicht die von Python vordefinierte Funktion index().) Zahlen = ["null", "eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"] def drucke(Namen,Liste): XXXXXXXXXX drucke(["zwei","sieben","acht", "null","sechs"],Zahlen) Das sieht dann so aus: 2 7 8 0 6 Aufgabe 16 Schreiben Sie eine Funktion Summe(a,b), die zwei Strings als Argumente erhält, die beide die textuelle Darstellung von Ziffern sind. Die Funktion soll dann als Ergebnis die Textuelle Darstellung der Summe der beiden Zahlen zurückgeben. Schreiben Sie das Programm so, dass Sie keine einzige Ziffer (0,1,...9) tippen müssen. Das sieht dann so aus: zwei + vier = sechs drei + fuenf = acht Zahlen = ["null", "eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"] def Summe(a,b): XXXXXXXXXX p q r s = = = = "zwei" "vier" "drei" "fuenf" print p,"+",q,"=",Summe(p,q) print r,"+",s,"=",Summe(r,s) 7 Aufgabe 17 Vervollständigen Sie die Funktion sumGerade(L), die zu einer gegebenen Liste L einen Wahrheitswert zurückliefert, und zwar so, dass True zurückgegeben wird, wenn die Summe aller Listenelemente gerade ist und False, wenn sie ungerade ist. Die Funktion funktioniert nach dem Teile-und-herrsche-Schema. Die dürfen weder Plus- noch Minus-Zeichen verwenden. Die Ausgabe muss so aussehen: True False A = [3,5,2,8,7,6,11,0,4,4,9] B = [3,5,2,8,7,6,12,0,4,4,9] def sumGerade(L): n = len(L) if n==1: return xxxxxxxxxx L1 = L[0:n/2] L2 = L[n/2:n] g1 = sumGerade(L1) g2 = sumGerade(L2) return xxxxxxxxxx print sumGerade(A) print sumGerade(B) Aufgabe 18 Schreiben Sie eine Funktion palindrom(s), die einen String als Argument erhält und als Rückgabewert genau dann True liefert, wenn s ein Palindrom ist. Palindrome sind Texte, die von vorne wie von hinten gelesen gleich sind. Der String e ist zwar (von Menschen) gelesen rückwärts wie vorwärts gleich, aber nicht, wenn man die Leerzeichen mit berücksichtigt. Wenn Sie Lust haben, dann machen Sie die Funktion so, dass sie auch den String e als Palindrom erkennt, also Leerzeichen ignoriert. a b c d e = = = = = "OTTO" "HANS" "RENTNER" "RENTIER" "IDA WAR IM ATLAS ABDUL LUD BASALT AM IRA WADI" def palindrom(s): XXXXXXXXXX for x in [a,b,c,d,e]: if palindrom(x): print x,"ist ein Palindrom." else: print x,"ist kein Palindrom." Tipp: Sie können Strings ähnlich wie Listen behandeln. len(s) liefert die Anzahl der Buchstaben, und s[i] liefert den i-ten Buchstaben. Ausgabe: OTTO ist ein Palindrom. HANS ist kein Palindrom. RENTNER ist ein Palindrom. RENTIER ist kein Palindrom. IDA WAR IM ATLAS ABDUL LUD BASALT AM IRA WADI ist kein Palindrom. 8 Aufgabe 19 Nehmen Sie das gleiche Programmskelett wie bei Aufgabe 17 und schreiben Sie die Funktion palindrom(s) jetzt anders. Erstens soll sie rekursiv ablaufen, und zweites soll sie auf das nebenstehende Muster passen. Die Ausgabe soll dann gleich wie bei Aufgabe 18 aussehen. Auf das Übersehen“ ” der Leerzeichen dürfen Sie dieses Mal verzichten. a b c d e = = = = = "OTTO" "HANS" "RENTNER" "RENTIER" "IDA WAR IM ATLAS ABDUL LUD BASALT AM IRA WADI" def palindrom(s): XXXXXXXXXX for x in [a,b,c,d,e]: if palindrom(x): print x,"ist ein Palindrom." else: print x,"ist kein Palindrom." Ausgabe: OTTO ist ein Palindrom. HANS ist kein Palindrom. RENTNER ist ein Palindrom. RENTIER ist kein Palindrom. IDA WAR IM ATLAS ABDUL LUD BASALT AM IRA WADI ist kein Palindrom. Aufgabe 20 Ersetzen Sie die ausgeixten Stellen im nebenstehenden Programm durch Python Code, so dass die Inhalte der Variablen a,b und c sortiert werden und dann in a der kleinste, in b der mittlere und in c der größte Wert stehen. Natürlich muss das Programm auch funktionieren, wenn die anfänglichen Werte irgendwelche anderen sind. Ausgabe: 3 5 7 a=7 b=3 c=5 if a>b: XXXXXXXXXX if a>c: XXXXXXXXXX if b>c: XXXXXXXXXX print a,b,c Aufgabe 21 Schreiben Sie ein Programm, das die Elemente der Liste a sortiert. Verwenden Sie dazu das nebenstehende Programmskelett und verzichten Sie auf die in Python schon vordefinierte Funktion sort(). Ausgabe: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13] a = [7, 13, 5, 6, 2, 9, 11, 8, 4, 10, 3] n = len(a) for t in range(n): for i in range(n): for j in range(i): XXXXXXXXXX print a 9 Aufgabe 22 Vervollständigen Sie die Funktion Teiler(. . . ), so dass sie nach dem Teile-undherrsche Schema berechnet, wie viele Teiler die vom Benutzer eingegebene Zahl n (incl. 1 und n) hat. Ersetzen Sie dazu nur die ausgeixte Stelle durch passenden Python Code. def Teiler(n,von,bis): if von==bis: if n%von==0: return 1 else: return 0 mitte = (von+bis)/2 return XXXXXXXXXX n = input("n = ") print n,"hat",Teiler(n,1,n),"Teiler." Ausgabe z. B. so: n = 144 144 hat 15 Teiler. Aufgabe 23 Vervollständigen Sie die ausgeixten Stellen im nebenstehenden Programmskelett, so dass das Programm eine Nullstelle der Funktion f(x) nach dem Halbierungsverfahren findet. (Das Halbierungsverfahren ist nichts anderes als eine binäre Suche auf einem gegebenen Intervall.) Freuen Sie sich aber nicht zu früh, wenn Sie das Gefühl haben, Sie hätten die Aufgabe gelöst. Stellen Sie z.B. auch sicher, dass Nullstellen sowohl bei positiver als auch bei negativer erster Ableitung gefunden werden. def f(x): return x*x-2 links = input("linker Rand des Suchbereichs = ") rechts = input("rechter Rand des Suchbereichs = ") Genauigkeit = 0.00001 while rechts-links > Genauigkeit: mitte = (links + rechts)/2 if f(mitte)<0: XXXXXXXXXX else: XXXXXXXXXX print "Habe eine Nullstelle bei",mitte,"gefunden" Ausgabe: linker Rand des Suchbereichs = 1.0 rechter Rand des Suchbereichs = 2.0 Habe eine Nullstelle bei 1.4142074585 gefunden 10 Aufgabe 24 Das nebenstehende Programm malt einen Funktionsgraphen auf den Bildschirm (ja, ja, etwas arg grobkörning, aber immerhin). Die Achsen laufen jeweils von -10 bis 10. Ersetzen Sie die ausgeixte Stelle durch eine Bedingung, so dass das Programm #-Zeichen an die Stellen setzt, an denen eine Schwärzung“ im Bild erscheinen ” soll – also auf den Koordinatenachsen und auf dem Funktionsgraphen. Wenn Sie als Bedingung probeweise einfach False eingeben, erscheint ein Bild wie das linke (lauter Punkte und keine #. Wenn Sie aber die richtige Bedingung einsetzen soll das rechte Bild erscheinen. def f(x): return x*x/5-5 def plot(): y=10 while y>-10: x=-10 while x<10: if xxxxxxxxxx print ’#’, else: print ’.’, x=x+1 print y=y-1 plot() Ausgabe bei XXXXXXXXXX = False . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ausgabe der Lösung: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . . . . . . # . . . . . . . . . # . . . . . . . . . . . . # # . . . . . # . . . . . . . . . . . . . . . # # . . # . . . . . . . . . . . . . . . . . # # # . . . . . . . . . . . . . . . . . . . # # . . . . . . . . . . . . . . . . . . # . # # . . . . . . . . . . . . . . . . # . . . # # . . . . . . . . . . . . . . # . . . . # # . . . . . . . . . . . . . # . . . . # # . . . # # # # # # # # # # # # # # # # # # # # . . . . . . . . . . # . . . . # # . . . . . . . . . . . . . # . . . . # # . . . . . . . . . . . . . # . . . # # . . . . . . . . . . . . . . # . # # . . . . . . . . . . . . . . . . # # . . . . . . . . . . . . . . . . # # # . . . . . . . . . . . . . . . # # . . # . . . . . . . . . . . . # # . . . . . # . . . . . . . . . # . . . . . . . . . # . . . . . . . . . Aufgabe 25 (Fehlersuche) Betrachten Sie die folgenden Python Programme und sagen Sie voraus, weswegen Python bei der Ausführung einen Fehler melden wird. Dann lassen Sie die Programme laufen und sehen, ob Sie recht hatten. def f(a,b): return a+b a) x=[13]; y=7; print f(x,y) def f(a,b): return a+b b) x=[13]; y=7; print f(f,f) 11 L=[1,2,3,4,5] c) for i=1: if L[i]>2: print i i=i+1 ax = 13 e) if ax==ay: ay=ax else: ay=-ax print ay,ay d) x=3.14159 print "2 pi = ",2x def g(h): return f(h) def f(h): return g(h) f) x=0 while x<10: h=x print f(x) A=[1,[2,3],4] h) for i in A: print i i=A[i] g) def f(x,l,r): if l=r: return x[l] return f(x,l,(l+r)/2)+f(x,(l+r)/2+1,r) z=[1,2,3,4,5,6] print f(z,0,5) a=1 j) for a<7: a=a print a==a a=4 i) if a=3: a=2 a=1 x=7 k) while x==7 and not x==7: print 7==x else: print x==7 def x(y,z): if y==None: return z m) z = return y y = x([y,z],[z,y]) def x(f): if f<7: x(f)=3 l) else: x(f)=f+f print f,x L=[] n) for i in L: L.append(i) else: print i def f(x): if f(x)==1: return 0 p) else: return 1 print f(13) q) def x(f): return x if x==x(x): return 0 x=3; y=2 s) while not 3<x: x=2 and y=4 print x,y K=[1,[2,3],4] L=[2,K,3] t) M=[L[1],K[L],2] N=[L,[L]] O=[[[K]]] v) def f(x,x): return x+x print f(2,2); print f(2,3) 12 def f(x)=x*x o) a=13 b=f(x) a=f(b) r) def L(2): return 1 print L(3) def f(g): return h(g) u) def h(f): return f(h) x=1; y=1-1 z=g(f(x)) Aufgabe 26 (Vorhersage) Betrachten Sie die folgenden Python Programme und sagen Sie voraus, was auf dem Bildschirm ausgegeben wird. Dann lassen Sie die Programme laufen und sehen, ob Sie recht hatten. L=[2,4,6,8,10] i=0 a) while i<5: print L[i] i=L[i] b) def s(A,l,r): if l==r: return A[l] return s(A,l,(l+r)/2)+s(A,(l+r)/2+1,r) X=[1,2,3,4,5,6] print s(X,0,len(X)-1) def haeh(x): if x <> 13: return haeh(x+1) else: return x+4 c) def a(b,c): if b*c == 0: return b+c if b<=c: return a(b,c-b) else: return a(c,b-c) d) print haeh(3) print haeh(7) print haeh(-4) print a(144,60) print a(120,1000) print a(2*2*3*5*7,2*3*3*7*7) L=[[1,2,3],[4,5,6],[7,8,9]] i=0 j=2 e) s=0 while i<3: s=s+L[i][j] print s i=i+1 j=j-1 A=[2==2,2==1,2==3] B=4==4 g) for C in A: B = B and C print B L=[1,2] n=0 i) while n<len(L): L.append(n) n=n+L[n] print n i=13 f) while i>5: print i i=i-5 def f(x,y): return x[y] h) y=[2,0,1]; x=1 print f(y,x), f(y,f(y,x)), f(y,f(y,f(y,x))) def A(B): if (B>C): return C % B else: return A(B+C) j) B = 23456; C = 1234567 print A(B) print A(C)-C print A(9)-C+B 13 x=1 while x<10: k) if x%3==1: x=x+2 else: x=x+1 print x i=3 l) for i in range(i): i=i+1 print i A=[1,2] B=[A,[2,A]] m) for C in B: for D in C: print D def A(B): if B<0: return B o) else: return A(A(B-1)-1) print A(0),A(10),A(100) a=13; b=17 r) a=a==a b=a==b print a,b def f(x,y): if x<y: return f(x,y-x) n) else: return y print f(2,9),f(4,10),f(10,1000) n=99 while n>0: p) for i in range(n): if i*i==n: print i n=n-2 def I(n): if n<0: return 0 s) else: return I(n-2)+I(n-1-I(n-3)) for x in range(3): print I(x) for i in [1,4,9,16,25]: n = 1 while n*n < i: t) if n>2: break n = n+1 else: print i while True: print False u) break print True print False def F(x,y): if x: return y v) return F(not y, x) print F(1<1,1<2),F(1<2,1<2) print F(2<1,2<2),F(2<2,2<2) def a(x): return 1+b(x-1) def b(y): x) if y>0: return a(y-1) return y print a(2),b(3),a(4),b(5) A=[[1,2],3]; y) for i in range(len(A)): print A[1-i] def T(x,y): if x==y: return y z) else: return 1+T(x,y/2) print T(1,2),T(1,4),T(2,20) t=(1==2)==(2==1) A) u=(1==1)==(2==2) v=(1==2)==(2==2) print t,u,v def t(s): if len(s)<3: return s B) return s[1]+t(s[2:]) print t("INFORMATIK") L=7 C) def E(K): return K(L) def F(K): return K-3 print E(F),F(5) Aufgabe 27 (Flussdiagramme) Lesen Sie die folgenden Programmbeschreibungen und entwerfen Sie dazu ein Flussdiagramm und (wenn möglich) ein passendes Python-Programm. a) Das Programm liest eine Zahl x von Benutzer ein, verdoppelt diese und gibt sie wieder auf dem Bildschirm aus, 14 b) c) d) Das Programm liest eine Zahl k vom Benutzer ein und druckt auf dem Bildschirm den Text minus“ aus, falls k negativ ist und plus“ falls die k größer ” ” oder gleich null ist. Das gleiche Programm wie zuvor, nur dass im Falle von k=0 diesmal der Text null“ ausgegeben werden soll. ” Das Programm liest vom Benutzer eine Zahl k ein und gibt deren Betrag aus (ohne Verwendung einer vordefinierten Betragsfunktion). e) Das Programm druckt alle natürlichen Zahlen in aufsteigender Reihenfolge, beginnend bei 0 bis ausschließlich n aus. Das n ist schon vor Beginn des Programms definiert und muss nicht extra eingegeben werden. f) Das Programm erwartet die Eingabe zweier Zahlen, a und b, und gibt dann auf dem Bildschirm alle ganzen Zahlen zwischen a und b (einschließlich) aus. g) Das Programm durchsucht die Liste L nach Vorkommen von x. Dazu läuft eine Schleifenvariable a von 0 bis zum letzten Index der liste. Wenn das a-te Element der Liste gleich dem gesuchten x ist, dann wird die Schleife verlassen und der Text ’ja’ ausgegeben. Wenn die komplette Schleife durchgelaufen ist, ohne dass x gefunden worden wäre, dann wurd der Text ’nein’ ausgegeben. Diese Variante der linearen Suche funktioniert auch mit einer leeren Liste, weil die Abfrage, ob der Listensuchindex noch innerhalb der Liste ist, am Anfang der Schleife durchgeführt wird. Das Programm prüft, ob die zwei Listen A und B ein gemeinsames Element haben. Wenn dem so ist, wird ’ja’ sonst ’nein’ ausgedruckt. Dazu läuft eine Indexvariable a durch die Indizes von Liste A und eine Variable b durch die Indizes der Liste B. Die b-Schleife ist in der a-Schleife eingebettet. Für jedes a durchläuft also b die komplette Liste B. Für jedes B (d.h. genauer gesagt, für jede Kombination von a und b) wird geprüft, ob das a-te Element von A gleich dem b-ten von B ist. Wenn ja, dann wird nach Ausgabe von ’ja’ die Schleife abgebrochen. Damit auch die äußere Schleife abgebrochen wird, muss jetzt der Abbruch der inneren Schleife detektiert werden (erkennbar daran, dass b nicht bis zum Ende gelaufen ist) und in diesem Fall auch die äußere Schleife abbrechen. Nach Abbruch der äußeren Schleife muss der Text ’nein’ nur dann ausgegeben werden, wenn die Schleifen nicht abgebrochen worden waren, erkennbar daran, dass a gleich n ist (also bis zum Ende durchgelaufen ist). h) i) j) k) Das Programm gibt auf dem Bildschirm ’ja’ oder ’nein’ aus, je nachdem, ob die beiden Listen A und B die gleichen Inhalte haben oder nicht. Dazu wird zuerst geprüft, ob die Listen gleich lang sind. Wenn nicht, wird ’nein’ ausgegeben’, wenn doch, beginnt eine Schleife mit der Variablen k, die bei 0 startet und so lange läuft, wie k kleiner als die Länge von A (und kleiner als die Länge von B) ist. Für jedes k wird verglichen, ob das k-te Element von A gleich dem k-ten Element von B ist, und, wenn dem nicht so ist, wird die Schleife mit der Ausgabe ’nein’ abgebrochen. Wenn die Schleife ohne Abbruch abgelaufen ist, hat es also keine Unstimmigkeiten gegeben und es wird ’ja’ ausgegeben. Das Programm berechnet den maximalen Wert aller Elemente einer Liste. Dazu wird eine Schleifenvariable a von 1 bis zum letzten Index der Liste gejagt. Anfangs wird angenommen, dass das nullte Element das Maximum ist, welches in der Variablen max gemerkt wird. Wann immer das a-te Element der Liste noch größer ist als der in max gespeicherte Wert, wird max auf diesen noch größeren Wert gesetzt. Am Ende der Schleife (also wenn a die Länge der Liste erreicht hat) wird max ausgegeben. 15 l) Das Programm durchsucht eine Liste L nach dem Schema der binären Suche. Dazu wird der jeweils noch zu durchsuchende Bereich zwischen den Indizes l und r (einschließlich) betrachtet. Anfangs ist l=0 und r=n-1 (also erste und letzte Listenposition). Binäre Suche heißt, das Element in der Mitte m=(l+r)/2 des des noch verlbliebenen Bereichs wird betrachtet. Wenn L[m] kleiner als das zu suchende x ist, dann heißt das, dass das x später“ kommen muss, ” und wir setzten den linken Rand des Suchbereichs auf eine Position hinter die Mitte (also l=m+1). Wenn L[m] größer als das zu suchende x ist, dann heißt das, dass das x früher“ kommen muss, und wir setzten den rechten Rand ” des Suchbereichs auf eine Position vor die mitte (also r=m-1). Und wenn L[x] zufällig“ das gesuchte x ist, dann geben wir als Ergebnis dessen Position, also ” m, auf dem Bildschirm aus, und die Schleife wird abgebrochen. Die Suche läuft dann so lange in einer Schleife, wie der linke Rand nicht über den rechten hinausgeschossen ist, also so lange, wie der Suchraum aus noch wenigstens einem Element besteht. Wenn das gesuchte Element nicht gefunden wird (also die Schleife komplett durchgelaufen ist), dann wird -1 ausgegeben. m) Das Programm lässt den Benutzer eine Zahl n eingeben und gibt die n-te Fibonacci-Zahl aus. Dazu verwendet es drei Variablen a,b und c, die anfangs auf a=1, b=1 und c=2 gesetzt sind. In einer Schleife läuft die Variable i von 1 bis n (ausschl.) und duie Werte von a,b und c werden so verschoben“, dass a ” immer die i-te, b die i+1-te und c die i+2-te Fibonacci-Zahl ist. Das Programm prüft, ob eine eingegebene Zahl n prim ist. Dazu werden in einer Schleife als mögliche Teiler alle t beginnend bei 2 und endend nach der Wurzel n (also wenn t mal t größer n ist) berechnet, was der Rest der Division von n durch t ist. Wenn dieser Rest 0 ist, geht die Division auf, und die Zahl kann nicht prim sein. Dies wird ausgedruckt und die Schleife abgebrochen. Wenn die Schleife komplett durchgelaufen ist, wurde also kein Teiler gefunden, und es wird prim“ ausgegeben. ” Das Programm prüft, ob eine eingegebene Zahl n eine Quadratzahl ist. Dazu wetzt t genauso wie beim letzten Programm bis zur Wurzel von n (beginnt aber schon bei 0). Statt der Prüfung, ob n teilbar durch t, wird jetzt geprüft, ob t*t gleich n ist. Der Rest ist gleich. n) o) Aufgabe 28 Ein mordsmäßig schnellrechnender Mathematiker kauft beim Händler ein Pfund Äpfel, ein Pfund Tomaten, ein Pfund Nüsse und ein Pfund Kirschen. Der Händler will mogeln und verwendet beim Eintippen der Preise die Mal-Taste statt der Plus-Taste, was dem Mathematiker natürlich sofort auffällt. Nachdem ihm der Händler als Gesamtpreis für die 4 Waren 9,81 e nennt, schmunzelt der Mathematiker und sagt: Haha, ich habe genau gesehen, dass Sie die Mal-Taste ” statt der Plus-Taste verwendet haben, aber dummerweise wäre genau derselbe Betrag herausgekommen, wenn Sie die Plus-Taste verwendet hätten.“. Schreiben Sie ein Python-Programm, das die vier Einzelbeträge korrekt berechnet. Aufgabe 29 Schreiben Sie ein Programm, das bei Eingabe einer Zahl n ausgibt, ob n eine perfekte Zahl ist. Perfekte Zahlen sind solche, die genauso groß sind wie die Summe ihrer Teiler (außer sich selbst). So ist z. B. 6 eine perfekte Zahl, weil 1 + 2 + 3 = 6. 16 Aufgabe 30 In Hasenhausen gilt die Währung Möhre [M], 1 M wird unterteilt in 7 Fitzel, also 1 M = 7 F. Ein Fitzel ist soviel wert wie 3 Dingens [D], also 1 F = 3 D, und ein Dingens besteht aus 11 Bröckchen [B]. In Entenhausen gibt es nur Taler [T] und Kreuzer [K]. Ein Taler sind 12 Kreuzer. Der Wechselkurs für 257 T + 11 K beträgt 4 M + 3 F + 2 D + 1 B. Schreiben Sie ein Programm, das bei Eingabe einer Zahl m (Anzahl Hasenhausener Möhren) angibt, wie viele Taler und Kreuzer die wert sind (abgerundet) Aufgabe 31 Schreiben Sie ein Programm, das zu einem eigegebenen Wort w alle Anagramme ausgibt. (Anagramme sind die möglichen Reihenfolgevertauschungen der Buchstaben). Als Antwort auf die Eingabe ULI sollte die Ausgabe die Wörter ULI, UIL, LUI, LIU, IUL, ILU enthalten. (Achtung, geben Sie keine Wörter ein, die zu lang sind, bei n Buchstaben gibt es n! Anagramme.) Aufgabe 32 Schreiben Sie ein Programm, das bei Eingabe zweier Brüche (Zähler und Nenner sind jeweils natürliche Zahlen) die Summe der Brüche als Bruch (auch mit natürlichem Zähler und Nenner) gekürzt ausgibt. Z.B. sollte das so aussehen: 1. Zaehler = 3 1. Nenner = 4 1. Zaehler = 5 1. Nenner = 6 3 / 4 + 5 / 6 = 19 / 12 z1 n1 z2 n2 = = = = input("1. input("1. input("1. input("1. Zaehler Nenner Zaehler Nenner = = = = ") ") ") ") XXXXXXXXXX Aufgabe 33 Schreiben Sie ein Programm, das bei Eingabe einer Zahl n, deren Primfaktor-Zerlegung auf dem Bildschirm ausgibt. Das sieht dann z.B. so aus: n = 24 oder n = 1234567 2 2 2 3 127 9721 17 Aufgabe 34 Schreiben Sie ein Programm, das zwei Listen hat, eine Liste mit Hasennamen und eine Liste mit den entsprechenden Altern. Wenn also Name[4711] der Name des 4711ten Hasen ist, dann steht sein Alter in Alter[4711]. Schreiben Sie eine Funktion, die zwei solche Listen als Argumente erwartet und als Ergebnis die Namen der Hasen sortiert nach ihrem Alter (als Liste) ausgibt. (vgl. Aufg. 21) Alter = [7, 13, 5, 6, 2, 9, 11, 8, 4, 10, 3] Name = ["Smak", "Hoppel", "Ue", "Puschel", "Hopp", "Luemmel", "Ohr", "Baukel", "Pippi", "Hoppla", "Frat-Gandalf"] n = len(Alter) for t in range(n): for i in range(n): for j in range(i): XXXXXXXXXX print Name Ausgabe: [’Hopp’, ’Frat-Gandalf’, ’Pippi’, ’Ue’, ’Puschel’, ’Smak’, ’Baukel’, ’Luemmel’, ’Hoppla’, ’Ohr’, ’Hoppel’] Aufgabe 35 Schreiben Sie ein Programm, das eine einzugebende natürliche Zahl n in eine natürliche Zahl z umwandelt, deren Ziffern in genau umgekehrter Reihenfolge stehen. Also z.B. 123 → 321 oder 4711 → 1174 oder 560 → 65 (da fällt die führende Null halt weg). n = input("n = ") XXXXXXXXXX print z Ausgabe: n = 6342270 722436 Aufgabe 36 Schreiben Sie ein Programm, das von einer einzugebenden natürlichen Zahl n die Hunderter-Ziffer ausgibt. Ausgabe: n = 12345 3 n=input("n = ") XXXXXXXXXX oder n = 4711 7 oder n = 68 0 Aufgabe 37 Schreiben Sie ein Programm, das zu einer einzugebenden natürlichen Zahl n die Anzahl der Dezimalstellen ausgibt. Ausgabe: n = 12345 5 n=input("n = ") XXXXXXXXXX oder n = 4711 4 18 oder n = 68 2 Aufgabe 38 Schreiben Sie eine rekursive Funktion log2(n), die den (natürlichzahligen) Zweierlogarithmus einer ihr übergebenen natürlichen Zahl berechnet. def log2(n): XXXXXXXXXX print log2(1024) print log2(100) print log2(35) Ausgabe: 10 6 5 Aufgabe 39 Schreiben Sie eine Funktion Anz0(...), die nach dem Teile-undherrsche-Schema die Anzahl der Nullen in einem Bereich (von Position l bis r) einer ihr übergebenen Liste A zählt und zurückgibt. def Anz0(A,l,r): if l==r: if XXXXXXX: return 1 else: return 0 return XXXXXXXXXX L1 = [1,2,0,4,5,0,7,8,9,10,11, 0] L2 = [1,2,3,4,5,6,7,8,9,10,11,12] L3 = [0,0,0,0,0,0,0,0,0, 0, 0, 0] n=len(L1)-1 print L1,"hat",Anz0(L1,0,n),"Nullen" print L2,"hat",Anz0(L2,0,n),"Nullen" print L3,"hat",Anz0(L3,0,n),"Nullen" Ausgabe: [1, 2, 0, 4, 5, 0, 7, 8, 9, 10, 11, 0] hat 3 Nullen [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] hat 0 Nullen [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] hat 12 Nullen 19 Aufgabe 40 Schreiben Sie eine Funktion Prod0(...), die nach dem Teile-und-herrscheSchema das Produkt aller Nicht-Nullen in einem Bereich (von Position l bis r) einer ihr übergebenen Liste A berechnet und zurückgibt. Vergleichen Sie die Aufgabe/Lösung mit der vorherigen und erkennen Sie, was an beiden Aufgaben gleich ist, und wo die Unterschiede sind. def Prod0(A,l,r): if l==r: if XXXXXXX: return XXXXXXX else: return XXXXXXX return XXXXXXXXXX L1 = [1,2,0,4,5,0,7,8,9,10,11, 0] L2 = [1,2,3,4,5,6,7,8,9,10,11,12] L3 = [0,0,0,0,0,0,0,0,0, 0, 0, 0] n=len(L1)-1 print "Produkt von",L1,"ist",Prod0(L1,0,n) print "Produkt von",L2,"ist",Prod0(L2,0,n) print "Produkt von",L3,"ist",Prod0(L3,0,n) Ausgabe: Produkt von [1, 2, 0, 4, 5, 0, 7, 8, 9, 10, 11, 0] ist 2217600 Produkt von [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] ist 479001600 Produkt von [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ist 1 Aufgabe 41 Schreiben Sie eine Funktion Geom(...), die nach dem Schema der Induktion die n-te Partialsumme der Geometrischen Reihe von Pn q k berechnet. Also k=0 q . def Geom(q,n): if n==0: return XXXXXXXX return XXXXXXXX print "2 hoch 0 + ... + 2 hoch 7 =",Geom(2,7) print "3 hoch 0 + ... + 2 hoch 5 =",Geom(3,5) Verwenden Sie dazu die von Python schon vordefiniert Funktion pow(q,n) die q n berechet. Ausgabe: 2 hoch 0 + ... + 2 hoch 7 = 255 3 hoch 0 + ... + 2 hoch 5 = 364 20 Aufgabe 42 Schreiben Sie eine Funktion Prod0(...), die nach dem Induktionsschema das Produkt aller Nicht-Nullen in einem Bereich (von Position l bis r) einer ihr übergebenen Liste A berechnet und zurückgibt. Die Ausgabe muss die gleiche sein wie bei der Tele-und-Herrsche Version: L1 = [1,2,0,4,5,0,7,8,9,10,11, 0] L2 = [1,2,3,4,5,6,7,8,9,10,11,12] L3 = [0,0,0,0,0,0,0,0,0, 0, 0, 0] n=len(L1)-1 2 hoch 0 + ... + 2 hoch 7 = 255 3 hoch 0 + ... + 2 hoch 5 = 364 print "Produkt von",L1,"ist",Prod0(L1,n) print "Produkt von",L2,"ist",Prod0(L2,n) print "Produkt von",L3,"ist",Prod0(L3,n) Aufgabe 43 Schreiben Sie eine Funktion Verschiedene(L), die zählt wie viele verschiedene Elemente in einer ihr übergebenen Liste vorkommen (natürlich, ohne die Liste zu verändern). def Prod0(A,n): if n<0: XXXXXXXXXX if A[n]==0: p = XXXXXXXXXX else: p = XXXXXXXXXX return p * XXXXXXXXXX def Verschiedene(L): n=1 i = 1 while i<len(L): XXXXXXXXXX return n L1 = ["Anton","Bert","Conny","Det","Emil"] L2 = ["Anton","Det", "Conny","Det","Det" ] L3 = ["Det", "Det", "Det", "Det","Det" ] print L1,"enthaelt",Verschiedene(L1),"verschiedene" print L2,"enthaelt",Verschiedene(L2),"verschiedene" print L3,"enthaelt",Verschiedene(L3),"verschiedene" Ausgabe: [’Anton’, ’Bert’, ’Conny’, ’Det’, ’Emil’] enthaelt 5 verschiedene [’Anton’, ’Det’, ’Conny’, ’Det’, ’Det’] enthaelt 3 verschiedene [’Det’, ’Det’, ’Det’, ’Det’, ’Det’] enthaelt 1 verschiedene Aufgabe 44 Schreiben Sie eine Funktion polar(re,im), die zu einer Komplexen Zahl, deren Realteil als erstes Argument und deren Imaginärteil als zweites Argument übergeben werden, die entsprechende Polardarstellung ausdruckt. Berechnen Sie dazu den Betrag der Zahl in der Variablen r und den Winkel in der Variablen alpha. Verwenden Sie dazu die von Python schon vordefinierten Funktionen atan(...) zum Berechnen des arcustangens und sqrt(...) zum Berechnen einer Quadratwurzel. from math import atan from math import sqrt def polar(re,im): XXXXXXXXXX print r,"mal e hoch",alpha,"i" polar( 2.0, 1.0) polar(-3.0, 4.0) polar(-1.0, 0.0) polar(12.0,-1.0) Ausgabe: 2.2360679775 mal e hoch 0.463647609001 i 5.0 mal e hoch 2.214294782 i 1.0 mal e hoch 3.14159 i 12.0415945788 mal e hoch -0.0831412318884 i 21 Aufgabe 45 Schreiben Sie eine Funktion fullHouse(K), die zu einer 5elementigen Liste K mit Kartenwerten berechnet, ob diese Karten ein Full House ergeben, und entsprechend True oder False zurückliefert. Ein Full House liegt dann vor, wenn ein Wert drei mal und ein anderer Wert zwei mal vorkommt. Die Kartenwerte sind als Zahlen oder als Texte gegeben. Ausgabe: [1, 2, 3, 3, 3] [4, 5, 4, 5, 5] [6, 6, 6, 7, 6] [8, 8, 9, 9, 8] [0, 0, 0, 0, 0] [’K’, ’D’, ’D’, L1 = [1,2,3,3,3]; L2 = [4,5,4,5,5] L3 = [6,6,6,7,6]; L4 = [8,8,9,9,8] L5 = [0,0,0,0,0]; L6 = [’K’,’D’,’D’,’K’,’D’] def fullHouse(K): XXXXXXXXXX for L in [L1,L2,L3,L4,L5,L6]: if fullHouse(L): x="ein" else: x="kein" print L,"ist",x,"Full House" ist kein Full House ist ein Full House ist kein Full House ist ein Full House ist kein Full House ’K’, ’D’] ist ein Full House Aufgabe 46 Schreiben Sie eine Funktion loesungen(p,q), die zu einer def loesungen(p,q): XXXXXXXXXX quadratischen Glei2 chung x + px + q = 0 berechnet, ob diese print "x*x-2*x+2 hat",loesungen(-2,2),"Loesung(en)" null, eine, oder zwei print "x*x-3*x+3 hat",loesungen(-3,2),"Loesung(en)" print "x*x-4*x+4 hat",loesungen(-4,4),"Loesung(en)" reelle Lösungen hat. Ausgabe: x*x-2*x+2 hat 0 Loesung(en) x*x-3*x+3 hat 2 Loesung(en) x*x-4*x+4 hat 1 Loesung(en) Aufgabe 47 Schreiben Sie eine Funktion ungefaehr(x,y), die zu zwei gegebenen Fliesskommawerten berechnet, ob sie sich um weniger als 0.001 unterscheiden. def ungefaehr(x,y): XXXXXXXXXX print print print print ungefaehr(3.14159,3.14) ungefaehr(3.14159,3.141) ungefaehr(-0.555,-0.5555) ungefaehr(-0.555,-0.55) 22 Ausgabe: False True True False Aufgabe 48 Vervollständigen Sie die Funktion Hornerschema(p,x), die nach dem Hornerschema das Polynom, dessen Koeffizienten in der Liste p gegeben sind, an der Stelle x auswertet. In p[0] steht der höchstwertige und in p[-1] der niedrigstwertige Koeffizient: def Hornerschema(p,x): y=0 for i in p: XXXXXXXXXX return y print "fuer x= 5 ist y=f(x)=2x*x-x+1 = ",Hornerschema([2,-1,1],5) print "fuer x= 7 ist y=f(x)=3 = ",Hornerschema([3],7) print "fuer x=-1 ist y=f(x)=x*x*x-4*x-2 = ",Hornerschema([1,0,-4,-2],-1) Ausgabe: fuer x= 5 ist y=f(x)=2x*x-x+1 = 46 fuer x= 7 ist y=f(x)=3 = 3 fuer x=-1 ist y=f(x)=x*x*x-4*x-2 = 1 Aufgabe 49 Vervollständigen Sie die Funktion istFair(L,W,n), die drei Argumente erwartet: zwei Liste und einen Zahl n. In der ersten Liste steht, wie groß irgendwelche Äpfel sind. In der zweiten Liste steht, welcher Apfel welchem von n Kindern (mit Nummern 0 bis n-1) gegeben wird. Wenn also in W[3] eine 0 steht, heißt das, dass Kind Nr. 0 den Apfel Nr. 3 kriegt, dessen Größe L[3] ist. Das Ergebnis der Funktion ist True oder False, je nachdem, ob die Aufteilung fair ist (d. h. jedes Kind kriegt gleich viel) oder nicht. Hinweis: in der Liste s, die anfangs mit n Nullen gefüllt wird, wird an der i-ten Stelle berechnet, wie viel das i-te Kind kriegt. def istFair(L,W,n): s = [0]*n for i in range(len(L)): XXXXXXXXXXXXXXX for i in s: if i <> s[0]: return False return True print istFair([1,2,5,4,6,3,2,7],[0,1,2,0,1,2,0,1],3) print istFair([1,2,5,4,6,3,2,7],[1,1,0,2,2,0,0,1],3) Ausgabe: True False Aufgabe 50 Vervollständigen Sie die Funktion passt(L,k), die berechnet, ob man mit Hilfe der Zahlen in der Liste L den Wert k zusammenaddieren kann, indem man sich irgendwelche (egal wie viele – aber jedes höchstens ein mal) Elemente von L heraussucht und zusammenzählt. Die Funktion läuft rekursiv nach der folgenden Idee. Das Ergebnis ist einfach zu berechnen, wenn die Liste nur aus einem Element besteht, dann müssen wir nämlich nur prüfen, ob dieses Element gleich k ist. Wenn die Liste aus mehreren Elementen besteht, prüfen wir für jedes i-te Element, ob aus dem Rest der Liste (also ohne 23 das i-te Element) das k gebastelt werden kann oder ob aus den Rest k-L[i] gebastelt werden kann. In beiden Fällen wäre das Gesamtergebnis True. Nur wenn beides nicht geht – und zwar für jedes i-te Element – dann ist das Ergebnis False. def passt(L,k): if len(L)==1: return XXXXXXXXXX for i in range(len(L)): if XXXXXXXXXX return True return False A = [10,4,41,17,2,2,5] if passt(A,56): print 56,"kann man aus",A,"bilden" else: print 56,"kann man nicht aus",A,"bilden" if passt(A,42): print 42,"kann man aus",A,"bilden" else: print 42,"kann man nicht aus",A,"bilden" Ausgabe: 56 kann man aus [10, 4, 41, 17, 2, 2, 5] bilden 42 kann man nicht aus [10, 4, 41, 17, 2, 2, 5] bilden Aufgabe 51 Vervollständigen Sie die Funktionen groesserS(...), groesserI(...) und groesserT(...), so dass jede der Funktionen True oder False zurückgibt, je nachdem, ob die erste der beiden ihr übergebenen Listen an jeder Stelle einen größeren Wert hat als die zweite Liste an der gleichen Stelle. Dabei muss groesserS sequentiell, groesserI induktiv, und groesserT nach den Teile-und-herrsche-Schema ablaufen. def groesserS(A,B): i=0 while i<len(A): XXXXXXXXXX return XXXXXXXXXX def groesserI(A,B,n): if n<0: return XXXXXXXXXX return XXXXXXXXXX def groesserT(A,B,l,r): if l==r: return XXXXXXXXXX return XXXXXXXXXX X = [1,3,8,4,4,2,7] Y = [2,5,9,6,5,6,8] Z = [3,6,4,6,4,5,3] print groesserS(Y,X ),groesserS(Z,X ) print groesserI(Y,X, len(X)-1),groesserI(Z,X, len(X)-1) print groesserT(Y,X,0,len(X)-1),groesserT(Z,X,0,len(X)-1) Ausgabe: True False True False True False 24 Aufgabe 52 Vervollständigen Sie die Funktionen disjunktS(...) und disjunktI(...), so dass jede der Funktionen True oder False zurückgibt, je nachdem, ob die beiden ihnen übergebenen Listen disjunkt sind oder nicht. (Disjunkt = kein Wert taucht in beiden Listen auf.) Dabei muss disjunktS sequentiell und disjunktI induktiv ablaufen. def disjunktS(A,B): i=0 while i<len(A): j=0 while j<len(B): XXXXXXXXXXXX XXXXXXXXXXX return XXXXXXXXXXX def disjunktI(A,B,n): if n<0: return True i=0 while i<len(A): if XXXXXXXXXXX: return XXXXXXXXXXX i=i+1 return XXXXXXXXXXX X = [1,3,8,4,4,2,7] Y = [0,5,9,6,5,6,9] Z = [3,6,4,6,4,5,3] print disjunktS(Y,X ),disjunktS(Z,X ) print disjunktI(Y,X,len(X)-1),disjunktI(Z,X,len(X)-1) Ausgabe: True False True False Aufgabe 53 Schreiben Sie eine Funktion, die zwei Listen erwartet, in der ersten stehen Ganzzahlen, in der Zweiten stehen Einsen oder Nullen. Das Ergebnis ist die Summe der Ganzzahlen aus der ersten Liste, an deren Position in der zweiten Liste eine 1 steht. def SummeEins(A,B): XXXXXXXXXX X = [3,6,4,2,8,5,5,1] Y = [1,0,0,1,1,1,0,0] print "Summe alle X[i] mit Y[i]=1 ist:",SummeEins(X,Y) Ausgabe: Summe alle X[i] mit Y[i]=1 ist: 18 25 Aufgabe 54 Vervollständigen Sie eine Funktion Quadrat(...), die eine nichtnegative ganze Zahl als Argument erwartet und als Ergebnis das Quadrat dieser Zahl zurückgeben soll. def Quadrat(x): q = 0 for i in range(x): XXXXXXXXXX return q print "Quadrat von 7 ist",Quadrat(7) print "Quadrat von 13 ist",Quadrat(13) print "Quadrat von 0 ist",Quadrat(0) Ausgabe: Quadrat von 7 ist 49 Quadrat von 13 ist 169 Quadrat von 0 ist 0 Aufgabe 55 Schreiben Sie eine Funktion Rest(p,q), die zwei positive natürliche Zahlen erwartet und ohne Verwendung einer Division (also weder / noch %) berechnet, was der Rest der Division p/q ist. Spicken Sie auch nicht bei der ähnlichen Übungsaufgabe, als Sie die Funktion Durch(...) rekursiv machen sollten. def Rest(p,q): XXXXXXXXXX print print print print "17 "99 " 7 " 1 / / / / 5 9 8 1 hat hat hat hat als als als als Rest",Rest(17,5) Rest",Rest(99,9) Rest",Rest( 7,8) Rest",Rest( 1,1) Ausgabe: 17 / 5 hat als Rest 2 99 / 9 hat als Rest 0 7 / 8 hat als Rest 7 1 / 1 hat als Rest 0 Aufgabe 56 Schreiben Sie eine Funktion Diff(x,y), die zwei ganze Zahlen erwartet und ohne Verwendung eines Minuszeichens berechnet, was der Unterschied von x und y ist. def Diff(x,y): XXXXXXXXXX print print print print "Differenz "Differenz "Differenz "Differenz von 3 von 8 von 5 von -7 und und und und 7 2 5 4 ist",Diff( 3,7) ist",Diff( 8,2) ist",Diff( 5,5) ist",Diff(-7,4) Ausgabe: 26 Differenz Differenz Differenz Differenz von von von von 3 und 7 ist 4 8 und 2 ist 6 5 und 5 ist 0 -7 und 4 ist 11 Aufgabe 57 Diesmal ist die Funktion vorgegeben und Sie sollen Sie verwenden (d. h. aufrufen). Schreiben Sie ein Stück Python-Programm, das das produkt aller Elemente der Liste L unter Verwendung der Funktion Produkt(...) berechnet. Verwenden Sie kein Multiplikationssymbol. def Produkt(x,y): return x*y L = [12,3,5,8,11] XXXXXXXXXX print "Produkt aller Element von L ist",p Ausgabe: Produkt aller Element von L ist 15840 Aufgabe 58 Schreiben Sie eine Funktion MWST(...), die als Argument eine positive Fließkommazahl erwartet und diese als Preis einer Ware interpretiert. Als Ergebnis gibt die Funktion zurück, wie viel Mehrwertsteuer in diesem Betrag enthalten ist. Dazu verwendet die Funktion die außerhalb definierte Variable Prozentsatz. Prozentsatz = 19.0 def MWST(x): return XXXXXXXXXX print "119 Euro enthalten ",MWST(119.0),"Euro Mehrwertsteuer" print "100 Euro enthalten ",MWST(100.0),"Euro Mehrwertsteuer" Ausgabe: 119 Euro enthalten 19.0 Euro Mehrwertsteuer 100 Euro enthalten 15.9663865546 Euro Mehrwertsteuer Aufgabe 59 Schreiben Sie eine Funktion Inflation(...), die zwei Fliesskommaargumente erhält: als erstes den Vorjahrespreis, als zweites den aktuellen Preis. Der Rueckgabewert soll dann die Inflationsrate in Prozent sein. def Inflation(x,y): XXXXXXXXXX print "Steigt der Preis von 100 auf 103, ist die Inflation",Inflation(100.0,103.0),"%" print "Steigt der Preis von 17 auf 34, ist die Inflation",Inflation(17,34),"%" Ausgabe: Steigt der Preis von 100 auf 103, ist die Inflation 3.0 % Steigt der Preis von 17 auf 34, ist die Inflation 100.0 % 27 Aufgabe 60 Schreiben Sie eine Funktion Klammercheck(...), die prüft, ob die Klammerung in einem gegebenen String korrekt ist und gibt True oder False zurueck. Der String enthält nur Klammern und sonst nichts. Die Klammerung ist z.B. korrekt im String (()(())())() aber falsch im String ())()(). Auch falsch wäre ((()))()(. def Klammercheck(S): XXXXXXXXXX K1 = "(()(())())()"; K2 = "())()()"; K3 = "((()))()("; print K1,"ist",Klammercheck(K1) print K2,"ist",Klammercheck(K2) print K3,"ist",Klammercheck(K3) Ausgabe: (()(())())() ist True ())()() ist False ((()))()( ist False Aufgabe 61 Vervollständigen Sie die Funktionen zaehlenS(...), zaehlenI(...) und zaehlenT(...), so dass jede der Funktionen als Ergebnis zurückliefert, wie oft ein gegebener Wert in einer gegebenen Liste auftaucht. Dabei muss die Funktion zaehlenS(...) sequentiell, die Funktion zaehlenI(...) induktiv und die Funktion zaehlenT(...) nach dem Teileund-herrsche-Schema ablaufen. def zaehlenS(L,x): n=0 for i in L: XXXXXXXXXX return n def zaehlenI(L,x,n): if n<0: return 0 if XXXXXXXXXX: return XXXXXXXXXX return XXXXXXXXXX def zaehlenT(L,x,l,r): if l==r: if XXXXXXXXXX: return XXXXXXXXXX else: return XXXXXXXXXX return XXXXXXXXXX A = [5,2,4,4,2,1,4,3,4,1,5,4,2,0] print "4 kommt",zaehlenS(A,4 ),"mal vor" print "4 kommt",zaehlenI(A,4, len(A)-1),"mal vor" print "4 kommt",zaehlenT(A,4,0,len(A)-1),"mal vor" Ausgabe: 4 kommt 5 mal vor 4 kommt 5 mal vor 4 kommt 5 mal vor 28 Aufgabe 62 Vervollständigen Sie die Funktionen Teilstring(...) und TeilstringI(...), so dass beide Funktionen bestimmen ob ein String (erstes Argument) Teil eines anderen Strings (zweites Argument) ist. dabei muss Teilstring(...) sequentiell und TeilstringI(...) induktiv ablaufen. def Teilstring(S1,S2): i = 0 while i<len(S2): j = 0 while j<len(S1): XXXXXXXXXX j = j+1 if XXXXXXXXXX: return True i = i+1 return False def TeilstringI(S1,S2,n): if XXXXXXXXXX: return False if XXXXXXXXXX: return True return XXXXXXXXXX A="HAFT"; B="HASE"; C="WIRTSCHAFTSKRISE" print print print print print print print print "Sequentiell:" A,"in",C,":",Teilstring(A,C) B,"in",C,":",Teilstring(B,C) C,"in",C,":",Teilstring(C,C) "Induktiv:" A,"in",C,":",TeilstringI(A,C,0) B,"in",C,":",TeilstringI(B,C,0) C,"in",C,":",TeilstringI(C,C,0) Ausgabe: Sequentiell: HAFT in WIRTSCHAFTSKRISE : True HASE in WIRTSCHAFTSKRISE : False WIRTSCHAFTSKRISE in WIRTSCHAFTSKRISE : True Induktiv: HAFT in WIRTSCHAFTSKRISE : True HASE in WIRTSCHAFTSKRISE : False WIRTSCHAFTSKRISE in WIRTSCHAFTSKRISE : True Aufgabe 63 Schreiben Sie eine Funktion ueberweise(...), die folgendes tut: Sie wird mit drei Argumenten aufgerufen: als erstes Argument den Namen des Kontoinhabers, von dem etwas ueberwiesen wird, als zweites den Namen des Kontoninhabers, an den etwas ueberwiesen wird, und als drittes den zu überweisenden Betrag. Alle Daten werden in zwei Listen gespeichert. In der Liste Namen[...] stehen die Namen der Kontoinhaber, in der Liste Haben[...] stehen die Kontostände. So dass der Inhaber Namen[i] das Geld Haben[i] hat. Eine Funktion, die alle Kontostände ausgibt ist schon programmiert. Die zu programmierende Funktion ueberweise(...) muss die Inhalte der Haben-Liste entsprechend ändern. 29 Namen = ["Smak","Hoppel","Hopp","Pusch","Ueh","Hoppla"] Haben = [100, 150, 200, 25, 75, 120, ] def druckeAlleKontostaende(): for i in range(len(Namen)): print Namen[i],"hat",Haben[i], def ueberweise(von,an,Betrag): XXXXXXXXXX druckeAlleKontostaende(); print ueberweise("Hoppel","Ueh",40) druckeAlleKontostaende(); print Ausgabe: Smak hat 100 Hoppel hat 150 Hopp hat 200 Pusch hat 25 Ueh hat 75 Hoppla hat 120 Smak hat 100 Hoppel hat 190 Hopp hat 200 Pusch hat 25 Ueh hat 115 Hoppla hat 120 Aufgabe 64 Eine Liste enthält Zahlen, die mehrfach hintereinander kommen können. Die Ausgabe der Funktion encode(...), die mit der langen“ Liste als Argument aufgerufen wird, ” ist eine kurze“ Liste, in der nicht jedes Element der langen einzeln drin steht, ” sondern das Element gefolgt von der Häufigkeit. Die Funktion decode(...) macht aus einer so kodierte Liste wieder die Langversion. Die Funktion decode(...) ist gegeben, programmieren Sie die dazu passende Funktion encode(...) def decode(K): i = 0 L=[] while i<len(K): Wert = K[i]; i=i+1 Anzahl = K[i]; i=i+1 L=L+[Wert]*Anzahl return L def encode(L): XXXXXXXXXX A = [1,1,1,3,3,7,7,7,7,7,4,5,5,5] B = encode(A) print A,"kodiert ist",B C = decode(B) print B,"dekodiert ist",C Ausgabe: [1, 1, 1, 3, 3, 7, 7, 7, 7, 7, 4, 5, 5, 5] kodiert ist [1, 3, 3, 2, 7, 5, 4, 1, 5, 3] [1, 3, 3, 2, 7, 5, 4, 1, 5, 3] dekodiert ist [1, 1, 1, 3, 3, 7, 7, 7, 7, 7, 4, 5, 5, 5] Aufgabe 65 Die Funktion QuotRest erwartet zwei Argumente (Dividend und Divisor) und gibt als Funktionswert eine Liste zurück, die aus zwei Elementen besteht, nämlich als nulltes Element den Ganzzahlquotienten und als erstes Element den Rest der Divsion. 30 def QuotRest(x,y): XXXXXXXXXX print "17/5 ist [Quotien,Rest]:",QuotRest(17,5) Ausgabe: 17/5 ist [Quotien,Rest]: [3, 2] Aufgabe 66 Die Funktion Quersumme(...) berechnet die Quersumme ihres Arguments (im Zehnersystem). Das geht rekursiv so: z%10 ist die letzte Ziffer, und z/10 ist die Zahl, wenn man die letzte Ziffer weglassen würde. Die Quersumme berechnet sich demnach aus der letzten Ziffer plus der Quersumme der Restzahl. def Quersumme(z): if z==0: return XXXXXXXXXX return XXXXXXXXXX x=21437685 print "Die Quersumme von",x,"ist",Quersumme(x) Ausgabe: Die Quersumme von 21437685 ist 36 Aufgabe 67 Die Funktion Umdrehen(W) dreht die Buchstabenreihenfolge eines Wortes um. Aus HALLO wird OLLAH. Der Trivialfall der Rekursion besteht darin, dass das Wort weniger als zwei Buchstaben hat, dann ist es selbst seine eigene Umkehrung. Ansonsten besteht die Umkehrung aus der Umkehrung von allem ab dem ersten – nicht nullten – Buchstaben (also von W[1:]) gefolgt vom vordersten Buchstaben (also von W[0]). def Umdrehen(W): n=len(W) XXXXXXXXXX x = "Hallo Welt" print x,"umgedreht ist",Umdrehen(x) Ausgabe: Hallo Welt umgedreht ist tleW ollaH Aufgabe 68 Die funktion Suche(L,x) liefert True oder False zurück, je nachdem, ob die ihr übergebene Liste L ein x enthält oder nicht. Triviallfall ist, dass die Liste leer ist (len(L)==0), dann kommt x sicher nicht darin vor. Wenn die Liste nicht leer ist, kann man auf jeden Fall mal L[0] ansehen, und schauen, ob das dem x gleich ist und ggf. True zurückgeben, oder andernfalls im Rest der Liste (also L[1:]) weitersuchen. 31 def Suche(L,x): XXXXXXXXXX A=[1,4,3,9,7] print print print print "9 "2 "1 "7 Ausgabe: 9 in [1, 2 in [1, 1 in [1, 7 in [1, in",A,":",Suche(A,9) in",A,":",Suche(A,2) in",A,":",Suche(A,1) in",A,":",Suche(A,1) 4, 4, 4, 4, 3, 3, 3, 3, 9, 9, 9, 9, 7] 7] 7] 7] : : : : True False True True Aufgabe 69 Jetzt basteln wir eine Funktion, die genau das gleicht tut, wie die von Aufgabe 68. Der Rückgabewert wird diesmal einfach mit logischen Mitteln berechnet: x kommt in L vor, wenn len(L)>0 ist und wenn L[0]==x ist oder der Rest der Liste x enthält. Voll cool! Dazu ist es hilfreich zu wissen, dass Python, nachdem feststeht, dass in einer ??? and ??? Bedingung der Teil vor dem and schon false, der Rest der Bedingung gar nicht ausgewertet wird. Sollte also im Rest der Bedinung z. B. ein rekursiver Aufruf stehen, dann würde der nicht ausgeführt werden. Vervollständigen Sie die Funktion S, ohne dabei mehr als die eine Zeile mit einem einzigen return-Kommando zu programmieren. def S(L,x): return XXXXXXXXXX print print print print "9 "2 "1 "7 in",A,":",Suche(A,9) in",A,":",Suche(A,2) in",A,":",Suche(A,1) in",A,":",Suche(A,1) Die Ausgabe ist die gleiche wie bei Aufgabe 68. Aufgabe 70 Die folgende rekursive Funktion Wurzel(w,q) berechnet die Wurzel von q näherungsweise nach dem Schema der Funktion aus der Vorlesung (Übung). Sie erwartet zwei Argumente, als erstes einen potenziellen Wurzelwert (anfangs 0.0) und als zweites die Zahl von der wir die Wurzel suchen. Wenn der potenzielle Wert schon größer oder gleich der Wurzel ist, wird dieser Wert zurückgegeben. Wenn nicht, dann wird die Funktion wieder aufgerufen, diesmal mit einem um 0.01 erhöhten potenziellen Wert. Bemerkung: Da die Schachtelungstiefe rekursiver Funktionen in Python begrenzt ist, funktioniert die Funktion nicht, wenn man fuer q etwas sehr Großes einsetzt oder wenn die Schrittweite (hier 0.01) zu klein ist. Maximal knapp 1000 Schachtelungstiefen kann Python, danach kotzt es. 32 def Wurzel(w,q): if w*w>=q: XXXXXXXXXX return XXXXXXXXXX print "Wurzel von 4.0 ist etwa",Wurzel(0.0,4.0) print "Wurzel von 7.0 ist etwa",Wurzel(0.0,7.0) Ausgabe: Wurzel von 4.0 ist etwa 2.0 Wurzel von 7.0 ist etwa 2.65 Aufgabe 71 Die Funktion Striche(n) erzeugt einen Text der aus n Strichen besteht. Wenn n gleich 0 ist, wird einfach ein Leerstring zurückgegeben. Sonst wird ein Strich gefolgt von n-1 Strichen zurückgegeben. def Striche(n): if n==0: XXXXXXXXXX return XXXXXXXXXX print "7 Striche sehen so aus:",Striche(7) print "1 Strich sieht so aus:",Striche(1) print "0 Striche sehen so aus:",Striche(0) Ausgabe: 7 Striche sehen so aus: ||||||| 1 Strich sieht so aus: | 0 Striche sehen so aus: Aufgabe 72 Die vorgegebene Funktion betrag(x) ist Pipifax, bedarf keiner weiteren Erläuterung. Die Funktionen sinus und cosinus funktionieren so: Wenn x nahe 0.0 ist (d.h. betrag(x)<0.001), dann ist der sinus(x) in etwa gleich x, und cosinus(x) ist in etwa gleich 1.0. Wenn x weit genug weg ist von der 0.0, dann halbieren wir x und verwenden die Additionstheoreme des sinus(x/2+x/2) bzw. cosinus(x/2+x/2). (Alles in Radians) def betrag(x): if x>0: return x return -x def quadrat(x): return x*x def sinus(x): if betrag(x)<0.001: return XXXXXXXXXX return XXXXXXXXXX def cosinus(x): if betrag(x)<0.001: return XXXXXXXXXX return XXXXXXXXXX print "sin(2.5) =",sinus(2.5) print "cos(1.3) =",cosinus(1.3) 33 Ausgabe: sin(2.5) = 0.598929165149 cos(1.3) = 0.267609389073 Aufgabe 73 Um zu einem Datum den Wochentag zu berechnen, benötigt man fünf Ziffern: Tagesziffer, Monatsziffer, Jahresziffer, Jahrhundertziffer, Schaltjahrziffer. Die Tagesziffer ist der Tag im Monat modulo 7. Die Monatsziffer ist Jan = 0, Feb = 3, Mär = 3, Apr = 6, Mai = 1, Jun = 4, Jul = 6, Aug = 2, Sep = 5, Okt = 0, Nov = 3, Dez = 5. Die Jahresziffer ist (x+x/4) modulo 7 (wobei x das Jahr im Jahrhundert ist). Die Jahrhundertziffer ist 2 mal (3 - Jahrhundert modulo 4). Die Schaltjahrziffer ist 6 für Januar und Februar im Schaltjar, sonst 0. Die Summe der Ziffern modulo 7 ergibt den Wochentag: 0 = So, 1 = Mo, 2 = Di, 3 = Mi, 4 = Do, 5 = Fr, 6 = Sa. Verwenden Sie diese Information um eine Funktion Wochentag(t,m,j) zu programmieren, die für ein gegebenes Datum (erstes Argument = Tag, zweites Argument = Monat, drittes Argument = Jahr) den Wochentag auszugeben. Listen mit den Monatsziffern und den Wochentagsnamen sind schon vorgegeben und sollen verwendet werden. Monatsziffer = [0,3,3,6,1,4,6,2,5,0,3,5] Tagesnamen = ["So","Mo","Di","Mi","Do","Fr","Sa"] def Wochentag(Tag,Monat,Jahr): m = XXXXXXXXXX j = XXXXXXXXXX h = XXXXXXXXXX s = XXXXXXXXXX t = XXXXXXXXXX return Tagesnamen[(m+j+h+s+t)%7] print print print print "Heute ist",Wochentag(21,1,2010) "Der 29.9.1964 war",Wochentag(29,9,1964) "Der 14.7.1789 war",Wochentag(14,7,1789) "Der 11.11.2011 wird ein",Wochentag(11,11,2011),"sein" Ausgabe: Heute ist Do Der 29.9.1964 war Di Der 14.7.1789 war Di Der 11.11.2011 wird ein Fr sein Aufgabe 74 Schreiben Sie eine Funktion, die als Argument eine Liste erwartet, in der drei Elemente drin stehen, nämlich der Tag, der Monat und das Jahr eines Datums. Der Rückgabewert der Funktion soll einfach nur der kalendarisch nächste Tag sein – auch wieder als dreielementige Liste. 34 def NaechstesDatum(L): XXXXXXXXXX D1=[21,1,2010]; D2=[30,1,2010]; D3=[31,1,2010]; D4=[28,2,2010]; D5=[28,2,2000]; D6=[29,2,2000]; D7=[30,8,2010]; D8=[28,2,2012]; D9=[31,12,2010] print print print print print print print print print "Nach",D1,"kommt",NaechstesDatum(D1) "Nach",D2,"kommt",NaechstesDatum(D2) "Nach",D3,"kommt",NaechstesDatum(D3) "Nach",D4,"kommt",NaechstesDatum(D4) "Nach",D5,"kommt",NaechstesDatum(D5) "Nach",D6,"kommt",NaechstesDatum(D6) "Nach",D7,"kommt",NaechstesDatum(D7) "Nach",D8,"kommt",NaechstesDatum(D8) "Nach",D9,"kommt",NaechstesDatum(D9) Ausgabe: Nach [21, Nach [30, Nach [31, Nach [28, Nach [28, Nach [29, Nach [30, Nach [28, Nach [31, 1, 2010] kommt [22, 1, 2010] 1, 2010] kommt [31, 1, 2010] 1, 2010] kommt [1, 2, 2010] 2, 2010] kommt [1, 3, 2010] 2, 2000] kommt [29, 2, 2000] 2, 2000] kommt [1, 3, 2000] 8, 2010] kommt [31, 8, 2010] 2, 2012] kommt [29, 2, 2012] 12, 2010] kommt [1, 1, 2011] Aufgabe 75 Schreiben Sie eine Funktion, die als Argument zwei natürliche Zahlen erwartet und deren größten gemeinsamen Teiler (ggT) rekursiv berechnet und dabei die folgende Regel benutzt: Wenn a>b ist, dann ist der ggT gleich dem ggT von b und a modulo b. Wenn b=0 ist, dann ist der ggT gleich a. def ggT(a,b): XXXXXXXXXX print "ggT(123456,12345) =",ggT(123456,12345) print "ggT( 15330,10439) =",ggT( 15330,10439) Ausgabe: ggT(123456,12345) = 3 ggT( 15330,10439) = 73 Aufgabe 76 Das so genannte n-Damen-Problem stellt die Frage, wie man n Damen auf einem n×n Schachbrett positionieren kann, so dass keine zwei Damen in der selben Zeile oder Spalte oder Diagonale stehen. Schreiben Sie dazu eine induktiv-rekursive Funktion, die so arbeitet: Die Funktion erwartet zwei Argumente: als erstes die Nummer der Dame die positioniert werden soll (angefangen mit 0) und als zweites eine Liste mit allen Positionen der schon bis dahin stehenden Damen. Dabei ist jedes Listenelement selbst eine zweielementige Liste mit der Angabe der Zeile und Spalte einer Dame. D. h., dass z. B. die Liste [[1,2],[0,4]] bedeutet: es sind schon zwei Damen aufgestellt, die eine auf der Position 1. Zeile, 2. Spalte und die andere auf der Position 0. Zeile, 35 4. Spalte. Die Funktion geht so vor. Wenn schon n Damen positioniert sind, also die Nummer der zu positionierenden auch n ist, dann sind wir fertig und geben die Liste der Positionen gleich aus (diese Zeile ist fertig programmiert). Wenn noch nicht alle Positioniert sind, dann werden alle Brettfelder [i,j] getestet. Wenn eine auf [i,j] zu stellende Dame nicht von einer anderen bedroht“ wäre, wird Sie dort hin gestellt ” und die Funktion erneut aufgerufen (jetzt halt mit einer erweiterten Positionenliste). Die Funktion, die Prüft, ob das Feld in der x-ten Zeile, y-ten Spalte von einer Dame aus einer gegbene Liste L bedroht ist, ist schon programmiert. Sie dürfen Sie benutzen. Vervollstöndigen Sie die Funktion Damen(...), so dass sie eine Lösung des 8Damenproblems berechnet. Hinweis: Das kann durchaus 30 Sekunden dauern. Und wenn Sie gefragt werden ob das Programm gekillt werden soll, lassen Sie es ruhig (auf Kosten einer Fehlermeldung) weiter leben. Das Kommando exit(0) bewirkt nämlich einen Radikalabbruch, ohne den alle Lösungen ausgegeben würden – und das könnten aaaarg viele sein. def droht(x1,y1,x2,y2): return x1==x2 or y1==y2 or x1-y1==x2-y2 or x1+y1==x2+y2 def bedroht(x,y,L): return len(L)>0 and (droht(x,y,L[0][0],L[0][1]) or bedroht(x,y,L[1:])) n=8 def Damen(k,L): if k==n: print L, exit() for i in range(n): for j in range(n): XXXXXXXXXX Damen(0,[]) Ausgabe: [[0, 0], [1, 4], [2, 7], [3, 5], [4, 2], [5, 6], [6, 1], [7, 3]] Aufgabe 77 Eine Uhrzeit soll in einer dreielementigen Liste gespeichert werden. Das erste Element soll die Stunde, das zweite die Minute und das dritte die Sekunde sein, d. h. 13 Uhr 25 wäre [13,25,0]. Programmieren Sie eine Funktion, die zwei solcher Listen als Argument erwartet und als Rückgabewert die Summe der beiden Zeiten zurückgibt. def ZeitPlus(X,Y): XXXXXXXXXX Z1 = [15,26,37]; Z2 = [4,33,41]; Z3 = [16,54,59] print Z1,"+",Z2,"=",ZeitPlus(Z1,Z2) print Z1,"+",Z3,"=",ZeitPlus(Z1,Z3) print Z2,"+",Z3,"=",ZeitPlus(Z2,Z3) Ausgabe: [15, 26, 37] + [4, 33, 41] = [20, 0, 18] [15, 26, 37] + [16, 54, 59] = [8, 21, 36] [4, 33, 41] + [16, 54, 59] = [21, 28, 40] Aufgabe 78 Schreiben Sie eine Funktion die als Ergebnis ihr auf eine Ganzzahl gerundetes positives Fließkommaargument zurück liefert. Verwenden Sie dazu keine anderen Funktionen. 36 def Runden(x): XXXXXXXXXX pi = 3.14159; e = 2.71828 print pi,"gerundet ist",Runden(pi) print e,"gerundet ist",Runden(e) Ausgabe: 3.14159 gerundet ist 3 2.71828 gerundet ist 3 Aufgabe 79 Schreiben Sie eine Funktion die das kleinste gemeinsame Vielfache ihrer beiden natürlichzahligen Element als Ergebnis zurück liefert. (Hinweis: kgV(x,y) = xy/ggT(x,y)) def kgV(a,b): XXXXXXXXXX print "kgV(27,36) =",kgV(27,36) print "kgV(27,13) =",kgV(27,13) print "kgV(99,66) =",kgV(99,66) Ausgabe: kgV(27,36) = 108 kgV(27,13) = 351 kgV(99,66) = 198 Aufgabe 80 Schreiben Sie eine Funktion Anlage(K,z,n), die berechnet, wieviel das Kapital K wert ist, nachdem es n Jahre lang nachschüssig mit z% verzinst wird ¡ ¢ (also mit Zinseszins z n und Liegenlassen). Mathematisch ist das Ergebnis K · 1 + 100 . def Anlage(K,z,n): XXXXXXXXXX print "1000 Euro bei 5% fuer 10 Jahre:",Anlage(1000,5,10) print " 100 Euro bei 3% fuer 5 Jahre:",Anlage( 100,3, 5) Ausgabe: 1000 Euro bei 5% fuer 10 Jahre: 1628.89462678 100 Euro bei 3% fuer 5 Jahre: 115.92740743 Aufgabe 81 Schreiben Sie eine Funktion Zins(r,E,n), die berechnet, wie hoch der jährlich nachschüssig zu zahlende Zins sein müsste, damit aus einem Sparvertrag, in den jährlich vorschüssig die Rate r eingezahlt wird nach n Jahren des Endkapital E wird. Der Rückgabewert sollte schon auf ein paar Stellen hinter dem Komma exakt sein. (Hinweis: für dieses Problem gibt es keine mathematische Lösungsformel.) 37 def Zins(r,E,n): XXXXXXXXXX print "10 mal am 1.1. 1000 Euro => 20000 braucht:",Zins(1000,20000,10),"%" print "30 mal am 1.1. 100 Euro => 10000 braucht:",Zins( 100,10000,30),"%" Ausgabe: 10 mal am 1.1. 1000 Euro => 20000 braucht: 12.3041451909 % 30 mal am 1.1. 100 Euro => 10000 braucht: 6.94360295311 % Aufgabe 82 Schreiben Sie eine Funktion, die als Argument die ersten 9 Ziffern eines ISBN Büchercodes erwartet (als String). Die Ausgabe der Funktion soll (auch als String) die letzte Ziffer (die Prüfziffer= des Codes sein. Dazu ist es sinnvoll zu wissen: Die gewichtete Summe aller Ziffern lässt sich ohne Rest durch 11 teilen. Mit gewichteter Summe ist gemeint 10 mal vorderste Ziffer + 9 mal zweitvordertste + 8 mal + · · · + 2 mal vorletzte Ziffer + 1 mal die Prüfziffer. Die Prüfziffer kann allerdings nicht nur 0 bis 9 sein, sondern auch 10, wofür dann X geschrieben wird. Der Teil der Funktion, der die gewichtete Summe der ersten 9 Ziffern berechnet ist schon vorprogrammiert. def ISBN(S): sum=0 for i in range(9): sum=sum+(10-i)*int(S[i]) XXXXXXXXXX I1="352816989"; I2="346457315"; I3="223456789" print "Pruefziffer fuer",I1,"ist",ISBN(I1) print "Pruefziffer fuer",I2,"ist",ISBN(I2) print "Pruefziffer fuer",I3,"ist",ISBN(I3) Ausgabe: Pruefziffer fuer 352816989 ist 3 Pruefziffer fuer 346457315 ist X Pruefziffer fuer 223456789 ist 0 Aufgabe 83 Schreiben Sie eine Funktion, die ein Notenhistogramm auf dem Bildschirm ausgibt. Die Funktion erwartet eine Liste, in der unsere Standard Noten drin stehen (ganze Zahlen oder ±0,3). Das Histogramm ist ein Balkendiagramm, das darstellt, wie viele Noten von welcher Notengruppe in der Liste stehen (das Ausgabebild sollte alles erklären). def PrintHisto(L): XXXXXXXXXX N=[2.3,2.7,1.3,5.0,4.0,4.7,3.0,3.3,4.0,1.0,2.3,2.7,2.3, 3.7,3.3,4.0,2.0,1.7,3.3,3.0,2.7,5,0,4,0,3,7,3.3,2.0] PrintHisto(N) Ausgabe: 38 1 2 3 4 5 **** ****** ********** ***** **** Aufgabe 84 Schreiben Sie eine Funktion, die eine sonst wo definierte Funktion f(x) numerisch zwischen zwei gegebenen Grenzen integriert. Ihre Funktion soll int(f,a,b,n) heißen, als erstes Argument eine Funktion (d.h. deren Namen) erwarten, als zweites und drittes Rb die Integralgrenze, so dass sie die mathematische Formel a f (x) dx näherungsweise berechnet. Das letzte Argument gibt an, in wie viele Streifen das Integral geteil Rb b − a Pn b−a werden soll. Die Funktion rechnet dann a f (x) dx ≈ ) i=1 f (a + i · n n def f(x): return x*x def g(x): return 1-x*x*x+x def int(f,a,b,n): XXXXXXXXXX print "Integral von x*x zwischen 1.0 und 2.0 ist ca.",int(f,1.0,2.0,1000) print "Integral von 1-x*x*x+x zwischen -0.5 und 0.2 ist ca.",int(g,-0.5,0.2,1000) Ausgabe: Integral von x*x zwischen 1.0 und 2.0 ist ca. 2.3358335 Integral von 1-x*x*x+x zwischen -0.5 und 0.2 ist ca. 0.610860975725 Aufgabe 85 Vervollständigen Sie die Funktion Vorfahr(A,B) so dass die True oder False zurück gibt, je nachdem, ob A ein Vorfahr von B ist. Der Anfang des biblischen Stammbaums ist bereits gegeben. Er besteht aus einer Liste von Teillisten. In jeder Teilliste steht als erstes der Name eines Typen, und die restlichen Listenelemente sind die Namen seiner Buben. So steht z. B. in der 4.-letzten Teilliste [”Noah”,”Sem”, ”Ham”,”Jafet”], was bedeutet, dass Noahs Buben Sem, Ham und Jafet hießen. Die zu programmierende Funktion muss rekursiv laufen, nach dem Schema A ist Vorfahr von B, falls B ein Bub von A ist oder falls ein Bub von A Vorfahr von B ist. Stammbaum = [["Adam","Kain","Abel","Set"], ["Kain","Henoch"], ["Henoch","Irad"], ["Irad","Mehujael"], ["Mehujael","Metuschael"], ["Metuschael","Lamech"], ["Lamech","Jabal","Jubal","Tubal-Kain","Naama"], ["Set","Enosch"], ["Enosch","Kenan"], ["Kenan","Mahalalel"], ["Mahalalel","Jered"], ["Jered","Henoch2"], ["Henoch2","Metuschelach"], ["Metuschelach","Lamech"], ["Lamech","Noah"], ["Noah","Sem","Ham","Jafet"], ["Sem","Elam","Assur","Arpachschad","Lud","Aram"], ["Aram","Uz","Hul","Geter","Masch"], ["Arpachschad","Schelach","Kenan2"]]; def Vorfahr(A,B): for i in Stammbaum: if i[0]==A: for j in i[1:]: if XXXXXXXXXX: return True return False print "Ist Adam Vorfahr von Schelach?",Vorfahr("Adam","Schelach") print "Ist Noah Vorfahr von Jafet?",Vorfahr("Adam","Jafet") print "Ist Lamech Vorfahr von Henoch?",Vorfahr("Lamech","Henoch") 39 Ausgabe: Ist Adam Vorfahr von Schelach? True Ist Noah Vorfahr von Jafet? True Ist Lamech Vorfahr von Henoch? False Aufgabe 86 Schreiben Sie eine Funktion, die das gleiche tut, wie Aufgabe 80, nur diesmal nach dem Schema der Induktion. Im Prinzip funktioniert das so. Das was man nach n Jahren hat ist das, was man nach n-1 Jahren hat plus die Zinsen drauf. Und nach 0 Jahren hat man genau das Anfangskapital. def AnlageI(K,z,n): if n==0: XXXXXXXXXX return XXXXXXXXXX print "1000 Euro bei 5% fuer 10 Jahre:",AnlageI(1000,5,10) print " 100 Euro bei 3% fuer 5 Jahre:",AnlageI( 100,3, 5) Ausgabe: 1000 Euro bei 5% fuer 10 Jahre: 1628.89462678 100 Euro bei 3% fuer 5 Jahre: 115.92740743 Aufgabe 87 Schreiben Sie eine Funktion, die das gleiche tut, wie Aufgabe 37, nur diesmal nach dem Schema der Induktion. Im Prinzip funktioniert das so. Eine einstellige Zahl hat eine Stell, sonst hat sie eine Stelle mehr als ein Zehntel der Zahl hat. def Stellen(z): if XXXXXXXX: return XXXXXXXX return XXXXXXXXXX n = input("n = ") print n,"hat",Stellen(n),"Stellen" n = 12345 5 oder n = 4711 4 oder n = 68 2 Aufgabe 88 Vervollständigen Sie die Funktion Laenge(T), die als Argument eine Liste mit Städtenummern erwartet. In der Liste Entfernung[...] ist festgehalten, in welcher Entfernung zwei Städte liegen. So bedeutet z. B. Entfernung[3][1]==39, dass der Weg von Stadt 3 zu Stadt 1 39 Kilometer ist. (Die Entfernungsmatrix ist nicht symmetrisch – muss sie ja auch gar nicht sein.). Das Argument von Laenge(T) ist eine Tour durch die Städte, die bei T[0] anfängt und bis T[-1] läuft und schließlich von dort wieder zum Ausgangspunkt T[0] fährt (eine Rundtour also). Vervollständigen Sie die Funktion so, dass sie die Länge der Tour korrekt berechnet. 40 Entfernung = [[0,25,55,80,99], [17,0,38,22,56], [45,46,0,12,18], [33,39,30,0,15], [29,28,20,14,0]] def Laenge(T): l=0 for i in T: XXXXXXXXXX return l T1=[0,1,2,3,4]; T2=[1,0,4,3,2]; print "Laenge von",T1,"ist",Laenge(T1) print "Laenge von",T2,"ist",Laenge(T2) Laenge von [0, 1, 2, 3, 4] ist 119 Laenge von [1, 0, 4, 3, 2] ist 206 Aufgabe 89 Schreiben Sie eine Funktion qz(n), die zu einer gegebenen Zahl n eine Liste zurückliefert, deren Elemente selbst wieder Listen sind, nämlich solche, die zwei Elemente enthalten, für deren Quadrate als Summe die Zahl n herauskommt. D.h. die Funktion berechnet alle Arten, wie sich die Zahl n als Summe zweier Quadrate schreiben lässt. def qz(n): XXXXXXXXXX for k in range(100): x = qz(k) if len(x)>0: print k,"laesst sich schreiben als Summe der Quadrate von" for q in x: print " ",q[0],"und",q[1] 0 laesst sich schreiben als Summe der Quadrate von 0 und 0 1 laesst sich schreiben als Summe der Quadrate von 0 und 1 2 laesst sich schreiben als Summe der Quadrate von 1 und 1 . . . 65 laesst sich schreiben als Summe der Quadrate von 1 und 8 4 und 7 68 laesst sich schreiben als Summe der Quadrate von 2 und 8 . . . 98 laesst sich schreiben als Summe der Quadrate von 7 und 7 41 Aufgabe 90 Schreiben Sie eine Funktion billiger(Ort,Menge,Geld), die drei gleich lange Listen erwartet, eine mit Ortsbezeichnungen, eine mit Produktmenge (z. B. in Gramm oder so), und eine mit Preisen. So steht an i-ter Stelle: Im Ort Ort[i] gibt es eine Packungsgröße von Menge[i] zum Preis von Geld[i]. Der Rückgabewert der Funktion soll der Name des Ortes sein, an dem es das beste Preis/Menge-Verhältnis gibt. wo = ["Tante Emma","Supermarkt","Grossmarkt","Kaufladen","Nachbar"] wieviel = [100,500,1000,250,50] Preis = [20,40,99,15,10] def billiger(Ort,Menge,Geld): XXXXXXXXXX print "Der billigste ist:",billiger(wo,wieviel,Preis) Der billigste ist: Kaufladen Aufgabe 91 Schreiben Sie eine Funktion Skalarprodukt(...), die zwei als Listen gegebene Vektoren miteinander skalarmultipliziert und das Ergebnis zurück liefert. def Skalarprodukt(x,y): XXXXXXXXXX v1=[1,2,3,4]; v2=[3,1,0,-2] print v1,"*",v2,"=",Skalarprodukt(v1,v2) print v1,"*",v1,"=",Skalarprodukt(v1,v1) print v2,"*",v2,"=",Skalarprodukt(v2,v2) [1, 2, 3, 4] * [3, 1, 0, -2] = -3 [1, 2, 3, 4] * [1, 2, 3, 4] = 30 [3, 1, 0, -2] * [3, 1, 0, -2] = 14 Aufgabe 92 Schreiben Sie eine Funktion Matrixprodukt(...), die zwei als Listen von Listen gegebene Matrizen miteinander multipliziert und das Ergebnis ebenso als Matrix zurück liefert. def Matrixprodukt(A,B): XXXXXXXXXX X=[[1,2,-1,0],[2,-1,-2,1],[0,3,3,2]] # 3x4-Matrix Y=[[4,1,2],[0,-1,1],[2,2,0]] # 3x3-Matrix print "Y*X =",Matrixprodukt(Y,X) print "Y*Y =",Matrixprodukt(Y,Y) Y*X = [[6, 13, 0, 5], [-2, 4, 5, 1], [6, 2, -6, 2]] Y*Y = [[20, 7, 9], [2, 3, -1], [8, 0, 6]] 42 Aufgabe 93 Schreiben Sie eine Funktion det(A), die von einer Matrix gegeben als Liste von Listen (so dass A[i][j] der Koeffizient aij ist) die Determinante berechnet. Gehen Sie dazu so vor, dass Sie die Determinante nach der ersten Zeile nach der Regel von Laplace entwickeln. (Ja, das ist rekursiv.) def det(A): XXXXXXXXXX A = [[1,2],[3,4]] B = [[2,0,0],[0,5,0],[0,0,-3]] C = [[1,-1,2,3],[3,0,4,3],[2,2,2,1],[-1,0,1,1]] print "det(",A,") =",det(A) print "det(",B,") =",det(B) print "det(",C,") =",det(C) det( [[1, 2], [3, 4]] ) = -2 det( [[2, 0, 0], [0, 5, 0], [0, 0, -3]] ) = -30 det( [[1, -1, 2, 3], [3, 0, 4, 3], [2, 2, 2, 1], [-1, 0, 1, 1]] ) = -17 Aufgabe 94 Schreiben Sie eine Funktion Schnitt(a,x,b,y), die berechnet (und als Funktionswert zurück liefert) was die Durchschnittsgeschwindigkeit ist, wenn man a km mit einem Tempo von x km/h und dann noch b km mit einem Tempo von y km/h durchfährt. def Schnitt(a,x,b,y): XXXXXXXXXX print "20 km mit 15 km/h und 30 km mit 20 km/h => Schnitt = ",Schnitt(20.0,15.0,30.0,20.0) print "50 km mit 20 km/h und 40 km mit 90 km/h => Schnitt = ",Schnitt(50.0,40.0,40.0,90.0) 20 km mit 15 km/h und 30 km mit 20 km/h => Schnitt = 17.6470588235 50 km mit 20 km/h und 40 km mit 90 km/h => Schnitt = 53.1147540984 Aufgabe 95 Schreiben Sie eine Funktion, die ein Argument erwartet, eine Liste mit Noten. Die Funktion berechnet nach dem Schema der Induktion die Durchfallquote (also den Anteil an Noten > 4). Da kein Parameter n vorhanden ist, muss eben die Liste selbst mit jedem Aufruf verkleinert werden. (Wenn Sie bei der Ausgabe Rundungsfehler sehen, ist das egal.) def DQ(L): XXXXXXXXXX Noten = [2.0,3.3,1.7,4.7,5.0,2.3,5.0,1.0] print "DQ(",Noten,") =",DQ(Noten) DQ( [2.0, 3.3, 1.7, 4.7, 5.0, 2.4, 5.0, 1.0] ) = 0.375 43 Aufgabe 96 Vervollständigen Sie die Funktion Primfaktoren, so dass die alle Primteiler ihres Arguments in einer Liste zurück gibt. def Primfaktoren(n): P=[] t=2 while t<=n: XXXXXXXXXX t=t+1 return P print "Primfaktoren von",12345,"sind",Primfaktoren(12345) print "Primfaktoren von",12348,"sind",Primfaktoren(12348) Primfaktoren von 12345 sind [3, 5, 823] Primfaktoren von 12348 sind [2, 3, 7] Aufgabe 97 Vervollständigen Sie die Funktion Primfaktoren, so dass die alle Primteiler ihres Arguments in einer Liste zurück gibt. Diesmal soll die Funktion aber rekursiv sein. def Primfaktoren(n,t): P=[] if n==1: return P if n%t==0: XXXXXXXXXX return XXXXXXXXXX print "Primfaktoren von",12345,"sind",Primfaktoren(12345,2) print "Primfaktoren von",12348,"sind",Primfaktoren(12348,2) Primfaktoren von 12345 sind [3, 5, 823] Primfaktoren von 12348 sind [2, 3, 7] Aufgabe 98 Wir betrachten nochmal den biblischen Stammbaum der Aufgabe 85. Basteln Sie diesmal eine Funktion, die einen Namen als Argument erwartet und als Ergebnis den Namen des Opas des Arguments zurück liefert. 44 Stammbaum = [["Adam","Kain","Abel","Set"], ["Kain","Henoch"], ["Henoch","Irad"], ["Irad","Mehujael"], ["Mehujael","Metuschael"], ["Metuschael","Lamech"], ["Lamech","Jabal","Jubal","Tubal-Kain","Naama"], ["Set","Enosch"], ["Enosch","Kenan"], ["Kenan","Mahalalel"], ["Mahalalel","Jered"], ["Jered","Henoch2"], ["Henoch2","Metuschelach"], ["Metuschelach","Lamech"], ["Lamech","Noah"], ["Noah","Sem","Ham","Jafet"], ["Sem","Elam","Assur","Arpachschad","Lud","Aram"], ["Aram","Uz","Hul","Geter","Masch"], ["Arpachschad","Schelach","Kenan2"]]; def Opa(A): XXXXXXXXXX print "Opa von Noah ist",Opa("Noah") print "Opa von Kain ist",Opa("Kain") print "Opa von Aram ist",Opa("Aram") Opa von Noah ist Metuschael Opa von Kain ist niemand Opa von Aram ist Noah Aufgabe 99 Wandeln Sie ein Programm mit for-Schleifen in eines mit while-Schleifen um. Schreiben Sie dazu im Programmskelett einfach unter den Kommentar ein Stückchen Programm, das genau die gleiche Ausgabe macht wie das vorhandene Stück, nur eben ohne for-Schleife. L=[22,17,33,38,11,12,17,14] for i in L: for j in range(i-8,i-2): print j, print # Und jetzt das gleiche nochmal, # nur mit while- statt for-Schleifen. XXXXXXXXXX 45 14 15 16 17 18 19 9 10 11 12 13 14 25 26 27 28 29 30 30 31 32 33 34 35 3 4 5 6 7 8 4 5 6 7 8 9 9 10 11 12 13 14 6 7 8 9 10 11 14 15 16 17 18 19 9 10 11 12 13 14 25 26 27 28 29 30 30 31 32 33 34 35 3 4 5 6 7 8 4 5 6 7 8 9 9 10 11 12 13 14 6 7 8 9 10 11