Listen und ihre Verarbeitung

Slides:



Advertisements
Ähnliche Präsentationen
Imperative Programmierung
Advertisements

Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
Einführung in die Informatik: Programmierung und Software-Entwicklung
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Kritische Betrachtung
Telefonnummer.
Kapitel 5. Stacks und Queues
Synonyme: Stapel, Keller, LIFO-Liste usw.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
1 JIM-Studie 2010 Jugend, Information, (Multi-)Media Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
= = = = 47 = 47 = 48 = =
Gliederung Motivation / Grundlagen Sortierverfahren
Java: Objektorientierte Programmierung
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Rechneraufbau & Rechnerstrukturen, Folie 2.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 2.
Grundkurs Theoretische Informatik, Folie 2.1 © 2006 G. Vossen,K.-U. Witt Grundkurs Theoretische Informatik Kapitel 2 Gottfried Vossen Kurt-Ulrich Witt.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Datenverwaltung mit Datenstrukturen
Prof. Dr. Bernhard Wasmayr
Studienverlauf im Ausländerstudium
Schieferdeckarten Dach.ppt
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Prof. Dr. Bernhard Wasmayr VWL 2. Semester
Heute: Scherenzange zeichnen
Stacks Referat im Fach Basisinformationstechnologien von Venelina Koleva.
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
20:00.
„Küsse deine Freunde“ – FlexKom-App teilen
Zusatzfolien zu B-Bäumen
In der Schule.
Eine Einführung in die CD-ROM
Syntaxanalyse Bottom-Up und LR(0)
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Der Test fängt mit dem nächsten Bild an!
NEU! 1 2. Wo kommt diese Art von Rezeptor im Körper vor?
1.6 Die Datenstruktur Stapel Ein Stapel (Stack) ist ein Sonderfall einer Liste. Die Elemente werden nach dem Prinzip LIFO (Last In First Out) angefügt.
PROCAM Score Alter (Jahre)
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Symmetrische Blockchiffren DES – der Data Encryption Standard
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
1 Tagesüberblick 2 Lösung Hausaufgabe/Fragen Datei- ein- und ausgabe Schleifen Vergleiche Wahrheit.
Folie Beispiel für eine Einzelauswertung der Gemeindedaten (fiktive Daten)
1 Mathematical Programming Nichtlineare Programmierung.
1 Albert-Ludwigs-Universität Freiburg Rechnernetze und Telematik Prof. Dr. Christian Schindelhauer Informatik III Christian Schindelhauer Wintersemester.
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Programmiervorkurs WS 2014 Referenzdatentypen
Es war einmal ein Haus
J-Team: Gymnasium Ulricianum Aurich und MTV Aurich Ein Projekt im Rahmen von UlricianumBewegt.de Euro haben wir schon…  8000 mal habt ihr bereits.
Berechenbarkeit Klaus Becker Berechenbarkeit.
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Monatsbericht Ausgleichsenergiemarkt Gas – Oktober
 Präsentation transkript:

Listen und ihre Verarbeitung Klaus Becker 2009

Listen und ihre Verarbeitung Brot Butter Joghurt Schokolade Mehl Eier ... amueller@gmx.de carla2@hotmail.org herbert.fluhr@web.de petra@dahm.de ewen@t-online.de t_schmidt@web.de nicole.weber@gmx.de ... Äpfel Inhalte: Datenstruktur Liste Listen als Objekte Datenmodellierung mit Listen Stapel Schlangen

Teil 1 Datenstruktur Liste

Verwaltung von Daten Listen werden in der Informatik - wie auch im täglichen Leben - benutzt, wenn man mehrere zusammengehörende Daten als eine Einheit darstellen und verwalten will. Da solche Zusammenstellungen von Daten sehr häufig vorkommen, bildet die Datenstruktur Liste ein zentrales Konstrukt bei der automatisierten Verarbeitung von Daten. Brot Butter Joghurt Schokolade Mehl Eier ... amueller@gmx.de carla2@hotmail.org herbert.fluhr@web.de petra@dahm.de ewen@t-online.de t_schmidt@web.de nicole.weber@gmx.de ... Äpfel Einkaufsliste Mailingliste

Einstieg - Mailingliste amueller@gmx.de carla2@hotmail.org herbert.fluhr@web.de petra@dahm.de ewen@t-online.de t_schmidt@web.de nicole.weber@gmx.de ... M = ['amueller@gmx.de', 'carla2@hotmail.org', ... ] M = [\ 'amueller@gmx.de',\ 'carla2@hotmail.org',\ 'herbert.fluhr@web.de',\ 'petra@dahm.de',\ 'ewen@t-online.de',\ 't_schmidt@web.de',\ 'nicole.weber@gmx.de'\ ] Mailingliste Liste mit Zeichenketten

Einstieg - Aufgaben (siehe 8.1.1) Bearbeiten Sie die Aufgaben des Abschnitts 8.1.1. Aufgabe 1: Eine Liste in Python eingeben Aufgabe 2: Listenoperationen ausprobieren Aufgabe 3: Ein Element entfernen Aufgabe 4: Ein Element hinzufügen. Bei Bedarf können Sie sich im Abschnitt 8.1.3 über Listen und ihre Verarbeitung informieren.

