====== Listen ====== Eine Liste kann man als einen Stapelspeicher (englisch: stack) ansehen. In der Informatik bezeichnet ein Stapelspeicher eine Datenstruktur mit minimal zwei Operationen: eine, mit der man Daten auf den Stapel legen kann, und eine, um das oberste Element des Stapels wegzunehmen. Stellen Sie sich das wie einen Stapel noch zu lesender Bücher vor. Sie wollen die Bücher des Stapels von oben nach unten durchlesen. Kaufen Sie zwischendurch ein neues Buch, kommt es oben drauf und ist damit das nächste Buch, was gelesen werden "muss". In Python wird eine Liste wie folgt einer Variable zugeordnet: schulklasse = ['Anna','Max','Mia','Gustav'] Wenn nun ein Element aus der Liste auf der Konsole ausgegeben werden soll, funktioniert dies wie folgt: print(schulklasse[0]) Nehmen Sie untenstehendes Programm und Ergänzen Sie, damit Mia auf der Konsole ausgegeben wird. schulklasse = ['Anna','Max','Mia','Gustav'] print( ) Es ist auch möglich einen gewissen Bereich einer Liste auszugeben, dies wird mithilfe des : gemacht. print(schulklasse[0:2]) Damit nicht jedes Element einzeln ausgegeben werden muss, können wir hier auch Schleifen (Wiederholungen verwenden). Kopieren, testen und verstehen Sie folgenden zwei Codeblöcke: schulklasse = ['Anna','Max','Mia','Gustav'] for student in schulklasse: print(student) schulklasse = ['Anna','Max','Mia','Gustav'] counter = 0 while counter < len(schulklasse): print(schulklasse[counter]) counter += 1 Ergänzen Sie die Liste der Schülerinnen und Schüler um fünf Namen. Schreiben Sie nun ein Programm, welches jeden zweiten Namen aus der Liste ausgibt. === Funktionen === Append: Diese Methode dient dazu ein neues Objekt auf den Stapel zu legen. Je nach Sichtweise wird das Objekt "oben" oder "rechts" angefügt. schulklasse = ['Anna','Max','Mia','Gustav'] schulklasse.append('Kevin') Wenn die Liste nach dem Hinzufügen auf der Konsole ausgegeben werden möchte, muss ab Schluss noch ein print-Statement eingefügt werden. print(schulklasse) Pop: Gibt das i-te Element aus der Liste zurück und entfernt es anschliessend. Wird der Funktion Pop kein Index mitgegeben, wird das letzte Element entfernt. schulklasse = ['Anna','Max','Mia','Gustav'] schulklasse.pop(2) schulklasse.pop() Remove: Ein Element kann auch direkt, ohne den Index, gelöscht werden. Dies ist mithilfe der Methode remove möglich. schulklasse = ['Anna','Max','Mia','Gustav'] schulklasse.remove('Max') Index: Mit der Methode index kann man die Position eines Elements innerhalb einer Liste ermitteln. Dabei kann zusätzlich zum Element auch noch ein Suchfenster mit Start und Ende mitgegeben werden, diese Angaben sind aber optional. schulklasse = ['Anna','Max','Mia','Gustav'] schulklasse.index('Max') Damit der Index von Max auf der Konsole ausgegeben wird, benötigt das Skript noch ein print-Statement. print(schulklasse.index('Max')) - Legen Sie eine Liste mit Namen "zahlen" an, die mindestens 10 Elemente enthält. - Geben Sie das siebte Element der Liste aus. - Geben Sie die Elemente zwei bis acht als Liste aus. - Geben Sie die Elemente zwei bis acht als einzelne Elemente aus - Fügen Sie die Zahlen 15, 23 und 95 zur Liste hinzu. - Löschen Sie das dritte Element aus der Liste. - Löschen Sie die Zahl 23 aus der Liste. ===== 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. 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. Schreiben Sie ein Programm, welches den Benutzer nach Zahlen fragt und diese dann in einer Liste speichert. Wenn der Benutzer anstelle einer Zahl den Buchstaben q eintippt, soll die gesamte Liste ausgegeben werden. Ergänzen Sie das Programm der vorherigen Aufgabe indem Sie die Liste aufsteigend sortieren. Überlegen Sie sich zuerst wie die Sortierung gemacht werden soll, indem Sie dem Ablauf auf ein Papier zeichnen. Starten Sie anschliessend mit dem Programmieren. ===== Lösungsvorschläge ===== #Ergänzen Sie die Liste der Schülerinnen und Schüler um fünf Namen. schulklasse = ['Anna','Max','Mia','Gustav','Paula','Hugo','Petra','Fritz','Emily'] #Schreiben Sie nun ein Programm, welches jeden zweiten Namen aus der Liste ausgibt. #Option 1: For-Schleife for student in range(0,len(schulklasse),2): print(schulklasse[student]) #Option 2: While-Schleife counter = 0 while counter < len(schulklasse): print(schulklasse[counter]) counter += 2 #Legen Sie eine Liste mit Namen “zahlen” an, die mindestens 10 Elemente enthält. zahlen = [3,7,1,67,98,34,76,56,90,32] #Geben Sie das siebte Element der Liste aus. print(zahlen[6]) #Geben Sie die Elemente zwei bis acht als Liste aus. print(zahlen[1:7]) #Geben Sie die Elemente zwei bis acht als einzelne Elemente aus #Option 1: counter = 1 while counter < 7: print(zahlen[counter]) counter += 1 #Option 2: for zahl in range(1,7): print(zahlen[zahl]) #Fügen Sie die Zahlen 15, 23 und 95 zur Liste hinzu. zahlen.append(15) zahlen.append(23) zahlen.append(95) #Löschen Sie das dritte Element aus der Liste. zahlen.pop(2) #Löschen Sie die Zahl 23 aus der Liste. zahlen.remove(23) betrag = 480 # oder betrag=inputInt("Bitte Betrag eingeben") noten = [200,100,50,20,10] for note in noten: if betrag>=note: anzahl = int(betrag/note) print("%d %ser Noten" % (anzahl,note)) betrag -= note*anzahl if betrag>0: print("Es ist noch ein Betrag von %d übrig" % betrag) betrag = 488.35 # oder betrag=inputInt("Bitte Betrag eingeben") noten = [200,100,50,20,10,5,2,1,0.5,0.2,0.1,0.05] for note in noten: if betrag>=note: anzahl = int(betrag/note) if(note > 5): print("%d %ser Noten" % (anzahl,note)) else: print("%d %ser Münzen" % (anzahl,note)) betrag -= note*anzahl if betrag>0: print("Es ist noch ein Betrag von %d übrig" % betrag) print("Guten Tag") liste = [] while True: eingabe = input("Bitte geben Sie eine positive Zahl ein") if eingabe == 'q' : break else: liste.append(eingabe) print("Folgende Liste wird nun sortiert:") print(liste) #Ergänzung zur vorigen Aufgabe, Liste muss mitgegeben werden #Version 1 for i in range(len(liste)): for j in range(i,len(liste)): if liste[i] > liste[j]: liste[i], liste[j] = liste[j], liste[i] print(liste) #Ergänzung zur vorigen Aufgabe, Liste muss mitgegeben werden #Version 2 sortedList = [] while len(liste)>0: minValue = liste[0] minIndex = 0 counter = 0 for element in liste: if element < minValue: minValue = element minIndex = counter counter += 1 sortedList.append(liste[minIndex]) liste.pop(minIndex) print(sortedList)