Übungen
Aufgabe 1: Eine Liste durchlaufen
Jede natürliche Zahl lässt sich eindeutig als Produkt von Primzahlen darstellen. So kann etwa die Zahl 84 wie folgt dargestellt werden: 84 = 2*2*3*7.
Die Primfaktorzerlegung einer Zahl soll hier mit Hilfe einer Liste dargestellt werden. Für die Zahl 84
ist dies die Liste [2, 2, 3, 7]
.
(a) Will man aus dieser Primfaktorliste zu einer Zahl die dargestellte Zahl rekonstruieren, so muss man das Produkt der Listenelemente bestimmen. Teste das folgende Programm (auch mit anderen Initialisierungen). Ergänze Ausgabeanweisungen so, dass man die Produktberechnung mitverfolgen kann.
# Initialisierung
primfaktoren = [2, 2, 3, 7]
# Verarbeitung
produkt = 1
for element in primfaktoren:
produkt = produkt * element
# Ausgabe
print('Primfaktoren:', primfaktoren)
print('Zahl:', produkt)
(b) Mit einem Programm soll ermittelt werden, wie oft eine vorgegebene Primzahl in einer Primfaktorliste vorkommt. Entwickle und teste ein solches Programm. Hinweis: Zähler benutzen.
(c) (schwierig, da man verschachtelte Listen erzeugen soll) Die Primfaktorzerlegung einer Zahl kann auch mit Potenzen geschrieben werden:
84 = 22*31*50*71. Eine solche Darstellung mit Potenzen könnte man
in Listenform so beschreiben: [[2, 2], [3, 1], [5, 0], [7, 1]]
. Wie müsste man die Produktberechnung
in (a) abändern, damit man solche Primfaktordarstellungen in entsprechende Zahlen
umrechnen kann?
(d) Entwickle und teste ein Programm, das die Darstellung aus (a) (z.B. [2, 2, 3, 7]
) in eine Darstellung wie in (c) (z.B. [[2, 2], [3, 1], [5, 0], [7, 1]]
oder [[2, 2], [3, 1], [7, 1]]
) umwandelt.
(e) (Für Experten:)
Entwickle und teste ein Programm, das eine Zahl als Eingabe erhält und die Primfaktorzerlegung als Liste ermittelt und ausgibt.
Aufgabe 2: Eine Liste auf eine Eigenschaft untersuchen
(a) Was leistet das folgende Programm? Kannst du es durch Analyse des Quelltextes erschließen? Überprüfe deine Vermutung mit Hilfe von Tests.
# Initialisierung
L = ['Meier', 'Bauer', 'Moser', 'Molitor', 'Martin']
# Verarbeitung
trifftzu = True
for e in L:
if e[0] != 'M':
trifftzu = False
# Ausgabe
if trifftzu == True:
print('Alle Namen fangen mit M an.')
else:
print('Nicht alle Namen fangen mit M an.')
(b) Mit einem Programm soll überprüft werden, ob eine Zahlenliste nur positive Zahlen enthält.
Aufgabe 3: Eine neue Liste aufbauen
(a) Was leistet das folgende Programm? Kannst du es durch Analyse des Quelltextes erschließen? Überprüfe deine Vermutung durch geeignete Tests.
# Initialisierung
xWerte = [-2, -1, 0, 0.5, 1, 1.5, 2]
# Verarbeitung
yWerte = []
for x in xWerte:
y = x*x - 4
yWerte = yWerte + [y]
# Ausgabe
print(xWerte)
print(yWerte)
(b) Ein Programm soll alle Zahlen aus einer Zahlenliste verdoppeln und diese neue Liste als Ergebnis ausgeben.
(c) Mit einem Programm sollen aus einer Namensliste all die Namen herausgefiltert werden, die mit M anfangen. Hierzu soll eine neue Liste mit den mit M beginnenden Namen aufgebaut werden.
Aufgabe 4: Eine Liste über die Elementnummern durchlaufen
(a) Was leistet das folgende Programm? Kannst du es durch Analyse des Quelltextes erschließen? Überprüfe deine Vermutung durch geeignete Tests.
# Initialisierung
L = ['Meier', 'Bauer', 'Moser', 'Molitor', 'Schmitt', 'Ludwig', 'Schmitt']
name = 'Schmitt'
# Verarbeitung
n = -1
i = 0
while (i < len(L)) and (n < 0):
if L[i] == name:
n = i
i = i + 1
# Ausgabe
print(n)
(b) Ein Programm soll die letzte Indexnummer eines Elements in einer Liste zurückgeben.
Aufgabe 5: Kopieren von Listen
Die von der Variablen L
verwaltete Liste soll kopiert und anschließend verändert werden.
Welche Version ist korrekt?
L = [0, 1, 2, 3, 4, 5]
M = L
for i in range(len(M)):
M[i] = M[i] + 1
print(M)
print(L)
oder
L = [0, 1, 2, 3, 4, 5]
M = L[:]
for i in range(len(M)):
M[i] = M[i] + 1
print(M)
print(L)
Warum zeigen die beiden Versionen ein unterschiedliches Verhalten?
Aufgabe 6: Seiteneffekte bei der Listenverarbeitung
Teste das folgende Programm. Erkläre, was hier schiefgeht.
# Initialisierung
L = [1, 2, 3]
print(L)
# Verarbeitung
H = L
for i in range(len(L)):
L[i] = H[len(L)-i-1]
# Ausgabe
print(L)