Modul: Programmierung B-PRG Grundlagen der Programmierung 1 – Teil 1 – V10 Graphen, Bäume, Halden Prof. Dr. Detlef Krömker Professur für Graphische Datenverarbeitung Institut für Informatik Fachbereich Informatik und Mathematik (12) Hier wird Wissen Wirklichkeit Übersicht: Wichtige Datenstrukturen lineare Strukturen nichtlineare Strukturen nicht geordnete Strukturen geordnete Strukturen string tupel frozenset Liste Stapel Schlange list stack queue Graph gerichtet Menge Abbildung set dictionary Verbund ··· azyklisch Feld array 2 Vorrangschlange priority queue Programmieren 1 – Teil 1 – V10 WS 2006/2007 Baum Record tree Union ··· Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 1 Unser heutiges Lernziel Die „Brot und Butter“ Datenstruktur Baum kennen lernen. ··· tree Einordnung und Spezialisierung des Datentyps Baum kennenlernen. binary tree Programmieren 1 – Teil 1 – V10 WS 2006/2007 gerichtet azyklisch Baum Eine spezielle Klasse „Baum“ realisieren. 3 Graph Prof. Dr. Detlef Krömker M-Way quadtree Suchbaum Halde search tree heap ··· octtree B-Tree Hier wird Wissen Wirklichkeit Nicht nur eine „Erfindung“ der Informatik Stammbaum des Wissens Band 1 der Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers (28 Bände, vollendet im Jahr 1772) Jean Baptiste le Rond d'Alembert und Denis Diderot 4 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 2 Wo sind wir in Teil1? V 0 ---V 1 V 2 V 3 ---V 4 V 5 ---V 6 V 7 ---V 8 V 9 V10 V11 5 Begrüßung und Einführung Daten – Information – Wissen Computer – Algorithmus – Programm Variablen – Datentypen – Objekte Elementare numerische Datentypen Zeichenketten Verzweigungen und Schleifen Prozeduren Aggregierte Datentypen Klassen Graphen und Bäume Bibliotheken Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Übersicht Graph Kategorisierung von Graphen Graphen als Datenstruktur Adjazenzmatrix Inzidenzmatrix Adjazenzliste Baum Heap Implementierung von Bäumen 6 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 3 Graph – Definition (Graphentheorie) Ein Graph G ist ein geordnetes Paar zweier Mengen: G = (V, E) Dabei bezeichnet V die Menge der im Graph enthaltenen Knoten (Vertex) und E die Menge der Kanten (Edge) des Graphen. Knoten Anschaulich ist ein Graph ein Gebilde aus Knoten (auch Ecken oder Punkte), die durch Kanten verbunden sein können. Kante Achtung: verschiedene Bilder können denselben Graphen darstellen. 7 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Kategorisierung von Graphen ungerichtete Graphen ohne Mehrfachkanten: E ist eine Teilmenge aller 2-elementigen Teilmengen von V schlicht oder einfach e gerichtete Graphen ohne Mehrfachkanten: E ist eine Teilmenge des kartesischen Produktes V x V 8 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Startknoten von e Digraph (Directed Graph). Endknoten von e Hier wird Wissen Wirklichkeit 4 Kategorisierung von Graphen (Eigenschaften von E) ungerichteten Graphen mit Mehrfachkanten: E ist eine Multimenge [Elemente können mehrfach vorkommen] über der Menge aller 2-elementigen Teilmengen von V (Multigraph) gerichteten Graphen mit Mehrfachkanten: E ist eine Multimenge über dem kartesischen Produkt V x V (Multigraph) Hypergraphen eine Teilmenge der Potenzmenge von V. 9 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Eigenschaften von Graphen Hat eine Kante e in gerichteten Graphen die Form (v, v), so spricht man von einer Schleife (Zyklus). Ist jede Kante eines gerichteten Graphen G Element einer ungerichteten Kante von G, so nennt man G auch symmetrisch. 10 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker = Hier wird Wissen Wirklichkeit 5 Graphen als Datenstruktur Ein Graph als Datentyp sollte mindestens die folgenden Operationen haben ‣ Einfügen (Kante, Knoten) ‣ Löschen (Kante, Knoten) ‣ Finden eines Objekts (Kante, Knoten). Die bekanntesten Repräsentation von Graphen im Computer sind ‣ die Adjazenzmatrix (Nachbarschaftsmatrix) ‣ die Adjazenzliste (Nachbarschaftsliste) ‣ die Inzidenzmatrix (Knoten-Kanten-Matrix, seltener genutzt) 11 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Adjazenzmatrix Ein Graph mit n Knoten kann durch eine n×n-Matrix repräsentiert werden. Dazu nummeriert man die Knoten von 1 bis n durch und trägt in die Matrix die Beziehungen der Knoten zueinander ein. 1 1 2 1 1 2 4 1 2 1 3 4 3 3 1 1 4 Hypergraphen lassen sich nicht durch eine Adjazenzmatrix darstellen. 12 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 6 Adjazenzliste Die Adjazenzliste wird in ihrer einfachsten Form durch eine einfach verkettete Liste aller Knoten des Graphen dargestellt, wobei ‣ jeder Knoten eine Liste aller seiner Nachbarn (in ungerichteten Graphen) bzw. ‣ Nachfolger in gerichteten Graphen besitzt. Vielfachheiten der Kanten Knotengewichte, und Kantengewichte werden meist in Attributen der einzelnen Elemente gespeichert. 13 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Adjazenzliste (2) ‣ In der Praxis verwendet man daher meist diese Form der Repräsentation. ‣ aufwändiger zu implementieren und zu verwalten, bieten aber eine Reihe von Vorteilen gegenüber Adjazenzmatrizen. ‣ verbrauchen nur linear viel Speicherplatz, was insbesondere bei dünnen Graphen (also Graphen mit wenig Kanten) von Vorteil ist, während die Adjazenzmatrix quadratischen Platzbedarf bezüglich der Anzahl Knoten besitzt (dafür aber kompakter bei dichten Graphen, also Graphen mit vielen Kanten ist). ‣ Zum anderen lassen sich viele graphentheoretische Probleme nur mit Adjazenzlisten in linearer Zeit lösen. 14 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 7 Inzidenzmatrix (seltener genutzt) ‣ Ein Graph mit n Knoten und m Kanten kann auch durch eine n×mMatrix repräsentiert werden. Dazu nummeriert man die Knoten von 1 bis n und die Kanten von 1 bis m durch und trägt in die Matrix die Beziehungen der Knoten zu den Kanten ein. ‣ Jede Spalte der Inzidenzmatrix enthält genau zwei von Null verschiedene Einträge. ‣ In ungerichteten Graphen zweimal die 1 und ‣ in gerichteten Graphen einmal die 1 (Endknoten) und einmal die -1 (Startknoten). 15 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Baum Als Wald bezeichnet man in der Graphentheorie einen ungerichteten Graphen ohne Kreis Zyhlus). Ist dieser zusammenhängend, so spricht man von einem (ungerichteten) Baum. Die Zusammenhangskomponenten eines Waldes stellen in diesem Sinne für sich einen Baum dar, so dass ein Wald aus einem oder mehreren Bäumen besteht. Jeder ungerichtete Baum ist also auch ein Wald. Betrachtungen über Wälder lassen sich damit auch auf ungerichtete Bäume übertragen. Umgekehrt sind aber auch Betrachtungen über ungerichtete Bäume häufig leicht auf Wälder übertragbar. 16 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 8 Gewurzelte Bäume Neben ungerichteten Bäumen betrachtetet man auch gerichtete Bäume, die häufig auch als gewurzelte Bäume bezeichnet werden und sich weiter in In-Trees und Out-Trees unterscheiden lassen. Es gibt einen ausgezeichneten Knoten, den man Wurzel nennt und für den die Eigenschaft gilt, ‣ dass alle Kanten von diesem wegzeigen (Out-Tree) oder ‣ zu diesem hinzeigen (In-Tree). 17 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Eigenschaften die lineare Struktur der Liste wird aufgebrochen. Der maximale Ausgangsgrad wird als Ordnung eines Out-Trees bezeichnet alle Knoten mit Ausgangsgrad 0 bezeichnet man als Blätter. alle Knoten, die kein Blatt sind, als innere Knoten. (Manchmal schließt man die Wurzel dabei aber aus.) Als Tiefe einen Knotens bezeichnet man die Länge des Pfades von der Wurzel zu ihm und als Höhe des Out-Trees die Länge eines längsten Pfades. 18 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 9 Eigenschaften Für einen von der Wurzel verschiedenen Knoten v bezeichnet man den Knoten, durch den er mit einer eingehenden Kante verbunden ist als Vater, Vaterknoten, Elternknoten oder Vorgänger von v. Als Vorfahren von v bezeichnet man alle Knoten, die entweder Vater von v oder Vorgänger des Vaters sind. Umgekehrt bezeichnet man alle Knoten, die von einem beliebigen Knoten v aus durch eine ausgehende Kante verbunden sind als Kinder, Kinderknoten, Sohn oder Nachfolger von v. Als Nachfahren von v bezeichnet man Kinder von v oder deren Nachfahren. Als Geschwister oder Geschwisterknoten werden in einem Out-Tree Knoten bezeichnet, die den gleichen Vater besitzen. 19 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Spezielle Bäume ‣ Bei Binärbäumen ist die Anzahl der Kinder höchstens zwei. ‣ In balancierten Bäumen gilt zusätzlich, dass sich die Höhen des linken und rechten Teilbaums an jedem Knoten höchstens um eins unterscheiden. ‣ Bei Suchbäumen sind die Elemente in der Baumstruktur geordnet abgelegt, so dass man schnell Elemente im Baum finden kann. 20 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 10 Partiell geordneter Baum Ein partiell geordneter Baum T ist ein Baum, ‣ dessen Knoten markiert sind ‣ dessen Markierungen aus einem geordneten Wertebereich stammen ‣ in dem für jeden Teilbaum T' mit der Wurzel x gilt: Alle Knoten aus T' sind größer markiert als x oder gleich x. Intuitiv bedeutet dies: Die Wurzel jedes Teilbaumes stellt ein Minimum für diesen Teilbaum dar. Die Werte des Teilbaumes nehmen in Richtung der Blätter zu oder bleiben gleich. 21 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Geordnete, strikte und vollständige Binärbäume ‣ Ein Binärbaum heißt geordnet, wenn jeder innere Knoten ein linkes und eventuell zusätzlich ein rechtes Kind besitzt (und nicht etwa nur ein rechtes Kind). ‣ Man bezeichnet ihn als voll oder strikt, wenn jeder Knoten entweder Blatt ist (also kein Kind besitzt), oder aber zwei (also sowohl ein linkes wie ein rechtes) Kinder besitzt. ‣ Man bezeichnet ihn als vollständig, wenn alle Blätter die gleiche Tiefe besitzen. Ein vollständiger Binärbaum der Höhe n, n man häufig auch als Bn bezeichnet, hat genau ‣ 2n+1-1 Knoten, 2i Knoten in Tiefe i, insbesondere also ‣ 2n-1 innere Knoten, 2n Blätter mit Höhe n die Länge des Pfades zu einem tiefsten Knoten bezeichnet wird. 22 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 11 Eine wichtige Operation auf Bäumen: Linearisierung oder Traversierung Es gibt verschiedene Möglichkeiten, die Knoten von Binärbäumen zu durchlaufen. Diesen Prozess bezeichnet man auch als Linearisierung oder Traversierung. Man unterscheidet hier in: ‣ ‣ 23 pre-order (W–L–R): wobei zuerst die Wurzel (W) betrachtet wird und anschließend zuerst der linke (L), dann der rechte (R) Teilbaum durchlaufen wird, in-order (L–W–R): wobei zuerst der linke (L) Teilbaum durchlaufen wird, dann die Wurzel (W) betrachtet wird und anschließend der rechte (R) Teilbaum durchlaufen wird und Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Eine wichtige Operation auf Bäumen: Linearisierung oder Traversierung ‣ post-order (L–R–W): wobei zuerst der linke (L), dann der rechte (R) Teilbaum durchlaufen wird und anschließend die Wurzel (W) betrachtet wird. ‣ level-order Beginnend bei der Wurzel, werden die Ebenen von links nach rechts durchlaufen. 24 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 12 Rekursive Implementierungen Funktion Preorder (Baum) W <- Baum.Wurzel If Baum.Links <> NULL L <- Preorder(Baum.Links) If Baum.Rechts <> NULL R <- Preorder(Baum.Rechts) Return W°L°R Funktion Inorder (Baum) W <- Baum.Wurzel If Baum.Links <> NULL L <- Inorder(Baum.Links) If Baum.Rechts <> NULL R <- Inorder(Baum.Rechts) Return L°W°R //W:= Wurzel des übergebenen Baumes //Existiert ein linker Unterbaum? // dann: L:= Preorder von linkem Unterbaum //Existiert ein rechter Unterbaum? // dann: R:= Preorder von rechtem Unterbaum //Rückgabe: Verkettung aus W, L und R /W:= Wurzel des übergebenen Baumes //Existiert ein linker Unterbaum? // dann: L:= Inorder von linkem Unterbaum //Existiert ein rechter Unterbaum? // dann: R:= Inorder von rechtem Unterbaum //Rückgabe: Verkettung aus L, W und R Funktion Postorder (Baum) W <- Baum.Wurzel //W:= Wurzel des übergebenen Baumes If Baum.Links <> NULL //Existiert ein linker Unterbaum? L <- Postorder(Baum.Links) // dann: L:= Postorder von linkem Unterbaum If Baum.Rechts <> NULL //Existiert ein rechter Unterbaum? R <- Postorder(Baum.Rechts) // dann: R:= Postorder von rechtem Unterbaum Return L°R°W //Rückgabe: Verkettung aus L, R und W 25 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Man unterscheidet hier weiter ‣ in binäre Suchbäume mit AVL-Bäumen als balancierte Version und ‣ B-Bäumen sowie diversen Varianten, den B*-Bäumen (die Blattknoten in einer Liste miteinander verkettet). (Spezielle Suchbäume in Datenbanksystemen Achtung: B steht nicht für binär!) ‣ In B*-Bäumen wird neben der effizienten Suche einzelner Datenelemente auch das schnelle sequenzielle Durchlaufen aller Datenelemente unterstützt). Eine detaillierte Diskussion würde hier zu weit führen, aber Sie werden in Ihrem Studium noch viel davon hören, versprochen ;-) 26 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 13 Bäume als Datenstruktur Gewurzelte Bäume, insbesondere Out-Trees, Bei beschränkter Ordnung können diese so implementiert werden, dass jeder Knoten einen festen Satz an Variablen oder ein Array für die Referenzen auf seine Kinder enthält. Ein Baum unbeschränkter Ordnung kann implementiert werden, indem man statt Arrays dynamische Listen verwendet (z. B. in Python). Häufig besitzen die Knoten auch eine Referenz auf ihren Elternknoten (back pointer). 27 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Bäume als Datenstruktur (2) In Programmiersprachen ohne dynamische Listen hat sich auch ein Verfahren bewährt, bei dem ein allgemeiner Baum durch einen Binärbaum implementiert wird rote Linie zeigt dabei den realisierten allgemeinen Baum Pfeile zeigen die tatsächlich implementierte Zeigerstrukturen repräsentieren. Prinzip: linke Zeiger zeigt auf den am weitesten links stehenden Sohn rechte Zeiger auf den rechten Bruder verweist. 28 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 14 Heap ‣ ‣ Der Heap (Haufen, Halde) vereint die Datenstruktur eines Baums mit den Operationen einer Vorrangwarteschlange. Je nach Reihenfolge in der Vorrangwarteschlange spricht man von Min-Heap oder einem Max-Heap. ‣ Häufig hat der Heap neben den minimal nötigen Operationen wie insert, remove und extractMin (-Max)auch noch weitere Operationen wie merge oder changeKey. ‣ In einem Heap können Objekte oder Elemente abgelegt und aus diesem wieder entnommen werden. Sie dienen damit der Speicherung von Mengen. Den Elementen ist dabei ein Schlüssel zugeordnet, der die Priorität der Elemente festlegt. Häufig werden auch die Elemente selbst als Schlüssel verwendet. 29 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Übersicht ... zur Implementierung Implementierung mit einer dynamischen Liste in Python „einfach“ und effizient möglich Übung Graph gerichtet azyklisch ··· Baum tree M-Way binary tree 30 quadtree Suchbaum Halde search tree heap ··· octtree Programmieren 1 – Teil 1 – V10 WS 2006/2007 ·· B-Tree Wir betrachten eine Variante zur Übung ... Programmierung einer Klasse! · Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 15 Vorab: Zusammenfassung der Namenskonventionen (1) (1) Namen, die mit zwei Unterstrichen beginnen und enden (zum Beispiel _ _init_ _), haben eine besondere Bedeutung für den Interpreter: Klassen fangen eingebaute Operationen ab und implementieren dieses auf ihre Art (Überladen die Methode), indem sie Methoden mit zwei Unterstrichen beginnen und enden lassen, die sie von ihrer Oberklasse geerbt haben. (2) Namen, die mit einem Unterstrich beginnen, (z.B. _A) und denen auf oberster Ebene eines Moduls zugewiesen wird, werden bei from module import * nicht sichtbar. (Pseudo private Attribute) (3) Namen in einer class-Anweisung, die mit zwei Unterstrichen beginnen, aber nicht damit enden, z.B. _ _A, wird der Name der Klasse vorangestellt (Pseudo private Attribute) 31 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Zusammenfassung der Namenskonventionen (2) (4) Klassennamen beginnen normalerweise mit einem großen Buchstaben, z.B. MeineKlasse (Camel Casing) (5) Der erste (am weitesten links stehende) Parameter der Methodendefinition innerhalb von Klassen wird normalerweise self genannt. (6) Qualifizierte Namen werden als Attribute bezeichnet und unterliegen den Regeln für Objekt-Namensräumen. Zuweisungen in bestimmten lexikalischen Geltungsbereichen (beziehen sich auf die Schachtelung im Quellcode eines Programmes) initialisieren Objekt-Namensräume (Module, Klassen). 32 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 16 Ein Beispiel für die (unvollständige) Implementierung eines binären Suchbaums class Node: def __init__(self, data=None): self.data = data self.left = None self.right = None def __str__(self): return "[%s, %i, %i]" % (str(self.data), id(self.left), id(self.right)) 33 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Implementierung eines binären Suchbaums (2) class BTree: def __init__(self): self.root = None def _prchilds(self, node): if node != None: return "(%s; %s; %s)" (self._prchilds(node.left), node, self._prchilds(node.right)) else: return "nil" 34 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 17 Implementierung eines binären Suchbaums (3) def add(self, data): if self.root == None: self.root = Node(data) else: curnode = self.root lastnode = self.root while curnode != None: lastnode = curnode if data < curnode.data: curnode = curnode.left direction = -1 # links einfügen else: curnode = curnode.right direction = +1 # rechts einfügen if direction == -1: lastnode.left = Node(data) else: lastnode.right = Node(data) 35 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Testen unserer Implementierung in der Python Shell >>> a=BTree() >>> a.add(4) >>> a.add(2) >>> a.add(7) >>> a <__main__.BTree instance at 0x00C26828> >>> a.__str__() '((nil; [2, 505028048, 505028048]; nil); [4, 13095440, 13095880]; (nil; [7, 505028048, 505028048]; nil))' 36 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 18 Zusammenfassung ‣ Graphen, Bäume, Heaps ‣ ganz wichtige Datenstrukturen ‣ Sie wissen, was das ist und wissen, wie es zu implementieren ist ‣ es fehlen aber noch viele weitergehende Aspekte, ... Datenstrukturen im 2. Semester, ... Programmieren erfordert Disziplin, Ausdauer, abstraktes Denkvermögen, Kreativität und hohe Lernbereitschaft! 37 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Was haben wir (noch) nicht gemacht? Algorithmenkonstruktion ... macht Prof. Drobnik Interaktive Programme mit graphischer Oberfläche ... das tut mir etwas weh! ein Teil des Skripts fehlt noch V2 ... wird bald nachgeliefert und auch eine Überarbeitung (insbesondere Fehlerkorrektur) Sie erkennen das an einer Versionsnummer (-X) auf dem Server Möglichkeiten sich Selbsttest (Multiple-Choice Fragen, demnächst!) 38 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 19 Fragen und (hoffentlich) Antworten 39 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit Ausblick Der Abschluss des Teils 1 (für die Klausur immerhin schon 45%): jeweils nur ausgewählte Elemente: ‣ Module, Pakete ‣ Ein- / Ausgabe ‣ exceptions ‣ event-based programming ‣ und eine 1. Evaluierung Danke für Ihre Aufmerksamkeit! 40 Programmieren 1 – Teil 1 – V10 WS 2006/2007 Prof. Dr. Detlef Krömker Hier wird Wissen Wirklichkeit 20