Liste mit Wahrheitswerten Einstieg - Lotto # Version 2 tipp = [1, 12, 21, 31, 37, 46] ziehung = [1, 21, 25, 40, 44, 45] Liste mit Zahlen # Version 3 tipp = [ \ True , False, False, False, False, False, False, \ False, False, False, False, True , False, False, \ False, False, False, False, False, False, True , \ False, False, False, False, False, False, False, \ False, False, True , False, False, False, False, \ False, True , False, False, False, False, False, \ False, False, False, True , False, False, False, \ ] ziehung = [ \ False, True , True , False, False, False, False, \ Liste mit Wahrheitswerten # Version 1 tipp1 = 1 tipp2 = 12 tipp3 = 21 tipp4 = 31 tipp5 = 37 tipp6 = 46 ziehung1 = 1 ziehung2 = 21 ziehung3 = 25 ziehung4 = 40 ziehung5 = 44 ziehung6 = 45 einzelne Zahlen

Einstieg - Aufgaben (siehe 8.1.2) Bearbeiten Sie die Aufgaben des Abschnitts 8.1.2. Aufgabe 1: Zugriff auf Listenelemente Aufgabe 2: Verarbeitung von Listen Aufgabe 4: Analyse von Programmen Aufgabe 5: Ergänzung von Programmen Aufgabe 6: Entwicklung eines Programms Bei Bedarf können Sie sich im Abschnitt 8.1.3 über Listen und ihre Verarbeitung informieren.

Lösungen - Aufgaben (siehe 8.1.1) Aufgabe 2: Listenoperationen >>> M ? >>> M[0] >>> M[1] >>> M[4] >>> M[0:2] >>> M[2:5] >>> M[1:4] >>> M[3:3] >>> M + ['b-krewer@t-online.de'] >>> ['b-krewer@t-online.de'] + M >>> M[0:1] + M[2:7] ? >>> M[0:3] + M[4:7] >>> M[0:2] + ['b-krewer@t-online.de'] + M[2:7] >>> M[0:5] + ['b-krewer@t-online.de'] + M[5:7] >>> len(M) >>> len(M[3:6])

Lösungen - Aufgaben (siehe 8.1.1) Aufgabe 3: Element entfernen Aufgabe 4: Element einfügen M = [\ 'amueller@gmx.de',\ 'carla2@hotmail.org',\ 'herbert.fluhr@web.de',\ 'petra@dahm.de',\ 'ewen@t-online.de',\ 't_schmidt@web.de',\ 'nicole.weber@gmx.de'\ ] # Element entfernen def entfernen(L, i): H = L[0:i] + L[(i+1):len(L)] return H # Test print M print entfernen(M, 2) M = [\ 'amueller@gmx.de',\ 'carla2@hotmail.org',\ 'herbert.fluhr@web.de',\ 'petra@dahm.de',\ 'ewen@t-online.de',\ 't_schmidt@web.de',\ 'nicole.weber@gmx.de'\ ] # Element einfügen def einfuegen(L, x, i): H = L[:i] + [x] + L[i:] return H # Test print M print einfuegen(M, 'b-krewer@t-online.de', 2)

Lösungen - Aufgaben (siehe 8.1.2) Aufgabe 2/3: Anzahl der Richtigen # Version 2 tipp = [1, 12, 21, 31, 37, 46] ziehung = [1, 21, 25, 40, 44, 45] # Anzahl der Richtigen richtige = 0 for t in tipp: for z in ziehung: if t == z: richtige = richtige + 1 print richtige # Version 3 tipp = [ \ True , False, False, False, False, False, False, \ False, False, False, False, True , False, False, \ False, False, False, False, False, False, True , \ False, False, False, False, False, False, False, \ False, False, True , False, False, False, False, \ False, True , False, False, False, False, False, \ False, False, False, True , False, False, False, \ ] ziehung = [ \ ... False, True , True , False, False, False, False, \ # Anzahl der Richtigen richtige = 0 for i in range(49): if (tipp[i] == True) and (ziehung[i] == True): richtige = richtige + 1 print richtige

Lösungen - Aufgaben (siehe 8.1.2) Aufgabe 4/5: Erzeugung der Lottoziehung # Version 2 from random import * ziehung = [] for i in range(6): zahl = randint(1, 49) ziehung = ziehung + [zahl] print ziehung # Version 3 from random import * ziehung = [] for i in range(49): ziehung = ziehung + [False] for i in range(6): ok = False while not ok: zahl = randint(1, 49) if ziehung[zahl-1] == False: ok = True ziehung[zahl-1] = True if ziehung[i] == True: print(i+1) # Version 3 from random import * ziehung = [] for i in range(49): ziehung = ziehung + [False] for i in range(6): zahl = randint(1, 49) ziehung[zahl-1] = True if ziehung[i] == True: print(i+1)

