lehrkraefte:blc:informatik:glf20:programmieren:listen2kw

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
lehrkraefte:blc:informatik:glf20:programmieren:listen2kw [2020/11/03 08:53]
Ivo Blöchliger
lehrkraefte:blc:informatik:glf20:programmieren:listen2kw [2020/11/18 20:51]
Ivo Blöchliger [Geldautomat]
Line 17: Line 17:
  
 <WRAP info> <WRAP info>
-Typischerweise werden die Elemente einer Liste in einem for-loop verarbeitet, wie in den folgenden Beispielen:+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. 
 +</WRAP> 
 + 
 +<WRAP todo> 
 +Typischerweise werden die Elemente einer Liste in einem for-loop verarbeitet. Testen und verstehen Sie folgende Beispiele:
 <code python> <code python>
 namen = ["Null", "Eins", "Zwei"] namen = ["Null", "Eins", "Zwei"]
Line 40: Line 48:
  
  
-<WRAP info+<WRAP todo
-Die Erzeugung von Arrays kann ebenfalls in einem for-loop stattfinden:+Die Erzeugung von Arrays kann ebenfalls in einem for-loop stattfinden. Testen und verstehen Sie folgende Beispiele:
 <code python> <code python>
 quadrate = []   # Leere Liste quadrate = []   # Leere Liste
Line 57: Line 65:
 </code> </code>
 </WRAP> </WRAP>
 +
 +===== Geldautomat =====
 +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. 
 +<WRAP todo>
 +Testen und Verstehen Sie folgenden Code:
 +<code python>
 +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)
 +    
 +</code>
 +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:
 +<code python>
 +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)
 +</code>
 +Erweitern Sie den Code nun so, dass auch Münzen ausbezahlt werden.
 +</WRAP>
 +
 +===== Array-Rätsel (Zusatzaufgabe) =====
 +Geben ist folgendes Array:
 +<code python 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]
 +</code>
 +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
 +<code>
 +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]
 +</code>
 +
 +<hidden Lösungsvorschläge>
 +<code python 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)])))
 +
 +</code>
 +</hidden>
 +
 +
  • lehrkraefte/blc/informatik/glf20/programmieren/listen2kw.txt
  • Last modified: 2020/11/19 08:47
  • by Ivo Blöchliger