lehrkraefte:blc:informatik:glf20:programmieren:listen2kw

Listen (Arrays)

Eine Liste (auch Array genannt) ist eine geordnete Zusammenfassung von Werten, die auch in einer Variablen gespeichert werden könnte. Auf die Werte kann mit eckigen Klammern [Index] zugegriffen werden, wobei der Index von $0$ bis $n-1$ geht, mit $n$ gleich der Anzahl Elemente.

Die Variablen, die Listen enthalten, sollten einen Namen im Plural erhalten, wie z.B. namen, gewichte, noten, etc.

Kopieren, testen, verstehen und verändern Sie folgendes Programm:

namen = ["Null", "Eins", "Zwei"]
print("namen[2] ist ")
print(namen[2])
 
anzahl = len(namen)
print("namen hat %d Elemente" % anzahl)

Die wichtigsten Dinge für Arrays zusammengefasst:

  • a=[wert1, wert2,…] # Initialisierung mit gegebenen Werten (Zahlen, Strings oder sogar weitere Listen)
  • a[3] # Zugriff auf das vierte Element. Das erste Element ist a[0].
  • len(a) # Anzahl Elemente in einer Liste
  • a.append(42) # Neues Element hinten anhängen und die Liste damit verlängern.

Typischerweise werden die Elemente einer Liste in einem for-loop verarbeitet. Testen und verstehen Sie folgende Beispiele:

namen = ["Null", "Eins", "Zwei"]
for i in range(len(namen)):
  print("namen[%d] = %s" % (i,namen[i]))

Wird der index des Elements nicht gebraucht, bietet sich folgende Abkürzung an:

klasse = ["Albert", "Berta", "Chloe"]
for sus in klasse:
  print("Hier ist " + sus)

Sind die Elemente und der Index nötig, bietet sich folgende Abkürzung mit enumerate an:

klasse = ["Albert", "Berta", "Chloe"]
for i,sus in enumerate(klasse):
  print("Index %d ist %s" % (i,sus))

Die Erzeugung von Arrays kann ebenfalls in einem for-loop stattfinden. Testen und verstehen Sie folgende Beispiele:

quadrate = []   # Leere Liste
for i in range(10):
  quadrate.append(i*i)   # Neues Element hinten anfügen
print("Das Quadrat von 5 ist %d" % quadrate[5])
print("Und jetzt noch die ganze Liste:")
print(quadrate)

Ist die Initialisierung sehr einfach (d.h. das Element kann in einem Ausdruck aus dem Index berechnet werden), kann diese auch in einer Zeile in der folgenden Form geschrieben werden:

quadrate = [i*i for i in range(10)]
print(quadrate)

Ziel ist es ein Programm zu schreiben, das beliebige Beträge (erst mal nur in Noten) auszahlen kann.

Die grundlegende Idee ist, immer die grösstmögliche Note so oft wie möglich auszuzahlen und sich dann um den Rest zu kümmern.

Testen und Verstehen Sie folgenden Code:

betrag = 480  # oder   betrag=inputInt("Bitte Betrag eingeben")
 
if betrag>=200:
    anzahl = int(betrag/200)
    print("%d 200er Noten" % anzahl)
    betrag -= 200*anzahl
 
if betrag>=100:
    anzahl = int(betrag/100)
    print("%d 100er Noten" % anzahl)
    betrag -= 100*anzahl
 
if betrag>=50:
    anzahl = int(betrag/50)
    print("%d 50er Noten" % anzahl)
    betrag -= 50*anzahl
 
if betrag>=20:
    anzahl = int(betrag/20)
    print("%d 20er Noten" % anzahl)
    betrag -= 20*anzahl
 
if betrag>=10:
    anzahl = int(betrag/10)
    print("%d 10er Noten" % anzahl)
    betrag -= 10*anzahl
 
if betrag>0:
    print("Es ist noch ein Betrag von %d übrig" % betrag)
 

Was ins Auge sticht sind die wiederholten Code-Abschnitte. Das sollte wenn möglich vermieden werden, aus verschiedenen Gründen:

  • Mühsam zu tippen.
  • Anfälligkeit für Tippfehler (nur ein Fall funktioniert nicht, was schwerer feststellbar ist)
  • Unübersichtlichkeit

Darum soll der Code wie folgt neu geschrieben werden:

betrag = 480  # oder   betrag=inputInt("Bitte Betrag eingeben")
noten = [200,100,50,20,10]
for note in noten:
  #
  # TODO: Nur noch ein einziges if...
  #