Lösungen - Aufgaben (siehe 8.1.2) Aufgabe 6: Wiederholte Lottoziehungen def richtige(z, t): r = 0 for i in range(49): if (t[i] == True) and (z[i] == True): r = r + 1 return r def simulation(n): t = tipp() haeufigkeiten = [0, 0, 0, 0, 0, 0, 0] i = 0 while i < n: z = ziehung() r = richtige(z, t) haeufigkeiten[r] = haeufigkeiten[r] + 1 i = i + 1 return haeufigkeiten def ausgabe(h): for i in range(7): print i, " Richtige: ", h[i] # Test haeufigkeiten = simulation(10000) ausgabe(haeufigkeiten) from random import * def tipp(): t = [ \ True , False, False, False, ... ... False, False, False, True , ... ] return t def ziehung(): z = [] for i in range(49): z = z + [False] for i in range(6): ok = False while not ok: zahl = randint(1, 49) if z[zahl-1] == False: ok = True z[zahl-1] = True return z

Fachkonzept - Liste Eine Liste ist eine endliche Folge von Elementen, bei der man neue Elemente hinzufügen und vorhandene Elemente entfernen kann. Brot Butter Joghurt Schokolade Mehl Eier ... Äpfel Zur Darstellung von Listen verwenden wir - wie in Python - eckige Klammern. Alle Elemente einer Liste werden mit Kommata getrennt. Eine besondere Liste ist die leere Liste. Sie enthält keine Elemente. Die Elemente einer Liste können (in unserer Darstellung hier) von beliebigem - also auch unterschiedlichem - Typ sein. Eine Liste kann selbst wieder Listen als Elemente haben. Listen können also geschachtelt werden. ['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', ...] [1, 12, 21, 31, 37, 46] [] [1, 21, 25, 40, 44, 45, ("Zusatzzahl", 3), ("Superzahl", 5)] [[1, 12, 21, 31, 37, 46], [3, 8, 10, 30, 31, 49], [5, 12, 20, 22, 29, 40]]

Fachkonzept - Liste Element [10, 15, 21, 33, 37, 40] 1 2 3 4 5 Index Die Elemente einer Liste sind (in unserer Darstellung hier) alle durchnummeriert. Die Nummerierung beginnt dabei mit 0. Die Nummer eines Listenelements wird auch Index genannt. Wir gehen (in unserer Darstellung hier) davon aus, dass ein Zugriff auf jedes Listenelement möglich ist. Wenn L eine Liste bezeichnet, dann beschreibt der Ausdruck L[i] das Listenelement mit der Nummer i. >>> L = [10, 15, 21, 33, 37, 40] >>> L[0] 10 >>> L[1] 15 >>> L = [10, 15, 21, 33, 37, 40] >>> L [10, 15, 21, 33, 37, 40] >>> L[4] = 36 [10, 15, 21, 33, 36, 40] lesender Zugriff schreibender Zugriff

Fachkonzept - Liste ['g', 't', 'e', 'c', 's', 'k', 'p'] 1 2 3 4 5 6 Element ['g', 't', 'e', 'c', 's', 'k', 'p'] 1 2 3 4 5 6 Index >>> L = ['g', 't', 'e', 'c', 's', 'k', 'p'] >>> L[0:2] ['g', 't'] >>> L[2:5] ['e', 'c', 's'] >>> L[1:5] ['t', 'e', 'c', 's'] >>> L[3:3] [] Wenn L eine Liste bezeichnet, dann beschreibt der Ausdruck L[i:j] die Liste, die alle Elemente der Ausgangsliste L mit den Nummern von i bis j-1 enthält. Beachte, dass diese Teilliste auch leer sein kann. >>> L = ['g', 't', 'e', 'c', 's', 'k', 'p'] >>> L[2:] ['e', 'c', 's', 'k', 'p'] >>> L[:2] ['g', 't'] >>> L[:] ['g', 't', 'e', 'c', 's', 'k', 'p'] Teillisten Teillisten

Fachkonzept - Liste ['g', 't', 'e', 'c', 's', 'k', 'p'] 1 2 3 4 5 6 Element ['g', 't', 'e', 'c', 's', 'k', 'p'] 1 2 3 4 5 6 Index Bei der Konkatenation von Listen werden diese zu einer Gesamtliste verbunden. Wenn L und M zwei Listen bezeichnen, dann beschreibt der Ausdruck L+M die Liste, die zunächst alle Elemente von L und danach alle Elemente von M enthält. Da Listen dynamisch wachsen oder schrumpfen können, benötigt man häufig eine Operation zur Bestimmung der Länge der Liste. Die Länge einer Liste beschreibt dabei die Anzahl der Listenelemente. Wenn L eine Listen bezeichnet, dann beschreibt der Ausdruck len(L) die Länge der Liste. >>> L = ['g', 't', 'e', 'c', 's', 'k', 'p'] >>> M = ['a', 'g', 't'] >>> L + M ['g', 't', 'e', 'c', 's', 'k', 'p', 'a', 'g', 't'] >>> L + ['u'] ['g', 't', 'e', 'c', 's', 'k', 'p', 'u'] >>> [] + M ['a', 'g', 't'] >>> L = ['g', 't', 'e', 'c', 's', 'k', 'p'] >>> len(L) 7 >>> len([]) >>> len([1, [2, 3]]) 2 Konkatenation Länge

Übungen (siehe 8.1.4) Bearbeite die Aufgaben 1 .. 7.

