Informatik I/II PVK Mittwoch Informatik II, 1. Teil Ablauf heute Allgemeines zu Java Unterschiede zwischen Java und C++ (Mehrfach)-Vererbung Exceptions Wurzelbäume Syntaxdiagramme, Parser Stack und Listen Binärbaum Programmieren mit Java Java-Syntax ähnelt der von C++ stark Praktisch, weil man sich nicht viel mehr merken muss... … aber auch gefährlich, weil man was verwechseln kann. Da Java-Programme nur auf einer virtuellen Maschine (VM) laufen, gibt es eine kleine Effizienzeinbusse. Java ist rein objektorientiert Kompilieren: javac HelloWorld.java Datei heisst immer wie die darin enthaltende Klasse Ausführen: java HelloWorld Kein Linken notwendig Informatik I/II PVK 3 Unterschiede zu C++ Keine Templates, structs, unions, pointer, Mehrfachvererbung, Präprozessor, Operatorenüberladung, goto, .h Dateien, Destruktoren, friends Stattdessen Alles sind Klassen, Interfaces, final, GarbageCollector, Threads Informatik I/II PVK 4 Unterschiede zu C++ Da wir Klassendeklaration und Implementation nicht trennen, wird jede Funktion gleich an Ort und Stelle implementiert (in der Klasse) char ist 2 Byte (Unicode) Bitgrössen der Basistypen unabhängig von Architektur Arrays müssen nicht konstant sein Hüllenklassen. Bsp.: int → Integer instanceof um Datentyp zu prüfen import statt include boolean statt bool Informatik I/II PVK 5 Weiteres zu Java Ausgebautes System für die Verwendung von Exceptions Internetfähige Applets Einschränkungen bei impliziter Typenumwandlung float → int gibt eine Fehlermeldung Strings vergleichen: s1.equals(s2) static Methode greift nur auf andere static Methoden und static Variablen zu Plattformunabhängig Informatik I/II PVK 6 Weiteres zu Java Obwohl keine Pointer: Immer call-by-reference und this existiert auch Globale Variablen sind immer static In Java gibt es immer Referenzen d.h. wir arbeiten immer mit Adressen und nie mit den Werten selbst Vergleichen von zwei Referenzvariablen vergleicht die Adresse und nicht deren Wert! Person p = new Person(„Stefan“); Person q = new Person(„Stefan“); p == q // ergibt false Informatik I/II PVK 7 package Jede Klasse gehört einem Paket an Am Anfang jeder Datei: package myPackage; Falls nichts angegeben: package unnamed; Gibt man weder public noch private an, so sind Variablen und Methoden im Package sichtbar und zugreifbar Man kann ein ganzes Paket mit import java.io.* einfügen Pro Datei darf nur eine Klasse public sein Informatik I/II PVK 8 Vererbung Funktioniert fast gleich wie in C++ class Car extends Vehicle { … } Es gilt: Car c; Vehicle v; … v = c; c = v; geht aber nicht (Polymorphismus) Java hat auch abstrakte Klassen abstract class GeoObj { abstract double area(); } Informatik I/II PVK 9 Mehrfachvererbung Java bietet keine Mehrfachvererbung an und entgeht so dem „diamond inheritance problem“ Jedoch gibt es Interfaces (= Abstrakte Klassen deren Methoden alle abstrakt sind) interface Vehicle { … } Das Interface wird dann von anderen Klassen implementiert class Circle implements GeoObj { … } Informatik I/II PVK 10 Interfaces Interfaces können sich gegenseitig erweitern interface Z extends A, B, C { … } Und bei class Y extends X implements Z, A wird bei Konflikten jeweils der Klasse (Y) der Vortritt gegeben Während man nur von einer Klasse erben kann, kann man dafür mehrere Interfaces implementieren Informatik I/II PVK 11 Aufgabe interface A { } abstract class B implements A { } interface C extends A { } class D extends B implements C { } class E extends B { } public class F implements C { } D A B C E F d a b c e f = = = = = = new D(); d; d; d; d; d; E A B C D F e a b c d f = = = = = = new E(); e; e; e; e; e; Informatik I/II PVK A B C D E F a b c d e f = = = = = = new (B) (C) (D) (E) (F) D(); a; a; a; a; a; 12 Lösung zu vorherigen Slide D A B C E F d a b c e f = = = = = = new D(); d; // geht d; // geht d; // geht d; // geht nicht d; // geht nicht A a B b C c D d E e F f = = = = = = new (B) (C) (D) (E) (F) E e A a B b C c D d F f D(); a; // a; // a; // a; // a; // = = = = = = new E(); e; // geht e; // geht e; // geht nicht e; // geht nicht e; // geht nicht geht geht geht geht nicht geht nicht Im dritten Stapel sind dynamic casts (es wird erst bei Laufzeit festgestellt von welchem Typ eine Variable wirklich ist (in diesem Fall D)) Informatik I/II PVK 13 super Mit super kann man auf eine Funktion der Basisklasse zugreifen Wird also z.B. super in einem Konstruktor aufgerufen, so ruft man den Konstruktor der Basisklasse auf Praktisch: Wir müssen nicht den ganzen Klassenhierarchiebaum kennen um eine Funktion einer Basisklasse aufzurufen class A extends B { public func() { super(); // ruft func() von B oder höher auf } } Informatik I/II PVK 14 Exceptions Ausnahmen werden in try Blöcken ausgelöst Können mit catch abgefangen und behandelt werden Dabei wird unterschieden welche Art von Ausnahme aufgetreten ist Bsp.: try { // Versuche in Datei zu schreiben } catch (IOException e) { // Behandle Fehler } Informatik I/II PVK 15 Exceptions 2 Alle Ausnahmen erben von Throwable Laufzeitfehler müssen nicht abgefangen werden, alle andern schon Mit catch(Throwable e) fängt man alle Ausnahmen ab Ausser die eigene Funktion löst die selbe Ausnahme aus, gibt den Fehler weiter public func( … ) throws java.io.IOException { } Man kann auch eigene Ausnahmen definieren und auslösen Informatik I/II PVK 16 Graphen Graphen bestehen aus Knoten und Kanten Eine Kante verbindet genau zwei Knoten Zusammenhängend Planar Ein Baum hat keine Zyklen Es gibt immer nur genau einen Weg von einem Knoten zu einem anderen Anzahl der Knoten = 1 + Anzahl der Kanten Informatik I/II PVK 17 Wurzelbäume Wurzelbäume sind rekursive Konstrukte A A B B D D C E F C E F G G Auch ein Wurzelbaum Eingerückte Form, sieht schon fast aus wie Quelltext Informatik I/II PVK 18 Aufgabe Schreibe folgenden Baum in Linksklammerdarstellung Schreibe folgende Linksklammerdarstellung als Baum S(R(H(K)),P(A(N,O),Q,T),V(J,F(G))) Informatik I/II PVK 19 Lösung zu vorherigen Slide 2(76(11(41,7,25(13)),7(16(54,17))),79(87(1,23(5,3)),65)) S R P H K A N Q V T O Informatik I/II PVK J F G 20 Syntaxbaum Wir können eine Anweisung in einen Baum schreiben { if ( a == b ) a++; else a=a-2; } { if ( } Anweisung Ausdruck a == b ) Anweisung a++ else Anweisung Variable = Ausdruck a-2 Informatik I/II PVK 21 Syntaxdiagram Beschreibung zur Generierung einer bestimmten Syntax Ausdruck Term Term Term + Faktor * Faktor int_const Faktor ( Ausdruck Informatik I/II PVK ) 22 Aufgabe Sind folgende Ausdrücke realisierbar mit diesen Syntaxdiagrammen? ∼ (X1 OR ∼ X2 ) X2 (~X1) (X1 OR X2 ) AND (∼ X1 ) (X2 ) OR (∼ X1 OR X2 ) (X1 ) AND (∼ X1 OR ∼ X2 ) AND (X2 ) Informatik I/II PVK 23 Lösung zu vorherigen Slide Nur (X1 OR X2 ) AND (∼ X1 ) und (X1 ) AND (∼ X1 OR ∼ X2 ) AND (X2 ) sind gültige Ausdrücke Informatik I/II PVK 24 Parser Ein Parser kontrolliert die Syntax des Quellcodes static char c; void int_const() { c = getCharacter(); } void Ausdruck() { Term(); while (c == '+') { c = getCharacter(); Term(); } } void Term() { Faktor(); while (c == '*') { c = getCharacter(); Faktor(); } } void Faktor() { if (c>='0' && c<='9') int_const(); else if (c == '(') { c = getCharacter(); Ausdruck(); if (c == ')') c = getCharacter(); else Fehler(); } else Fehler(); } Informatik I/II PVK 25 Stack push pop Informatik I/II PVK 26 Zyklische Listen Wir können auch in Java verkettete Listen aufbauen class ListElem { int value; // oder sonst welche Daten ListElem next; // Zeigt auf nächstes Element der Liste } Mit einem ListElem back; könnten wir auch rückwärts durch die Liste gehen Informatik I/II PVK 27 Aufgabe Schreibe rekursive Implementation der Funktionen add fügt ein Element an den Anfang der Liste ein size gibt die Länge der Liste zurück sum last sublist gibt die Teilliste ab einem bestimmten Wert zurück valueAt gibt den Wert an einer bestimmten Stelle zurück index remove gibt die Summe von allen Werten zurück gibt das letzte Element der Liste zurück gibt den Index des ersten Elements zurück, welches einen bestimmten Wert hat löscht Element an bestimmter Position Informatik I/II PVK 28 Aufgabe Programmiere einen Stack, der diese Liste verwendete und implementiere push fügt dem Stack ein Element hinzu pop nimmt das oberste Element des Stacks weg peek gibt das oberste Element des Stacks zurück empty bestimmt, ob Stack leer ist size gibt die Grösse des Stacks zurück (Lösung in LinkedList&Stack.java) Informatik I/II PVK 29 Binärbäume class BaumElem { int value; // Oder sonstige Daten BaumElem left, right, back; } Mit zusätzlichen BaumElem back; könnten wir den Baum nicht nur runter, sondern wieder hoch back Data left right Informatik I/II PVK 30 Binärer Suchbaum Jeder Knoten des Baumes hat ein Attribut Wir wollen einen Baum der geordnet ist und zwar Von jedem Knoten aus, soll der linke Unterbaum nur Elemente mit kleinerem Attribut beinhalten Und der rechte Unterbaum nur Elemente, die grösser sind als der Knoten Suchen dauert jetzt nur noch 10 log(n) Schritte für gutartige Bäume 5 14 Wann ist der Baum nicht gutartig? 1 Informatik I/II PVK 12 15 31 Einfügen in Binärbaum void insert (int data, BaumElem b, BaumElem prev) { if (b == null) { b = new BaumElem(); b.value = data; b.back = prev; } else if (data < b.value)) insert(data, b.left, b); else insert(data, b.right, b); } Informatik I/II PVK 32 Aufgabe Lösche in diesem Binärbaum 15, 12 und 20 und ersetze den Knoten jeweils mit dem kleinsten Element vom rechten Teilbaum. Implementiere die Funktion erase(int data, BaumElem b) welche genau das macht Informatik I/II PVK 33 Lösung zu vorherigen Slide 20 20 12 9 17 13 32 28 13 47 39 28 9 52 32 17 28 13 47 39 9 52 32 17 47 39 52 Rest der Lösung in SearchTreeErase.java Informatik I/II PVK 34 Morgen Achtung Raumwechsel Ab morgen im HG E33.1 Informatik I/II PVK 35