if betrag>0:
    print("Es ist noch ein Betrag von %d übrig" % betrag)

Erweitern Sie den Code nun so, dass auch Münzen ausbezahlt werden.

Geben ist folgendes Array:

array.py
a = [58, 64, 2, 79, 92, 46, 80, 54, 50, 86, 72, 50, 84, 37, 76, 84, 14, 60, 99, 65, 66, 47, 28, 48, 38, 51, 17, 51, 6, 73, 20, 5, 83, 15, 43, 76, 93, 53, 65, 15, 91, 64, 86, 1, 63, 82, 96, 96, 35, 62, 37, 55, 51, 39, 96, 5, 24, 31, 23, 45, 75, 100, 81, 57, 67, 1, 55, 21, 80, 77, 89, 13, 75, 7, 49, 28, 31, 30, 41, 1, 57, 58, 75, 42, 14, 47, 64, 59, 9, 95, 59, 68, 74, 60, 99, 93, 39, 38, 65, 24]

Gesucht sind folgende Dinge (wenn es mehrere Lösungen geben sollte, ist immer nur die erste auszugeben)

  • Position und Wert des kleinsten und grössten Elements
  • Position und Länge der längsten Sequenz strikt aufsteigender Zahlen
  • Position und Länge der längsten Sequenz ungerader Zahlen
Minimum 1 bei Index 43
Maximum 100 bei Index 61
Aufsteigende Sequenz mit Länge 4, Start bei 33, Sequenz [15, 43, 76, 93]
Ungerade Sequenz mit Länge 6, Start bei 62, Sequenz [81, 57, 67, 1, 55, 21]

Lösungsvorschläge

Lösungsvorschläge

arraysuche.py
a = [58, 64, 2, 79, 92, 46, 80, 54, 50, 86, 72, 50, 84, 37, 76, 84, 14, 60, 99, 65, 66, 47, 28, 48, 38, 51, 17, 51, 6, 73, 20, 5, 83, 15, 43, 76, 93, 53, 65, 15, 91, 64, 86, 1, 63, 82, 96, 96, 35, 62, 37, 55, 51, 39, 96, 5, 24, 31, 23, 45, 75, 100, 81, 57, 67, 1, 55, 21, 80, 77, 89, 13, 75, 7, 49, 28, 31, 30, 41, 1, 57, 58, 75, 42, 14, 47, 64, 59, 9, 95, 59, 68, 74, 60, 99, 93, 39, 38, 65, 24]
 
minimum = a[0]  # Kleinster Wert
minpos=0        # Index vom kleinstem Wert
maximum = a[0]  # Grösster Wert
maxpos=0        # Index vom grössten Wert
 
maxlen = 1      # Maximale Länge aufsteigender Sequenz
inclen = 1      # Aktuelle Länge der Sequenz
incpos = 0      # Startposition der längsten Sequenz
 
oddlen = 0      # Aktuelle Länge ungerader Sequenz
oddpos = 0      # Startposition der längsten Sequenz
maxodd = 0      # Maximale Länge der Sequenz, die bis jetzt gefunden wurde.
 
for i in range(len(a)):
    if a[i]<minimum:  # kleineres Element?
        minimum=a[i]
        minpos = i
    if a[i]>maximum:  # grösseres Element?
        maximum=a[i]
        maxpos = i
    if i>0 and a[i]>a[i-1]:  # Aufsteigend?
        inclen+=1
        if (inclen>maxlen):  # Besser als bereits gefunden?
            maxlen=inclen
            incpos = i-maxlen+1
    else:
        inclen=1       # Nicht aufsteigend, Beginn neuer Sequenz
 
    if a[i]%2==1:      # Ungerade?
        oddlen+=1
        if oddlen>maxodd:
            maxodd=oddlen
            oddpos = i-maxodd+1
    else:              # Gerade
        oddlen=0
 
print("Minimum %d bei Index %d" % (minimum, minpos))
print("Maximum %d bei Index %d" % (maximum, maxpos))
print("Aufsteigende Sequenz mit Länge %d, Start bei %d, Sequenz %s" % (maxlen, incpos, str(a[incpos:(incpos+maxlen)])))
print("Ungerade Sequenz mit Länge %d, Start bei %d, Sequenz %s" % (maxodd, oddpos, str(a[oddpos:(oddpos+maxodd)])))
  • lehrkraefte/blc/informatik/glf20/programmieren/listen2kw.txt
  • Last modified: 2020/11/19 08:47
  • by Ivo Blöchliger