Teil 2 Listen als Objekte

Einstieg - merkwürdiges Verhalten Im folgenden Python-Dialog wird ein Lotto-Tipp kopiert und anschließend etwas abgeändert. Was fällt auf? >>> tipp1 = [4, 13, 21, 33, 34, 42] >>> tipp2 = tipp1 >>> tipp2[1] = 8 >>> tipp2 [4, 8, 21, 33, 34, 42] >>> tipp1 [4, 13, 21, 33, 34, 42] >>> tipp2[0] = 3 [3, 8, 21, 33, 34, 42]

Verwaltung von Listen mit Variablen Jedes Datenobjekt hat (in Python) eine Identitätsnummer, einen Typ und einen bestimmten Wert. >>> id([4, 13, 21, 33, 34, 42]) 12289008 >>> type([4, 13, 21, 33, 34, 42]) <type 'list'> >>> [4, 13, 21, 33, 34, 42] [4, 13, 21, 33, 34, 42] >>> tipp1 = [4, 13, 21, 33, 34, 42] >>> id(tipp1) 12289008 >>> type(tipp1) <type 'list'> >>> tipp1 [4, 13, 21, 33, 34, 42] Variablen dienen in der Informatik dazu, Datenobjekte zu verwalten. Variablen werden an Datenobjekte angebunden, um die betreffenden Datenobjekte verwalten zu können. Eine Variable, die ein Datenobjekt referenziert, ist eine Art Name für das betreffende Datenobjekt. Mit dem Variablennamen kann man sich die Identitätsnummer, den Typ und den Wert des referenzierten Datenobjekts verschaffen.

Verwaltung von Listen mit Variablen >>> tipp1 = [4, 13, 21, 33, 34, 42] >>> tipp2 = tipp1 >>> tipp2[1] = 8 >>> tipp2 [4, 8, 21, 33, 34, 42] >>> tipp1 [4, 13, 21, 33, 34, 42] >>> tipp2[0] = 3 [3, 8, 21, 33, 34, 42]

Listen als Objekte Listen sind (in Python) Objekte vom Typ list, die Daten verwalten und die dem Benutzer Operationen zur Verarbeitung der Daten zur Verfügung stellen. >>> L = [] >>> L [] >>> L.append(3) [3] >>> L.append(5) [3, 5] >>> L.insert(1, 7) [3, 7, 5] >>> L.insert(0, 5) [5, 3, 7, 5] >>> L.remove(5) >>> L.extend([4, 2]) [3, 7, 5, 4, 2] >>> L [3, 7, 5, 4, 2] >>> L.__len__() 5 >>> L.__getitem__(1) 7 >>> L.__setitem__(1, 8) [3, 8, 5, 4, 2] >>> L.__delitem__(1) [3, 5, 4, 2] 4

Listenverarbeitung L = Listenkonstruktor L.Listenoperation [1, 2, 3] >>> id(L) 12283056 >>> L = L + [4] [1, 2, 3, 4] 12289008 >>> L = L[1:] [2, 3, 4] 12257720 >>> L = [1, 2] + L[1:] >>> L = [1, 2, 3] >>> L [1, 2, 3] >>> id(L) 12283536 >>> L[1] = 5 [1, 5, 3] >>> L.remove(5) [1, 3] >>> L.insert(1, 2) Veränderung einer bestehenden Listen Erzeugung neuer Listen

Übungen (siehe 8.2.5) Bearbeiten Sie die Aufgaben des Abschnitts 8.2.5.

Datenmodellierung mit Listen Teil 3 Datenmodellierung mit Listen

Einstieg - Magische Quadrate Ein magisches Quadrat ist ein Zahlenschema, bei dem alle Zeilen-, Spalten- und Diagonalsummen gleich sind. Darstellung mit Listen >>> q = [[16, 5, 9, 4], [2, 11, 7, 14], [3, 10, 6, 15], [13, 8, 12, 1]] >>> q[0] [16, 5, 9, 4] >>> q[0][0] 16 >>> q[0][1] 5 >>> q[0][0] + q[0][1] + q[0][2] + q[0][3] 34

Einstieg - Aufgaben (siehe 8.3.1) Entwickle eine Funktion zeilensumme(quadrat, i), eine Funktion spaltensumme(quadrat, i) und zwei Funktionen diagonalsumme_lr(quadrat) und diagonalsumme_rl(quadrat), mit deren Hilfe man die entsprechenden Summen bei einem gegebenen Zahlenschema berechnen kann. Entwickle auch eine Funktion, die überprüft, ob ein Zahlenschema ein magisches Quadrat darstellt. >>> q = [[16, 5, 9, 4], [2, 11, 7, 14], [3, 10, 6, 15], [13, 8, 12, 1]] >>> zeilensumme(q, 0) 34 >>> spaltensumme(q, 3) >>> diagonalsumme_lr(q) >>> magischesQuadrat(q) True

