Informatik I/II PVK
MittwochInformatik 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
Informatik I/II PVK 3
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 4
Unterschiede zu C++
Keine Templates, structs, unions, pointer,
Mehrfachvererbung, Präprozessor, Operatorenüberladung, goto, .h Dateien, Destruktoren, friends
Stattdessen Alles sind Klassen, Interfaces, final, Garbage-
Collector, Threads
Informatik I/II PVK 5
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 6
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 7
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 8
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 9
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 10
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 11
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 12
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 d = new D();A a = d;B b = d;C c = d;E e = d;F f = d;
E e = new E();A a = e;B b = e;C c = e;D d = e;F f = e;
A a = new D();B b = (B) a;C c = (C) a;D d = (D) a;E e = (E) a;F f = (F) a;
Informatik I/II PVK 13
Lösung zu vorherigen Slide
D d = new D();A a = d; // gehtB b = d; // gehtC c = d; // gehtE e = d; // geht nichtF f = d; // geht nicht
E e = new E();A a = e; // gehtB b = e; // gehtC c = e; // geht nichtD d = e; // geht nichtF f = e; // geht nicht
A a = new D();B b = (B) a; // gehtC c = (C) a; // gehtD d = (D) a; // gehtE e = (E) a; // geht nichtF f = (F) a; // 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 14
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 15
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 16
Exceptions 2
Alle Ausnahmen erben von Throwable Mit catch(Throwable e) fängt man alle Ausnahmen
ab Laufzeitfehler müssen nicht abgefangen werden, alle
andern schon 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 17
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 18
Wurzelbäume
Wurzelbäume sind rekursive Konstrukte
A
B C
F GED
Auch ein Wurzelbaum
AB
DC
EFG
Eingerückte Form, sieht schon fast aus wie Quelltext
Informatik I/II PVK 19
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 20
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 V
F
G
JTQAH
K N O
Informatik I/II PVK 21
Syntaxbaum
Wir können eine Anweisung in einen Baum schreiben
{ if ( a == b ) a++; else a=a-2; }
Anweisung{ }
if ( Ausdruck ) Anweisung else Anweisung
a == b a++ Variable = Ausdruck
a-2
Informatik I/II PVK 22
Syntaxdiagram
Beschreibung zur Generierung einer bestimmten Syntax
Term
Term +
Ausdruck
Faktor
Faktor *
Term
int_const
Ausdruck )
Faktor
(
Informatik I/II PVK 23
Aufgabe
Sind folgende Ausdrücke realisierbar mit diesen Syntaxdiagrammen?
X2 (X∼ 1 OR X∼ 2 )
(~X1) (X2 ) OR ( X∼ 1 OR X2 )
(X1 OR X2 ) AND ( X∼ 1 ) (X1 ) AND ( X∼ 1 OR X∼ 2 ) AND (X2 )
Informatik I/II PVK 24
Lösung zu vorherigen Slide
Nur
(X1 OR X
2 ) AND ( X∼
1 ) und (X
1 ) AND ( X∼
1 OR X∼
2 ) AND (X
2 )
sind gültige Ausdrücke
Informatik I/II PVK 25
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 26
Stack
push
pop
Informatik I/II PVK 27
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 28
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 gibt die Summe von allen Werten zurück
last gibt das letzte Element der Liste zurück
sublist gibt die Teilliste ab einem bestimmten Wert zurück
valueAt gibt den Wert an einer bestimmten Stelle zurück
index gibt den Index des ersten Elements zurück, welches einen bestimmten Wert hat
remove löscht Element an bestimmter Position
Informatik I/II PVK 29
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 30
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
Data
back
left right
Informatik I/II PVK 31
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
log(n) Schritte für gutartige Bäume Wann ist der Baum nicht gutartig?
10
5 14
12 151
Informatik I/II PVK 32
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 33
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 34
Lösung zu vorherigen Slide
Rest der Lösung in SearchTreeErase.java
20
12 32
28 47
39 52
179
13
20
13 32
28 47
39 52
179
28
13 32
47
39 52
179
Informatik I/II PVK 35
Morgen
Achtung Raumwechsel Ab morgen im HG E33.1