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