Lösung - Aufgaben (siehe 8.3.1) def zeilensumme(q, n): summe = 0 l = len(quadrat) i = 0 while i < l: summe = summe + q[n-1][i] i = i + 1 return summe def spaltensumme(q, n): ... summe = summe + q[i][n-1] def diagonalsumme_lr(q): summe = summe + q[i][i] def diagonalsumme_rl(q): summe = 0 l = len(quadrat) i = 0 while i < l: summe = summe + q[i][l-i-1] i = i + 1 return summe def magischesQuadrat(q): magisch = True s = diagonalsumme_lr(q) if diagonalsumme_rl(q) != s: magisch = False n = 0 while n < len(quadrat): if zeilensumme(q, n+1) != s: if spaltensumme(q, n+1) != s: n = n + 1 return magisch

Darstellung mit Listen Datenstrukturen Datenstrukturen ermöglichen es, strukturierte Daten als Einheit zu verwalten. Reihung aus Reihungen Darstellung mit Listen # Lottoschein schein = [[3, 6, 19, 21, 38, 41], [4, 9, 17, 37, 38, 39], [18, 23, 28, 36, 38, 46]]

Reihung / Verbund Bei einer Reihung werden Daten desselben Typs zu einer Einheit zusammengefasst. Bei einem Verbund werden Daten zu einer Einheit zusammengefasst, die von unterschiedlichem Typ sein können. Reihung Verbund Darstellung als Liste Darstellung als Liste # Reihung [10, 15, 21, 33, 37, 40] # Verbund ["Albert", "Einstein", 1879, 1955] Darstellung als Tupel # Verbund ("Albert", "Einstein", 1879, 1955)

Schachtelung von Reihung u. Verbund Reihungen und Verbunde können beliebig ineinander geschachtelt werden. Zeichenkette Reihung Zeichenkette Verbund von Zahlen Verbund von Zahlen Verbund Darstellung mit Listen # Schachtelung von Reihung und Verbund [["Albert", "Einstein", [14, 3, 1879], [18, 5, 1955]], ...]

Mehrdimensionale Reihung Mehrdimensionale Reihungen sind Reihungen von Reihungen .... Reihung Reihung Darstellung mit Listen # zweidimensionale Reihung [[16, 5, 9, 4], [2, 11, 7, 14], [3, 10, 6, 15], [13, 8, 12, 1]]

Dynamische Datenstrukturen Dynamische Datenstrukturen sind Datenstrukturen, die sich dynamisch verändern können. # Liste ["Anna", "Peter", "Tim", "Greta", "Katrin"] Liste # Baum ["Andreas", \ ["Peter", \ [Matthias], \ [Katharina]], \ ["Christiane", \ ["Winfried"], \ ["Ursula"]]] Baum Darstellung mit Listen Graph # Graph [ \ ["TR", ["KO", "KL"]], \ ["KO", ["TR", "MZ", "KL"]], \ ["MZ", ["KO", "KL"]], \ ["KL", ["TR", "KO", "MZ"]] \ ]

Übungen (siehe 8.3.3) Bearbeiten Sie Aufgabe 3 (Simulation eines Tischtennisspiels) oder Aufgabe 4 (Irrlauf in Mannheim).

Teil 4 Stapel

Einstieg - Rechenterme (92 - 79) * 27 Rechenterm Auswertung eines Rechenterms

Einstieg - Aufgaben (siehe 8.4.1) Aufgabe 1: Darstellung von Rechentermen mit Listen (92 - 79) * 27 [27, 79, 92, "-", "*"] Aufgabe 2: Algorithmus zur Auswertung von Rechentermen

Stapel Ein Stapel ist eine Datenstruktur, die als Behälter für Datenobjekte dient und nach dem LIFO-Prinzip (last in, first out) arbeitet. Stapeloperationen: top(): liefert das oberste Datenobjekt (sofern der Stapel nicht leer ist) push(e): legt das übergebene Datenobjekt oben auf den Stapel pop(): entfernt das oberste Stapelobjekt (sofern der Stapel nicht leer ist)

Implementierung als Klasse class Stapel(object): def __init__(self): self.liste = [] def isEmpty(self): if self.liste == []: return True else: return False def push(self, element): self.liste = [element] + self.liste def pop(self): if not self.isEmpty(): self.liste = self.liste[1:] def top(self): if self.isEmpty(): return None return self.liste[0] def size(self): return len(self.liste) def getStapel(self): return self.liste def setStapel(self, liste): self.liste = liste >>> s = Stapel() >>> s.push(6) >>> s.getStapel() [6] >>> s.push(3) [3, 6] >>> s.top() 3 >>> s.pop()

Übungen (siehe 8.4.3/8.4.4) 8.4.3: Aufgabe 1: Testen Sie die Stapeloperationen. >>> t = Stapel() >>> t.setStapel([27, 79, 92, "-", "*"]) >>> s = Stapel() >>> print t.getStapel() [27, 79, 92, '-', '*'] >>> print s.getStapel() [] >>> e = t.top() >>> s.push(e) >>> t.pop() [79, 92, '-', '*'] [27] ... 8.4.4: Aufgabe 1: Die in den Abbildungen gezeigten Operationen sollen mit Hilfe von zwei Stapel-Objekten durchgespielt werden.

