Lange Nacht des Python Programmierens

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