Übungen (siehe 8.4.3/8.4.4) 8.4.4: Aufgabe 2: Ergänzen Sie die Implementierung, so dass der folgende Python-Dialog möglich wird. Testen Sie die Funktion auswerten auch mit anderen Termen. >>> auswerten([27, 79, 92, "-", "*"]) T: [27, 79, 92, '-', '*'] S: [] T: [79, 92, '-', '*'] S: [27] T: [92, '-', '*'] S: [79, 27] T: ['-', '*'] S: [92, 79, 27] T: [13, '*'] T: ['*'] S: [13, 27] T: [351] ... def auswerten(term): t = Stapel() t.setStapel(term) s = Stapel() while t.size() > 0: print "T:", t.getStapel() print "S:", s.getStapel() print e = t.top() t.pop() if type(e) == int: s.push(e) else: ... return s.top()

Lösungen (siehe 8.4.3/8.4.4) 8.4.4: Aufgabe 1: >>> t = Stapel() >>> t.setStapel([27, 79, 92, "-", "*"]) >>> s = Stapel() >>> print t.getStapel() [27, 79, 92, '-', '*'] >>> print s.getStapel() [] >>> e = t.top() >>> print e 27 >>> t.pop() >>> s.push(e) [79, 92, '-', '*'] [27] ... ... >>> e = t.top() >>> print e - >>> m = s.top() >>> s.pop() >>> n = s.top() >>> t.push(m-n) >>> print t.getStapel() [13, '-', '*'] >>> print s.getStapel() [27] >>> ...

Lösungen (siehe 8.4.3/8.4.4) def auswerten(term): t = Stapel() t.setStapel(term) s = Stapel() while t.size() > 0: print "T:", t.getStapel() print "S:", s.getStapel() print e = t.top() t.pop() if type(e) == int: s.push(e) else: ... return s.top() m = s.top() s.pop() n = s.top() op = e if op == "+": t.push(m+n) elif op == "-": t.push(m-n) elif op == "*": t.push(m*n) elif op == "/": t.push(m/n)

Teil 5 Schlangen

Einstieg - Warteschlange Beim Drucken von Aufträgen kann es vorkommen, dass neue Druckaufträge den Drucker erreichen, bevor der aktuelle Druckauftrag abgearbeitet ist. Drucker sehen für diesen Fall einen Puffer vor, in dem die neuen Druckaufträge zwischengespeichert werden. >>> simuliereDrucken() S: ['Eine'] S: ['Eine', 'Warteschlange'] S: ['Eine', 'Warteschlange', 'bildet'] S: ['Eine', 'Warteschlange', 'bildet', 'sich,'] Eine S: ['Warteschlange', 'bildet', 'sich,', 'wenn'] S: ['Warteschlange', 'bildet', 'sich,', 'wenn', 'mehr'] Warteschlange S: ['bildet', 'sich,', 'wenn', 'mehr', 'Anforderungen'] bildet sich, wenn S: ['mehr', 'Anforderungen', 'pro'] S: ['mehr', 'Anforderungen', 'pro', 'Zeiteinheit'] ... Simulation einer Druckerwarteschlange

Schlange Eine Schlange ist eine Datenstruktur, die als Behälter für Datenobjekte dient und nach dem FIFO-Prinzip (first in, first out) arbeitet. Schlangenoperationen: erstes(): liefert das erste Schlangenelement (sofern die Schlange nicht leer ist) mitLetztem(e): fügt das übergebene Schlangenelement hinten in die Schlange ein ohneErstes(): entfernt das erste Schlangenelement (sofern die Schlange nicht leer ist)

Implementierung als Klasse class Schlange(object): def __init__(self): self.liste = [] def istLeer(self): if self.liste == []: return True else: return False def mitLetztem(self, element): self.liste = self.liste + [element] def ohneErstes(self): if not self.istLeer(): self.liste = self.liste[1:] def erstes(self): if self.istLeer(): return None return self.liste[0] def anzahlElemente(self): return len(self.liste) def getSchlange(self): return self.liste def setSchlange(self, liste): self.liste = liste >>> s = Schlange() >>> s.getSchlange() [] >>> s.mitLetztem(4) >>> s. mitLetztem(7) [4, 7] >>> s.erstes() 4 >>> s.ohneErstes() [7]

Übungen (siehe 8.5.3/8.5.4) 8.5.3: Aufgabe 1: Testen Sie die Schlangenoperationen.

Übungen (siehe 8.5.3/8.5.4) 8.5.4: Aufgabe 1: >>> simuliereDrucken() S: ['Eine'] S: ['Eine', 'Warteschlange'] S: ['Eine', 'Warteschlange', 'bildet'] S: ['Eine', 'Warteschlange', 'bildet', 'sich,'] Eine S: ['Warteschlange', 'bildet', 'sich,', 'wenn'] S: ['Warteschlange', 'bildet', 'sich,', 'wenn', 'mehr'] Warteschlange S: ['bildet', 'sich,', 'wenn', 'mehr', 'Anforderungen'] bildet sich, wenn S: ['mehr', 'Anforderungen', 'pro'] S: ['mehr', 'Anforderungen', 'pro', 'Zeiteinheit'] S: ['mehr', 'Anforderungen', 'pro', 'Zeiteinheit', 'an'] mehr S: ['Anforderungen', 'pro', 'Zeiteinheit', 'an', 'ein'] S: ['Anforderungen', 'pro', 'Zeiteinheit', 'an', 'ein', 'System'] Anforderungen S: ['pro', 'Zeiteinheit', 'an', 'ein', 'System', 'gerichtet'] pro Zeiteinheit an ein System gerichtet S: ['werden,'] S: ['werden,', 'als'] S: ['werden,', 'als', 'dieses'] ... 8.5.4: Aufgabe 1: Ziel ist es, eine Druckerwarteschlange zu simulieren. Dabei sollen Python-Protokolle der folgenden Art entstehen. ... ... werden, als dieses S: ['in'] in S: ['der'] der S: ['selben'] S: ['selben', 'Zeit'] selben Zeit S: ['verarbeiten'] verarbeiten S: ['kann.'] kann.

Übungen (siehe 8.5.3/8.5.4) # -*- coding: iso-8859-1 -*- from schlange import * from random import * def simuliereDrucken(): f = file("warteschlange.txt", 'r') text = f.read() liste = text.split() s = Schlange() i = 0 while (len(liste) > 0) or not s.istLeer(): z = randint(0, 1) if z == 0: # Auftrag drucken else: # Auftrag erteilen 8.5.4: Aufgabe 1: ... Analysiere zunächst den Quelltext und kläre folgende Fragen: * Woher stammen die als Druckaufträge dienenden Zeichenketten? * Welche Rolle spielt der Zufallsgenerator bei der Simulation? Vervollständige den Quelltext und teste das Simulationsprogramm.

Lösungen (siehe 8.4.3/8.4.4) 8.5.4: Aufgabe 1: # -*- coding: iso-8859-1 -*- from schlange import * from random import * def simuliereDrucken(): f = file("warteschlange.txt", 'r') text = f.read() liste = text.split() s = Schlange() i = 0 while (len(liste) > 0) or not s.istLeer(): z = randint(0, 1) ... ... if z == 0: # Drucken if not s.istLeer(): auftrag = s.erstes() s.ohneErstes() print auftrag else: # Auftrag if len(liste) > 0: auftrag = liste[0] liste = liste[1:] s.mitLetztem(auftrag) print "S:", s.getSchlange()

Miniprojekt: Monoalphabetische Chiffriersysteme Teil 6 Miniprojekt: Monoalphabetische Chiffriersysteme

Einstieg - Caesar-Verschlüsselung PYLZFOWBNQCYBUVNCBLGYCHYAYBYCGMWBLCZNYHNTCZYLN VDOYH FDHVDU A B C D E F G H I J K L M N O P Q R S T U V W X Y Z D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Schlüssel: D Quelltext: Geheimtext: SALVECAESAR VDOYHFDHVDU

Fachkonzept - Chiffriersystem Ein Chiffriersystem dient dazu, Klartexte in Geheimtexte und umgekehrt Geheimtexte in Klartexte zu transformieren. Zum Ver- und Entschlüsseln (man sagt auch Codieren und Decodieren) wird in der Regel jeweils ein Schlüssel benötigt. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Verschiebe-Chiffriersystem

Fachkonzept - Chiffriersystem Ein monoalphabetisches Chiffriersystem ist ein Chiffriersystem, bei dem jedem Buchstaben des Alphabets ein anderer Buchstabe des Alphabets fest zugeordnet wird. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z G O Z L N C R E W K A X B J F Q Y I S M V D U P H T monoalphabetisches Chiffriersystem

Exkurs - Python-Implementierung # -*- coding: iso-8859-1 -*- def buchstabeCodieren(c, v): m = ord(c) n = m + v if n > 90: n = n - 26 d = chr(n) return d def buchstabeDecodieren(c, v): n = m - v if n < 65: n = n + 26 def textCodieren(text, v): geheimtext = '' for c in text: geheimtext = geheimtext + buchstabeCodieren(c, v) return geheimtext def textDecodieren(text, v): klartext = '' for c in text: klartext = klartext + buchstabeDecodieren(c, v) return klartext def textLaden(dateiname): f = file(dateiname, 'r') text = f.read() return text def textVorbereiten(text): grossText = text.upper() bereinigterText = '' for c in grossText: if (ord(c) >= 65) and (ord(c) <= 90): bereinigterText = bereinigterText + c return bereinigterText

Projekt - Auftrag A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Entwickeln Sie ein Programm, mit dem man ein beliebiges monoalphabetisches Chiffriersystem betreiben kann. Mit diesem Programm soll man beliebige Texte mit einer beliebigen festen Zuordnungstabelle verschlüsseln und auch wieder entschlüsseln können. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z G O Z L N C R E W K A X B J F Q Y I S M V D U P H T Zusätzlich soll es das System ermöglichen, die Häufigkeiten von Buchstaben in Texten zu ermitteln, so dass man das System auch nutzen kann, um eine unbekannte Zuordnungstabelle zu rekonstruieren.

Projekt - Modellierung Zunächst ist zu klären, wie eine Zuordnungstabelle und eine Häufigkeitstabelle mit Datenstrukturen beschrieben werden soll. Zuordnungstabelle A B C D E F G H I J K L M N O P Q R S T U V W X Y Z G O Z L N C R E W K A X B J F Q Y I S M V D U P H T ['G', 'O', 'Z', 'L', 'N', 'C', 'R', 'E', 'W', ..., 'T'] 0 1 2 3 4 5 6 7 8 ... 25 A B C D E F G H I ... Z Häufigkeitstabelle A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 3 1 0 1 9 1 2 3 1 0 1 2 3 6 1 0 0 4 5 5 1 0 0 0 0 0 [ 3, 3, 1, 0, 1, 9, 1, 2, 3, ..., 0] 0 1 2 3 4 5 6 7 8 ... 25 A B C D E F G H I ... Z

Projekt - Modellierung Zusätzlich muss geklärt werden, welche Operationen mit Hilfe von Funktionen implementiert werden sollen. def zeichenCodieren(c, Z): ... return ... def zeichenDecodieren(c, Z): ... return ... def textCodieren(text, Z): ... return ... def textDecodieren(text, Z): ... return ... def textAnalysieren(text): ... return ... Für weitere Informationen siehe 8.6.5.

Projekt - Implementierung Im vorangegangenen Abschnitt sind eine Reihe von Funktionen / Prozeduren modelliert worden. Diese müssen jetzt alle implementiert werden. Natürlich könnte jetzt jeder für sich die Sache anpacken. Bei größeren Software-Entwicklungsprojekten teilt man sich in solch einer Situation die Arbeit auf. Das spart dann viel Zeit - sofern alle gute Arbeit leisten. Probieren Sie das auch mal hier aus. Jeder ist für eine Teilaufgabe zuständig und verantwortlich. Wenn alle Funktionen / Prozeduren fertig sind, dann kann das Gesamtsystem aus den Teilen zusammengebaut werden.

Projekt - Testen Mit dem entwickelten (De-) Chiffriersystem soll der folgende Geheimtext decodiert werden. Tipp: bello. OFVTOFRRLSVLAXLVIKSLXSLRSOSXSLRXSLVSVIFJDV QSUDZVSVILSQSROSKISVFVISKSVILSFWBLXFVSKBVI ISVIKLXXSVILSILSLVLZKSKSLOSVSVAEKFYZSCSRXS VLVBVASKSKOFRRLSKOSVFVVXUSKISVALSFRRSBVXSK AYZSLISVALYZBVXSKSLVFVISKLVAEKFYZSOSUDZVZS LXSVBVIOSASXTSVILSOFRRLSKXKSVVXJDVISVFWBLX FVSKVISKGRBAAOFKDVVSJDVISVQSROSKVILSMFKVSB VIILSASLVSILSXFEGSKAXSVFRRILSASKALVIILSQSR OSKBVITUFKISAUSOSVUSLRALSJDVISKCBRXBKBVIRS QSVAUSLASISKKDSMLAYZSVEKDJLVTFMUSLXSAXSVSV XGSKVXALVIASZKASRXSVCFBGRSBXSTBILSASVCDMMS VBVIIFAUFATBKJSKUSLYZRLYZBVOISKOSMBSXSKGBS ZKXSLVGBSZKSVBVIUSLRALSISVOSKMFVSVILSNSVAS LXAISAKZSLVSARSQSVBVIMLXISVSVALSAXFSVILOCK LSOGBSZKSVASZKVFZSALVIFBAILSASMOKBVIBSQSKX KSGGSVFBYZILSZSRJSXLSKILSBSQKLOSVOFRRLSKFV XFEGSKCSLXUSLRALSALYZLVGFAXXFSORLYZSVOSGSY ZXSVMLXISVOSKMFVSVMSAASVUDQSLALSILSASSVXUS ISKJDVLZKSMOSQLSXGSKVZFRXSVDISKASRQAXLVISK SVOSQLSXCFSMEGSVSLVXSLRIFJDVISVULSOSAFOXIL SOFRRLSKQSUDZVSVGLVISXASLVSVBKAEKBVOFVISKK ZDVSULKIQSOKSVTXJDVISKOFKDVVSISMDTSFVBVIIS MOSQLSXISKQSROSKSKAXKSYCXALYZJDVISVASWBFVS ... ... KVBVIZSRJSXLSKVZLVQLATBMKZSLVBVITSLOXVFYZV DKISVIFAOSQLSXISKQSROSKQSOLVVXFVISVFSBAASK AXSVOKSVTSVOFRRLSVASKAXKSYCXALYZQLAFVISVBV XSKSVXSLRISAKZSLVABVIRLSOXVFYZVDKIDAXSVFWB LXFVLSVSKAXKSYCXALYZJDVISMGRBAAOFKDVVSQLAF VILSEHKSVFSSVBVITBISMNSVLOSVXSLRISADTSFVAI SKQLAAEFVLSVKSLYZXSARLSOXLVKLYZXBVOVDKIUSA XSV

Projekt - Erweiterungen Die Zuordnungstabelle soll mit Hilfe eines Schlüsselwortes erzeugt werden. Schlüsselwort: INITIALISIERUNGVONVARIABLEN A B C D E F G H I J K L M N O P Q R S T U V W X Y Z I N T A L S E R U G V O B C D F H J K M P Q W X Y Z