Informatik 1 Tutorium 1 - family

Werbung
Informatik 1 – Tutorium 1
Informatik 1
Tutorium 1
1.1
Tihomir R. Todorov
Informatik 1 – Tutorium 1
Kontankt
E-Mail: [email protected]
Skype: mr_ms_todorov
ICQ: 53317269
Web: http://www.home.hs-karlsruhe.de/~toti0011/
1.2
Tihomir R. Todorov
Informatik 1 – Tutorium 1
Primitive Datentypen in Java
byte, short, int, long, float, double, boolean, char
Beispiel - Temperaturumrechnung
package celsius_in_fahrenheit;
public class CelsiusInFahrenheit {
public static void main(String[] args) {
double celsius = 23.0; // Declaration + Initialization.
double fahrenheit; // Declaration.
fahrenheit = celsius * 1.8 + 32;
System.out.println(“Fahrenheit: “ + fahrenheit);
}
}
1.3
Tihomir R. Todorov
Informatik 1 – Tutorium 1
Operatoren in Java
+, -, *, /, %
= (Zuweisungsoperator)
>, <, >=, <= (Vergleichsoperatoren)
Mathematik gegen Java
Mathematik
7 : 5 = 1 Rest 2
1.4
Tihomir R. Todorov
Java
7/5=1
7%5=2
Informatik 1 – Tutorium 1
Konvertierung in Java
Widening Conversion (von klein zu groß)
byte->short->int->long->float->double
Bsp.:
int i = 17L;
// Compiler meldet Fehler.
float f = 17L; // OK.
Narrowing Conversion (von groß zu klein)
double->float->long->int->short->byte
(mit Hilfe des cast-Operators)
Bsp.:
int i = (int)17L;
// OK.
long l = (long)13.7f; // OK, Mit Verlust.
1.5
Tihomir R. Todorov
Informatik 1 – Tutorium 1
Zuweisungsoperator =
Wird von rechts nach links ausgewertet!
Bsp.:
a = b = 2 <=> a = (b = 2)
Varianten von =
1.6
a += 1
<=>
a = a + 1
a *= 7.0
<=>
a = a * 7.0
a -= 3.1
<=>
a = a - 3.1
a /= 1.55
<=>
a = a / 1.55
Tihomir R. Todorov
Informatik 1 – Tutorium 1
Boolesche Ausdrücke
| - Oder, ^ - Entweder oder (XOR), & - Und, ! - Negation
! stärker als &, & stärker als ^, ^ stärker als |
|
false
true
&
false
true
^
false
true
false
false
true
false
false
false
false
false
true
true
true
true
true
false
true
true
true
false
!
1.7
false
true
true
false
Tihomir R. Todorov
Informatik 1 – Tutorium 1
if-, if-else-Anweisung
if (logischer Ausdruck) <=> if (logischer Ausdruck) {
Anweisung;
Anweisung;
}
if (logischer Ausdruck) {
Anweisung;
Anweisung;
}
if (logischer Ausdruck) { // Um zw. den zwei Alternativen
Anweisung;
// einer Bedingung zu entschei} else {
// den, kann das if-Konstrukt erAnweisung;
// weitert werden.
}
1.8
Tihomir R. Todorov
Informatik 1 – Tutorium 1
if-else-Anweisung
Die if-else-Strukturen können so aneinandergekettet
werden, dass eine Selektion aus einer beliebigen
Anzahl von Alternativen möglich ist.
if (logischer Ausdruck) {
Anweisung;
} else if (logischer Ausdruck) {
Anweisung;
} else {
Anweisung;
}
1.9
Tihomir R. Todorov
Informatik 1 – Tutorium 1
Übungsaufgaben 1
Auf. 1
Schreiben Sie ein Java-Programm, das m/s in km/h
umrechnet. Dir Formel lautet: km/h = m/s * 3.6
package kmh_in_ms;
public class KmHInMS {
public static void main(String[] args) {
double m_s = 4; // Declaration + Initialization.
double km_h; // Declaration.
km_h = m_s * 3.6;
System.out.println(km_h);
}
}
1.10
Tihomir R. Todorov
Informatik 1 – Tutorium 1
Auf. 2 (Ähnliche Aufgabe SS 07)
Welchen Wert hat der folgende Ausdruck und welchen
Datentyp hat das Ergebnis?
2 * ((byte) 3.2f) + ((int) 7L) * ((short) 2.7d)
Wert = 20
Datentyp: byte->short->…->double
Auf. 3 (Ähnliche Aufgabe WS 07-08)
Welchen Datentyp haben folgende Ausdrücke?
Ausdruck
1 + 3.0 / 3.0f – 10L
128 + ((byte) 56)
1.11
Tihomir R. Todorov
Datentyp
double
short->int->…->double
Informatik 1 – Tutorium 1
Auf. 4
Schreiben Sie ein Java-Programm, das zwei Zahlen dividiert und
das folgende Ergebnis auf dem Bildschirm ausgibt:
“Zahl_1 : Zahl_2 = X Rest Y“. Bitte beachten Sie, dass Zahl_1
und Zahl_2 bekannt sind und von Typ integer sind.
package division;
public class Division {
public static void main(String[] args) {
int a = 7;
int b = 5;
System.out.println(a + " : " + b + " = " + a/b
+ " Rest " + a%b);
}
}
1.12
Tihomir R. Todorov
Informatik 1 – Tutorium 1
Auf. 5
Wie viel Bytes Speicherplatz benötigen die folgenden
Datentypen?
1.13
boolean
1
long
byte
1
float
short
2
double
int
4
char (unicode)
Tihomir R. Todorov
8
4
8
2
Informatik 1 – Tutorium 1
Auf. 6 (Ähnliche Aufgabe WS 07-08)
Welchen Wert haben folgenden Ausdrücken?
1.14
Ausdruck
Wert
1+2/3*4
1
1 / 2 == 3 / 4
true
1 == 2 && 3 != 4 || 1 < 2
true
((int) (1.2 * 1.3)) * 2.0
2.0 (double)
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Informatik 1
Tutorium 2
2.1
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Kontrollstrukturen in Java
Verzweigungen (Auswahl)
if-else-Anweisung
switch-case-Anweisung
switch
Schleifen (Wiederholung)
for-Schleife
while-Schleife
do-while-Schleife
2.2
Tihomir R. Todorov
Informatik 1 – Tutorium 2
switch-case-Anweisung
Syntax
Beispiel
switch (<Selektor>) {
case <Konstante>:
<Anweisung>;
break;
case <Konstante>:
<Anweisung>;
break;
...
default:
<Anweisung>;
}
char c = ‘b‘;
switch (c) {
case ‘a‘:
System.out.println(“a“);
break;
case ‘b‘:
System.out.println(“b“);
break;
default:
System.out.println(“c“);
}
Erlaubten Datentypen für <Selektor>: int, char, enum
2.3
Tihomir R. Todorov
Informatik 1 – Tutorium 2
if-else-Anweisung
<=>
if-else
switch-case
int i = 2;
if (i == 1) {
System.out.println(“1“);
} if else (i == 2) {
System.out.println(“2“);
} else {
System.out.println(“3“);
}
2.4
switch-case-Anweisung
Tihomir R. Todorov
int i = 2;
switch (i) {
case 1:
System.out.println(“1“);
break;
case 2:
System.out.println(“2“);
break;
default:
System.out.println(“3“);
}
Informatik 1 – Tutorium 2
for-Schleife
Syntax
for (<Initialisierung>; <Bedingung>; <Fortsetzung>) {
<Anweisung>;
}
Beispiel
package stuff;
class Stuff {
public static void main(String[] args) {
for (int i = 1, j = 3; i < 3 || j > 2; i++, j--) {
System.out.println(i + “ “ + j);
}
}
}
2.5
Tihomir R. Todorov
Informatik 1 – Tutorium 2
while-Schleife
Syntax
while (<Bedingung>) {
<Anweisung>;
}
Beispiel
package stuff;
class Stuff {
public static void main(String[] args) {
int i = 1, j = 3;
while (i < 3 || j > 2) {
System.out.println(i + “ “ + j);
i++; j--;
}
}
}
2.6
Tihomir R. Todorov
Informatik 1 – Tutorium 2
for-Schleife
<=>
while-Schleife
for-Schleife
for (<Initialisierung>; <Bedingung>; <Fortsetzung>) {
<Anweisung>;
}
while-Schleife
<Initialisierung>;
while (<Bedingung>) {
<Anweisung>;
<Fortsetzung>;
}
2.7
Tihomir R. Todorov
Informatik 1 – Tutorium 2
do-while-Schleife
Syntax
do {
<Anweisung>;
} while (<Bedingung>);
Eine do-while-Schleife testet die Bedingung allerdings
erst am Ende.
=> Der Schleifenkörper wird mindesten 1-mal durchlaufen.
Wird meist für eine Menüauswahl benutzt.
Jede do-while-Schleife läst sich prinzipiell auch mit
einer while-Schleife lösen, in der Regel sogar einfacher!
=> Verwendung selten.
2.8
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Methoden in Java
Methodendeklaration
<Zugriff /
<Typ des
<Methodenname> ( <Parameter- )
Sichtbarkeit> Rückgabewerts>
Liste>
Beispiel für eine Methode
public
double
setX (double xValue)
<Zugriff / Sichtbarkeit>: public, private, protected
<Typ des Rückgabewertst>: Alle primitive Datentypen, void, Alle Objekten
<Methodenname>: Beliebiger Name
<Parameter Liste>: Beliebige Anzahl von <Parameter>s
<Parameter>: <Datentyp> <Parametername>
2.9
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Methoden in Java
Class Stuff
package stuff;
// Each method belongs to a class.
public class Stuff {
// Method mA with return value.
public int mA() { return 0; }
// Methods with no return value.
// Methods must be always unique.
// Polymorphy is allowed!
public void mB() { }
public void mB(int i) { }
public void mB(short s) { }
}
2.10
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Optional: Eingabe über die Konsole
Programmfragment
public static void main(String[] args) {
int number_1 = 0, number_2 = 0;
Scanner scanner;
scanner = new Scanner(System.in);
System.out.print("Geben Sie die erste Zahl ein : ");
number_1 = scanner.nextInt();
scanner = new Scanner(System.in);
System.out.print("Geben Sie die zweite Zahl ein: ");
number_2 = scanner.nextInt();
System.out.print("Das Ergebnis der Addition ist: "
+ (number_1 + number_2));
}
2.11
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Optional: Runden von Gleitkommazahlen
Programmfragment
// …
double d1 = 2.333333, d2 = 2.555555;
double result = d1 + d2;
System.out.println(result); // output: 4.888888
/***********************************
* The rounded result.
***********************************/
// Variant 1.
String s = String.valueOf(result);
double rounded = Double.parseDouble(s
.substring(0, s.lastIndexOf('.') + 3));
System.out.println(rounded); // output: 4.88
// Variant 2.
System.out.println(Math.round(result * 100) / 100.0); // 4.89
// Variant 3.
System.out.println(Math.floor(result * 100) / 100.0); // 4.88
2.12
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Übungsaufgaben 2
Auf. 1
Gesucht ist die Summe der Zahlen von 1 bis n mit einer
for-Schleife und mit einer while-Schleife.
for-Schleife
2.13
while-Schleife
int n = 100, summe = 0;
int i = 1, n = 100, summe = 0;
for (int i = 1; i <= n; i++)
summe += i;
while (i <= n) {
summe += i;
i++;
}
System.out.println(summe);
System.out.println(summe);
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Auf. 2 (Ähnliche Aufgabe im ersten Aufgabenblatt)
Berechnen Sie die mathematische Folge mit einer
for-Schleife.
Hinweis: xy = Math.pow(double x, double y)
2.14
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Auf. 2 (Lösung)
Überlegung bzw. Vereinfachung der oberen math. Folge:
1/20 + 1/21 + 1/22 + … + 1/27
=> 7 Schritten, Jeder Schritt erhöht sich mit 1/2n
für n = 0..7
Source
package stuff;
public class Stuff {
public static void main(String[] args) {
double s = 0.0;
for (int n = 0; n <= 7; n++) {
s = s + 1.0 / Math.pow(2, n);
}
System.out.println(s); // summe: 1.9921875
}
}
2.15
Tihomir R. Todorov
Informatik 1 – Tutorium 2
Auf. 3 (Ähnliche Aufgabe WS 04-05)
Das folgende Java Programm enthält Syntaxfehler. Geben Sie jeweils die
Nummer der fehlerhaften Zeile an und begründen Sie, warum ein
Syntaxfehler vorliegt?
0: class SyntaxFehler {
1:
2: int eineZahl = 0;
3:
4: static int EineZahl = 1;
5:
6: void ändereZahlen() {
7:
eineZahl = 2;
8:
EineZahl = 3;
9: }
10:
11: static void zahlenÄndern() {
12:
eineZahl = 4;
13:
EineZahl = 5;
14: }
2.16
Tihomir R. Todorov
15:
16: public static void main(String s[]) {
17:
SyntaxFehler syntaxFehler = new SyntaxFehler()
18:
19:
SyntaxFehler.ändereZahlen();
20:
syntaxFehler.ändereZahl();
21: } // End of main
22: } // End of SyntaxFehler
Informatik 1 – Tutorium 2
Auf. 3 (Lösung)
F1: Umlaute sind in Java nicht erlaubt! Zeile 6, 11, 19 und 20.
F2: ; fehlt am Ende der Anweisung. Zeile 17.
F3: Es gibt keine Methode ändereZahl() in der Klasse SyntaxFehler.
Deshalb kann nicht das Objekt syntaxFehler eine solche Methode
aufrufen. Zeile 20.
F4: Innerhalb ein ‘static Method‘ müssen alle benutzten Variablen als
‘static‘ deklariert werden. Zeile 12.
F5: In Zeile 19 wird versucht eine ‘static‘ Methode aufzurufen.
ändereZahlen( ) ist aber keine Klassenmethode (static Method).
Deshalb kann sie nicht mit dem Name der Klasse aufgerufen werden.
2.17
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Informatik 1
Tutorium 3 – UML
3.1
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Modellieren mit UML 2.0
Diagramme
Aktivitätsdiagramm (Verhaltendiagramme)
Klassendiagramm (Strukturdiagramme)
Objektdiagramm (Strukturdiagramme)
3.2
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm
Aktivitätsdiagramm ist ein wichtiges Diagramm für die Modellierung
der Ablaufmöglichkeiten eines Systems.
beschreibt einen Arbeitsvorgang (workflow) in einem System
verwendet Aktivitäten (actions)
kann Fallunterscheidungen und Parallelität modellieren
Beispielen:
3.3
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Wichtigste Elemente
3.4
Symbol
Name
Semantik
Aufwachen
Aktivität
(eng.: action)
- Aufruf einer Aktion beliebiger
Dauer.
Fluss oder Kante
(eng.: flow, edge)
- Übergang zw. zwei Knoten
(Aktionen).
Entscheidung
(Verzweigung) mit
Bedingungen
(eng.: decision)
- Wird immer eine Bedingung
gewählt.
- Bedingungen müssen sich
gegenseitig ausschließen.
Zusammenführung
(Verbindung)
(eng.: merge)
- Zusammenführung zweier oder
mehrere Flüsse zu einem.
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Verzweigung & Verbindung
Beispiel: Verzweigung
Beispiel: Verbindung
3.5
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Wichtigste Elemente
Symbol
3.6
Name
Semantik
Startknoten
(eng.: initial node)
- Startpunkt einer Aktivität
- UML 2 erlaubt mehrere Startknoten.
D.h. parallele Abläufe möglich.
Endknoten
(eng.: final node)
- Aktivitätsende
- UML 2 erlaubt mehrere Endknoten.
Flussabschluss
(eng.: flow final)
- Ende eines Flusses
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Wichtigste Elemente
Symbol
Name
Semantik
Mausklick
Signal senden
- Aktion, die ein Signal sendet
sendet.
Signal empfangen
- Aktion, die auf ein Signal wartet.
- Können beliebig oft Signale
empfangen
Zeitsignal empfangen
- Aktion, die auf einen Zeitpunkt
wartet.
Mausevent
jede Minute
3.7
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Wichtigste Elemente
Symbol
Name
Semantik
Aufspaltung
(Parallelisierung)
(eng.: fork)
- Aus einem Fluss werden mehrere
nebeneinander laufende Flüsse.
Synchronisation
(eng.: join)
- Synchronisation paralleler Abläufe.
- Wartet bis alle Flüsse eingetroffen
sind.
Sprungmarke
3.8
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Übungsaufgaben 3
Auf. 1
Bevor Klaus das Haus verlässt, zieht er die Schuhe an
und falls draußen kalt ist, zieht er auch den Mantel
an.
Benutzen Sie in Ihrer Lösung ein
fork:
und ein
join
3.9
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
Start
1
3.9
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
2
3.10
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
3
3.11
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
4
3.12
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
5
3.13
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
6
3.14
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
7
3.15
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
8
3.16
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
9
3.17
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Aktivitätsdiagramm: Beispiel fork & join
10
3.18
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Optional: Teilaktivitäten einer Aktivität
3.19
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Auf. 2
Klaus möchte eine Party machen und Gäste einladen.
Erst wählt er einen Zeitpunkt und dann lädt die Gäste ein.
Wenn 50% der Gäste zugesagt haben kauft er dann ein. Falls weniger als
50% zugesagt haben, wählt Klaus einen neuen Zeitpunkt und lädt die
Gäste wieder ein.
Nach dem Einkauf, werden kalte Getränke auf dem Tisch eingestellt und
parallel essen gekocht. Wenn das Essen genießbar ist und die Getränke
auf dem Tisch sind fängt das Feiern ein. Falls das Essen verbrannt ist,
wird es weggeworfen und werden Pizzas bestellt.
Während des Feierns werden die Partygäste gezählt. Wenn 10% oder
mehr noch da sind, werden die Vorräte geprüft. Wenn die Vorräte genug
sind wird weiter gefeiert, sonst bei der Tankstelle nachkaufen und ebenso
weiter feiern.
Falls weniger als 10% da sind wird die Party beendet.
Wenn die Polizei kommt, muss die Party unerwünscht abgebrochen.
Wenn es genug Alkohol gab, fallen die Gäste betrunken ins Bett, sonst
wird die Party einfach beendet.
3.20
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Auf. 2 (Lösung)
3.21
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Auf. 3 (Ähnliche Aufgabe SS 06)
Klaus beginnt seine Arbeit immer mit einer rigorosen Überprüfung seines
Gabelstaplers (G).
Wenn alles in Ordnung ist, dann macht er eine Frühstückspause.
Falls etwas nicht in Ordnung ist, beseitigt er das Problem – die Pause fällt
dann aus.
Bei seiner anschließenden Arbeit holt Klaus immer eine Palette (P) oben
von einem Stapel von Paletten und stapelt die Palette (P) wieder oben auf
einen anderen Stapel.
Dieses wiederholt sich so lange, bis die Sirene den Feierabend einläutet
(die letzte von einem Stapel entnommene Palette stapelt er aber
pflichtbewusst noch auf einen Stapel bevor er geht).
3.22
Tihomir R. Todorov
Informatik 1 – Tutorium 3
Auf. 3 (Beispiel-Lösung)
Sirene
läutet ein
Gabelstapler überprüfen
[Palette entnommen]
[in Ordnung]
[sonst]
Frühstückpause machen
Problem beseitigen
Die Palette oben auf einem
anderen Stapel stapeln
Arbeit
arbeiten
Die obere Palette von
einem Stapel holen
arbeiten
Die Palette oben auf einem
anderen Stapel stapeln
Sirene
läutet ein
3.23
Tihomir R. Todorov
[Palette nicht
entnommen]
Informatik 1 – Tutorium 4
Informatik 1
Tutorium 4 – UML
4.1
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Modellierungswerkzeuge
Borland Together: Version 2008 SP2
Lizenzdatei bei Frau Knobel in Raum LI 140/141
eUML2 for Java
Free Edition als Eclipse-Plugin verfügbar
ArgoUML: UML-Medellierungswerkzeug
frei verfügbar
4.2
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Modellieren mit UML 2.0
Diagramme
Aktivitätsdiagramm (Verhaltendiagramme)
Klassendiagramm (Strukturdiagramme)
Objektdiagramm (Strukturdiagramme)
Paketdiagramm (Strukturdiagramme)
4.3
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Klassendiagramm - Allgemein
Ein Klassendiagramm ist ein Strukturdiagramm der UML
zur grafischen Darstellung (Modellierung) von Klassen,
Schnittstellen sowie deren Beziehungen.
public class List {
// aggregation implementation
private ListElement elements;
// ...
}
4.4
Tihomir R. Todorov
class ListElement {
private Student data;
private ListElement next;
// ...
}
Informatik 1 – Tutorium 4
Klassendiagramm - Klassen
Klassen sind Einheiten aus Attribute, Operationen
(Methoden) und Zusicherungen.
4.5
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Klassendiagramm - Attribute
Attribute sind nur über die Operationen (Methoden) einer
Klasse zugänglich (Idee der Kapselung).
Person
- nachname : String
- vorname : String
- alter : int
+ Person()
+ Person(nachname : String,
vorname : String,
alter : int)
+ getNachname() : String
+ setNachname() : String
+ getVorname() : String
+ setVorname() : String
…
4.6
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Klassendiagramm - Sichtbarkeitsstufen
public, protected, private, package
4.7
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Klassendiagramm - Beziehungen
Assoziation
Eine Linie zwischen den Klassen stellt eine Assoziation dar.
Eine Assoziation ist eine Beziehung zwischen Klassen.
Die Objekte der Klassen kommunizieren über die Assoziationen miteinander.
Die Assoziation kann einen Namen haben.
Ein Pfeil an dem Assoziations-namen gibt die Leserichtung des Namens an.
An den Assoziationsenden können die Rollen der beteiligten Klassen und die
Multiplizität angegeben werden.
Die zweigliedrige Assoziation kann, wie die mehrgliedrige Assoziation,
durch eine Raute markiert werden.
4.8
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Klassendiagramm - Beziehungen
Gerichtete Assoziation
Mit einem Pfeil an der Assoziation kann die Navigationsrichtung
angegeben werden.
Der Pfeil drückt die Zugriffsrichtung der Objekte aus.
Objekt A greift auf B zu, B greift nie auf A zu.
4.9
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Klassendiagramm - Beziehungen
Aggregation
Eine Aggregation drückt eine Teile-Ganzes-Beziehung aus.
Das Ganze-Objekt besteht aus Teil-Objekten.
Die Raute befindet sich an dem Ende des Ganzen.
Die Aggregation ist eine spezielle Art der Assoziation.
Da das Ganze die Teile enthält, sollten am Assoziationsende der Teile ein
Navigationspfeil stehen.
4.10
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Klassendiagramm - Beziehungen
Komposition
Die Komposition ist auch eine Beziehung, die Teile zu einem Ganzen in
Beziehung setzt.
Die Teile und das Ganze sind bei dieser Beziehung existenzabhängig, d.h.
die Teile können nicht ohne das Ganze existieren.
Wird das Ganze gelöscht, so beenden auch die Teile ihre Existenz.
4.11
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Klassendiagramm - Beziehungen
Vererbung
auch Generalisierung/Spezialisierung genannt.
Vererbungsbeziehungen werden mit einem Pfeil dargestellt.
Die Pfeilspitze zeigt auf die Oberklasse.
Die Ober-klasse vererbt ihre Eigenschaften an die Unterklassen.
4.12
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Übungsaufgaben 4
Vorgehensweise:
Objekte identifizieren
Objektbeziehungen identifizieren
Objekten zu Klassen gruppieren
Klassenbeziehungen identifizieren und typisieren
4.13
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Auf. 1 a) Grundbausteine
Ein Dozent hat einen Namen und einen Login-Namen.
Eine Prüfung hat einen Typ und eine Länge (z.B. „Klausur“, „120 Minuten“).
Eine Veranstaltung (z.B. eine Vorlesung) hat einen Namen, wird von genau
Einem Dozenten gehalten und hat eine textuelle Beschreibung des Inhaltes.
Am Ende des Semesters wird das Wissen durch eine Prüfung getestet.
Diese Prüfung muss nicht vorhanden sein, wenn es sich im eine
modulübergreifende Prüfung handelt.
4.14
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Auf. 1 b) Module
Ein Modul hat einen Namen. Es besteht aus mehreren Veranstaltungen und
hat genau einen Dozenten als Verantwortlichen.
Ein Modul kann geprüft werden.
Für manche Module existieren Voraussetzungen, die ein Student erfüllen muss,
damit er Prüfungen aus dem Modul besuchen kann. Eine Voraussetzungen
ist entweder der erfolgreiche Besuch eines anderen Moduls, das abgeschlossene Vorstudium oder eine andere textuelle Beschreibung der Bedingung.
Tipp: Die möglichen Voraussetzungen lassen sich recht einfach als Attribute
einer Klasse umsetzen.
4.15
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Auf. 2
Sie wollen ein einfaches Textdokument im Rechner verwalten.
Das Textdokument besteht aus Zeilen mit einzelnen Komponenten, bei denen
es sich um Wörter, Links oder Bilder handeln kann. Jedes Wort und jeder Link
besteht aus Buchstaben. Ein Link hat zusätzlich noch eine URL.
Es soll beispielsweise möglich sein, eine Zeile anhand ihrer Nummer zu
identifizieren und ein Textdokument anhand ihrem Dateiname.
Ein Bild hat einen Name, eine Höhe und eine Breite.
Erstellen Sie ein Klassendiagramm, das die aus Ihrer Sicht benötigten Klassen
beinhaltet. Entwerfen Sie Ihre Klassenhierachie so, dass Sie später noch
weitere Komponenten in die Zeilen einfügen können, ohne die Klasse für die
Zeile verändern zu müssen.
4.16
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Auf. 2 (Lösung)
4.17
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Auf. 3 a) (SS08)
Geben Sie für folgenden Sachverhalt ein vollständiges UML-Klassendiagramm an. Beachten Sie dabei die Java-Namenskonventionen aus der
Vorlesung und das Geheimnisprinzip. Getter- und Settermethoden brauchen
Sie nicht angeben.
Das Lager besteht aus mehreren Regalen und Förderbändern. Ein Förderband hat eine maximale Geschwindigkeit, mit der es betrieben wird, und eine
Länge. Ein Förderband ist mit keinem oder mehreren anderen Förderbändern
verbunden. Jedes Förderband kann man vorwärts oder rückwärts laufen
lassen. Das Band kann auch gestoppt werden.
Jedes Regal besteht aus vielen Fächern. Ein Regal ist immer mit mehreren
Förderbändern verbunden. Es gibt auch Regale ohne ein Förderband. Im
Regal befinden sich die Produkte. Die Regale sind automatisiert und können
jeweils ein Produkt von einem Fach vom Förderband entnehmen oder darauf
legen.
4.18
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Auf. 3 a) (SS08 - Lösung)
4.19
Tihomir R. Todorov
Informatik 1 – Tutorium 4
Auf. 3 b) (SS08)
Geben Sie für Ihre drei wichtigsten Klassen jeweils einen kurzen und
Spezifischen Java-Doc Klassenkommentar an.
Auf. 3 b) (SS08-Lösung)
/**
* Ein Foerderband mit einer maximalen Geschwindigkeit in km/h und einer Laenge in Metern.
* Ein Forderband ist mit beliebig vielen anderen Foerderbaendern verbunden.
* @author toti0011
*/
/**
* Ein Regal, mit dem Produkte zwischen seinen Faechern und Foerderbaendern ausgetauscht
* werden.
* @author toti0011
*/
/**
* Ein Produkt, das in einem Regal liegt.
* @author toti0011
*/
4.20
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Informatik 1
Tutorium 5
5.1
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Testen mit JUnit
Javadoc Kommentaren bzw. Javadoc Tags
Klassendiagramme
Implementierung einer Klassendiagramm
5.2
Tihomir R. Todorov
Informatik 1 – Tutorium 5
JUnit - Allgemein
JUnit ist ein Open Source-Tool bzw. ein Framework.
JUnit wird zum Schreiben und Ausführen automatischer Unit Test
benutzt.
Die Tests werden in Java programmiert.
UML - Paketdiagramm
junit.framewort
my.package
UML - Klassendiagramm
TestCase
Class1
...
Clasen
public class Class1 extends TestCase {
}
5.3
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Assert.class
Die Klasse liegt im “junit.framework“-Paket.
Enthält wichtige Methode um die Ergebnisse zu überprüfen.
static public void assertEquals(String, String)
static public void assertEquals(int, int)
static public void assertEquals(double, double)
…
static public void assertFalse(boolean)
static public void assertTrue(boolean)
…
5.4
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Javadoc Kommentaren
Möglichst kurz.
Aussagekräftig.
Innerhalb eines Javadoc-Kommentars können wir auch HTML-Tags
Benutzen.
/**
* This is a Java comment for the class Stuff.
*
* <ul>
* <li>Item 1</li>
* <li>Item 2</li>
* </ul>
*
* @author toti0011
*/
public class Stuff {
}
5.5
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Javadoc Tags für Klassen
Tag
5.6
Ausgabe
Verwendung in
Seit
@author name
Beschreibt den Autor.
Klasse, Interface
1.4.0
@version version
Erzeugt einen
Versionseintrag. Maximal
einmal pro Klasse oder
Interface.
Klasse, Interface
1.4.0
@since jdk-version
Seit wann die Funktionalität
existiert.
Klasse, Interface,
Instanzvariable,
Methode
1.4.0
@see reference
Erzeugt einen Link auf ein
anderes Element der
Dokumentation.
Klasse, Interface,
Instanzvariable,
Methode
1.4.0
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Javadoc Tags für Methoden
Tag
5.7
Ausgabe
Verwendung in
Seit
@param name
description
Parameterbeschreibung
einer Methode.
Methode
1.4.0
@return description
Beschreibung des
Returnwerts einer
Methode.
Methode
1.4.0
@exception
classname description
@throws classname
description
Beschreibung einer
Exception, die von
dieser Methode
geworfen werden kann.
Methode
1.4.0
@deprecated
description
Beschreibt eine veraltete Methode
Methode, die nicht mehr
verwendet werden sollte.
1.4.0
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Beispiel Javadoc Kommentaren und Javadoc Tags
/**
* Ein Hello-World-Programm in Java.
* Dies ist ein Javadoc-Kommentar.
*
* @author John Doe
* @version 1.0
*/
public class Hello {
/**
* Hauptprogramm.
*
* @param args Kommandozeilenparameter
*/
public static void main(String[ ] args) {
System.out.println("Hallo, Welt!");
}
}
5.8
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Übungsaufgaben 5
Auf. 1 a) (Entwurf)
Rationale Zahlen sind Zahlen die sich als Bruch p / q einer ganzen Zahl p
und einer natürlichen Zahl q darstellen lassen (mit q != 0).
Entwerfen und implementieren Sie eine Klasse RationaleZahl deren Objekte
rationale Zahlen repräsentieren, die sich addieren und multiplizieren lassen.
Zähler und Nenner der vollständig gekürzten rationalen Zahl sollen
zurückgegeben werden können. Ebenso soll der double-Wert der Zahl
zurückgegeben werden können.
Einen Bruch können Sie vollständig kürzen, in dem Sie Zähler und Nenner
durch den größten gemeinsamen Teiler des Zählers und Nenners dividieren.
Achten Sie darauf, dass die Null eine eindeutige Darstellung hat. Ebenso
darf nicht durch Null geteilt werden.
Die Klasse sollte einen Konstruktor enthalten, der Zähler und Nenner als
int-Werte übergeben bekommt.
5.9
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Auf. 1 a) (Entwurf - Lösung)
Assert
RationaleZahl
- p : int
- q : int {q != 0}
TestCase
+ RationaleZahl (p : int, q : int)
+ addieren(r : RationaleZahl) : RationaleZahl
+ multiplizieren(r : RationaleZahl) : RationaleZahl
- kuerzen() : void
RationaleZahlTest
* + getDouble() : double
+ getZaehler() : int
+ setNenner() : int
Die Menge aller natürlichen Zahlen
IN = {0, 1, 2, …}
Die Menge aller ganzen Zahlen
Z = {-1, -2, 0, 1, 2, …}
Die Menge aller reellen (rationalen) Zahlen
IR = {p/q | p є Z, q є Z, q != 0}
5.10
Addition zwei rationalen Zahlen
Multiplikation zwei rationalen Zahlen
z1 + z2 = 4/6 + 9/12 = 8/12 + 9/12 = 17/12
z1 * z2 = 4/6 * 9/12 = 2/3 * 3/4 = 1/2
Tihomir R. Todorov
*
Main
Informatik 1 – Tutorium 5
Auf. 1 b) (Implementierung - Lösung)
Sehen Sie das Java-Projekt mit Eclipse auf die
Online-Seite.
5.11
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Auf. 1 c) (JUnit Klasse - Lösung)
Sehen Sie das Java-Projekt mit Eclipse auf die
Online-Seite.
5.12
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Auf. 1 d) (Javadoc Kommentaren und Javadoc Tags)
Dokumentieren Sie ihre Konstruktoren sowie ihre Methoden
Erstehlen Sie mit Hilfe von ‘javadoc.exe‘ eine Java – Dokumentation
ihres Projekts.
5.13
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Informatik 1
Tutorium 6
6.1
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Allgemein
Deklaration
<Datentyp>[ ] <Variablenbezeichner>;
<Datentyp> <Variablenbezeichner>[ ];
// Deklaration eines eindimensionalen Feldes
// Alternative Deklaration (seltener verwendet)
<Datentyp>[ ][ ] <Variablenbezeichner>; // Deklaration eines zweidimensionalen Feldes
<Datentyp> <Variablenbezeichner>[ ][ ]; // Alternative Deklaration (seltener verwendet)
Instanzierung
// Instanzierung eines eindimensionalen Feldes
<Variablenbezeichner> = new <Datentyp>[<Anzahl>];
// Instanzierung eines zweidimensionalen Feldes
<Variablenbezeichner> = new <Datentyp>[<Anzahl>] [<Anzahl>];
6.2
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Allgemein
Beispiel eines eindimensionalen Feldes des Typs int der Länge 10
int[ ] feld;
// Deklaration
feld = new int [10];
// Instanzierung (Erzeugung mit new)
int[ ] feld_2 = new int [10]; // Deklaration + Instanzierung
// Deklaration + Instanzierung + Initialisierung
int[ ] feld = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Beispiel eines eindimensionalen Feldes des Typs String der Länge 3
String[ ] zahlen = {
“eins“,
“zwei“,
“drei“
};
6.3
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Allgemein
Beispiel eines zweidimensionalen Feldes des Typs int
int[ ][ ] matrix;
matrix = new int [2] [2];
int[ ][ ] matrix = new int [2] [2];
// Deklaration
// Instanzierung (Erzeugung mit new)
// Deklaration + Instanzierung
// Deklaration + Instanzierung + Initialisierung
int[ ][ ] matrix = {
{1, 0},
{0, 1}
};
6.4
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Indizierung
In Java (auch in C/C++) beginnen die Indizes stets mit 0!
Bei jedem Feldzugriff haben wir immer eine Indexüberprüfung.
int laenge = feld.length; // length: liest die Länge eines Feldes aus. Ergebnis 10.
int x = feld[laenge];
|
|-> führt zu einer ArrayIndexOutOfBoundsException
6.5
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Allgemein
Auslesen von Werten
int a = feld[0];
int b = feld[3];
// Das Auslesen erfolgt durch Angabe des Index.
Zuweisung von Werten
feld[0] = 5;
feld[1] = (int) 2.7;
feld[9] = 0;
// Java ist “nullbasiert“.
// Bei Zuweisungen muss wie bei normalen
// Variablen der Typ angepasst werden.
// Die Indexierung läuft immer bis n-1!
Länge eines Feldes
int len = feld.length; // Liest die Länge des Feldes aus und speichert
// sie in der Variablen len
6.6
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Beispiel
Was wird ausgegeben?
public class Stuff {
public static void main(String[ ] args) {
int[ ][ ] a = {
{ 0 },
{ 1, 2 },
{ 3, 4, 5 },
{ 6, 7, 8, 9 }
};
for (int i = 0; i < a.length; ++i) {
for (int j = 0; j < a[i].length; ++j) {
System.out.print(a[i][j]);
}
System.out.println();
}
}
}
6.7
Tihomir R. Todorov
0136
247
58
9
0
12
345
6789
Informatik 1 – Tutorium 6
Felder - Heap
6.8
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Beispiel
public class Stuff {
public static void main(String[ ] args) {
int[ ][ ] a = new int[2][3];
a[0][0] = 1;
int[ ][ ] a;
a[0][1] = 2;
a= new int[2][ ];
a[0][2] = 3;
a[0]= new int[3];
a[1][0] = 4;
a[1]= new int[3];
a[1][1] = 5;
a[1][2] = 6;
System.out.println("" + a[0][0] + a[0][1] + a[0][2]);
System.out.println("" + a[1][0] + a[1][1] + a[1][2]);
}
}
6.9
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Heap
int[ ] a = new int[3];
// a verweist jetzt auf ein Feld aus 3 int-Werte.
// Die int-Werte sind als 0 initialisiert.
a
0 0 0
a[0] = 2; // Weist dem 1. El. den Wert 2 zu.
a
2 0 0
a[2] = 7; // Weist dem 3. El. den Wert 7 zu.
a
2 0 7
long[ ] b = new long[3];
// Erzeugung eines neuen Feld b aus 3 long-Werte.
a = b; // Compiler-Fehler!. Unzulässig!
// Typ von a != Typ von b
a
2 0 7
b
0 0 0
a = {1, 2, 3, 4};
a
2 0 7
b
0 0 0
Müll
1 2 3 4
6.10
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Felder - Heap
int[ ] c = a;
b
0 0 0
a
1 2 3 4
c
a = {2, 0, 7};
6.11
Tihomir R. Todorov
b
0 0 0
c
1 2 3 4
a
2 0 7
Informatik 1 – Tutorium 6
Felder – Heap – Unterschied zw. Referenz und Kopie
Verweis/Referenz
a
1 2 3 4
int[ ] a = { 1, 2, 3, 4 };
int[ ] c = a;
Kopie/Klone
int[ ] a = { 1, 2, 3, 4 };
int[ ] c; // c soll die Kopie referenzieren
c = new int[a.length];
for (int i = 0; i < a.length; i++)
c[i] = a[i];
6.12
Tihomir R. Todorov
c
a
1 2 3 4
c
1 2 3 4
Informatik 1 – Tutorium 6
Übungsaufgaben 6
Auf. 1 - Kleinsten Abstand 2-er benachbarter Zahlen
Implementieren Sie eine Java-Methode, die für ein int-Feld den kleinsten
Abstand zweier benachbarter Zahlen berechnet und den Index der ersten
Zahl zurückgibt (vom ersten Vorkommen, falls es mehrere benachbarte
Zahlen mit gleichem Abstand gibt).
Hinweis: Verwenden Sie Math.abs() zum Berechnen des Betrags einer
Zahl.
Test Fall:
1, -11, 5, 15, -7, 8, 13, 18, 5
6.13
Tihomir R. Todorov
Informatik 1 – Tutorium 6
Auf. 2 - Überprüfen eines Anagrams
Ein Anagram ist ein Satz, der durch Umstellen aller Buchstaben eines
anderen Satzes gebildet werden kann. Gross- und Kleinschreibung wird
dabei ignoriert. Ebenso spielen Leerzeichen keine Rolle. Aus dem Wort
"Todesstrafe" lässt sich zum Beispiel der Satz "oft Desaster" bilden.
Schreiben Sie ein Java-Programm, mit dem zwei Zeichenketten daraufhin
überprüft werden können, ob sie ein Anagram bilden.
Hinweise:
Bei Objekten s vom Typ String, können Sie mit s.toLowerCase() den String
s in eine neuen String umwandeln, bei dem alle Gross- durch
Kleinbuchstaben ersetzt wurden. s.toCharArray() gibt ein char-Feld zurück
mit allen Zeichen von s.
Test Fälle
Todesstrafe = oft Desaster
Desperation = A Rope Ends Is
Volkswagen = Gase von LKW
Rentenreform = ferner Mentar
Sonnenaufgang = Anfang Neun Sog
6.13
Tihomir R. Todorov
Informatik 1 – Tutorium 5
Auf. 3 – Bubblesort (SS 05)
7
4
4
4
1
1
1
6.14
4
7
6
1
4
2
2
9
6
1
6
2
4
3
Tihomir R. Todorov
6
1
7
2
4
3
4
1
7
2
4
3
4
4
7
2
4
3
6
6
6
2
4
3
7
7
7
7
4
3
7
7
7
7
7
3
9
9
9
9
9
9
Informatik 1 – Tutorium 7
Informatik 1
Tutorium 7
7.1
Tihomir R. Todorov
Informatik 1 – Tutorium 7
Rekursion - Allgemein
Viele Lösungen sind mit Rekursion einfacher zu verstehen
und einfacher zu programmieren (z.B. Suchen in einem Baum)
0
a
1
7
b
2
h
8
4
c
3
d
5
f
7.2
6
g
j
i
9
e
Tihomir R. Todorov
k
l
m
Informatik 1 – Tutorium 7
Rekursion verstehen an einem einfachen Beispiel
Bsp.: Gesucht ist die Summe der Zahlen von 1 .. N <=> N .. 1
Als Rekursion bezeichnet man in Informatik eine Funktion,
die sich selbst aufruft.
return 3
Annahme: N = 3
public int sum(long n) {
if (n == 0) {
return 0;
} else {
return sum(n-1) + n;
}
public int sum(long n) {
}
if (n == 0) {
return 0;
} else {
return sum(n-1) + n;
}
public int sum(long n) {
}
if (n == 0) {
return 0;
} else {
return sum(n-1) + n;
}
}
sum(3)
sum(2)
sum(1)
sum(0)
return 1
return 6
...
7.3
Tihomir R. Todorov
return 0
Tiefe: 3
Informatik 1 – Tutorium 7
Rekursion verstehen an einem einfachen Beispiel
public int getFakultaet(int n) {
if (n == 0) { return 1; // Rekursionsabbruch }
else { return getFakultaet(n - 1) * n; }
}
int n = 4
int fac = obj.getFakultaet(n)
getFakultaet(n) // n = 2
getFakultaet(n) // n = 1
obj.getFakultaet(n) // n = 4
if (n != 0) then
return getFakultaet(n-1) * n;
getFakultaet(n) // n = 3
getFakultaet(n) // n = 2
getFakultaet(n) // n = 4
getFakultaet(n) // n = 3
if (n != 0) then
return getFakultaet(n-1) * n
// return 1 * 1
3
2
getFakultaet(n) // n = 1
fac = 1
getFakultaet(n) // n = 0
getFakultaet(n) // n = 3
getFakultaet(n) // n = 2
if (n == 0) then
return 1;
4
3
2
1
0
fac = 1
7.4
Tihomir R. Todorov
if (n != 0) then
return getFakultaet(n-1) * n
// return 1 * 2
2
1
fac = 2
if (n != 0) then
return getFakultaet(n-1) * n
// return 2 * 3
1
0
fac = 6
getFakultaet(n) // n = 4
if (n != 0) then
return getFakultaet(n-1) * n
// return 6 * 4
0
fac = 24
Informatik 1 – Tutorium 7
Arten von Rekursion
Lineare Rekursion
Jeder Aufruf löst maximal
einen rekursiven Aufruf
Verzweigende Rekursion
Jeder Aufruf kann mehr als
einen rekursiven Aufruf auflösen
Verschachtelte Rekursion
Parameter eines rekursiven Aufrufs
sind selbst wieder rekursive Aufrufe
7.5
Tihomir R. Todorov
public int sum(long n) {
// …
return sum(n-1) + n;
}
public int sum(long n) {
// …
return sum(n-1) + sum(n-1);
}
public int sum(long n) {
// …
return sum(sum(n-1));
}
Informatik 1 – Tutorium 7
Übungsaufgaben 7
Auf. 1 (SS05)
Gegen sei folgende rekursiv definierte Funktion:
Auf. 1 a) (SS05)
Implementieren Sie eine rekursive Java Methode, die obige Funktion nach
dem gegebenen rekursiven Schema berechnet, ohne irgendwelche
Berechnungen zwischenzuspeichern und ohne weitere Vereinfachungen.
Lsg:
7.6
public int getF(int n) {
if (n == 1) { return 1;}
else { return f(n-1) * f(n-1); }
}
Tihomir R. Todorov
Informatik 1 – Tutorium 7
Auf. 1 b) (SS05)
Um welchen Typ von Rekursion handelt es sich?
Lsg.: Verzweigende Rekursion.
Auf. 1 c) (SS05)
Geben Sie die ersten fünf rekursiven Aufrufe für n=3 als Aufrufbaum mit
Wurzel f(3) an sowie den Zustand des Laufzeitkellers, wenn der letzte
Aufruf noch nicht mit return beendet wurde. Der erste (nicht rekursive)
Aufruf der Methode zählt mit zu den fünf Aufrufen dazu.
7.7
Tihomir R. Todorov
Informatik 1 – Tutorium 7
Auf. 2 (WS0405)
Implementieren Sie eine rekursive Methode, die den Inhalt eines Feldes mit
Feldtyp int umdreht. Zum Beispiel soll folgendes Feld der Länge 4
2
7
5
11
nach Aufruf der Methode folgenden Inhalt haben
11 5
7
2
Der Gesamtzeitaufwand ihrer Methode darf im schlimmsten Fall O(n) nicht
überschreiten, wobei n die Länge des Feldes ist, dessen Inhalt umgedreht
wird. Für die Implementierung dürfen keine for- oder while-Schleifen
verwendet werden. Beachten Sie bei Ihrer Implementierung die in der
Vorlesung vorgestellten Java-Namenskonventionen.
7.8
Tihomir R. Todorov
Informatik 1 – Tutorium 7
Auf. 2 – Lsg. (WS0405)
public static void umdrehen(int a[]) {
umdrehen(a, 0, a.length-1);
}
private static void umdrehen(int a[], int l, int r) {
if (l<r) {
int tmp = a[l];
a[l] = a[r];
a[r] = tmp;
umdrehen(a, l+1, r-1);
}
}
Obige Hilfsfunktion (ohne die Parameter l und r) muss nicht
notwendigerweise existieren. Static oder nicht spielt keine Rolle.
7.9
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Informatik 1
Tutorium 8
8.1
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Backtracking - Allgemein
Durch systematisches Ausprobieren aller Möglichkeiten finden.
Aufgabe: Suche eines bestimmten Wegs
1) Beginne mit Punkt 1 (alle mögl. Wege von diesem Punkt ausprobieren)
2) Überprüfe, ob einen Weg gibt, falls ja: in diese Richtung gehen.
3) Ziel gefunden?
- Falls ja: fertig
- Falls nein: ein Stück weiter-/zurückgehen und rekursiv mit 1)
Punkt 1.1
8.2
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Übungsaufgaben 8
Auf. 1 Vier-Farben-Problem
Rot
Grün
Blau
Gelb
8.3
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.4
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.5
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.6
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.7
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.8
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.9
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.10
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.11
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.12
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.13
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Visuelle Darstellung des Problems
Problem:
Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen,
dass benachbarte Länder verschiedene Farben haben.
8.14
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Geschichte
Vermutung (Francis Guthrie, 1852):
4 Farben reichen immer aus.
Das Problem wurde aber erstmals
1976 bewiesen.
Francis Guthrie
22.01.1831, London - 19.10.1899, Claremont
war ein südafrikanischer
Mathematiker und Botaniker.
8.15
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Auf. 1 Vier-Farben-Problem (Vereinfachung)
Problem: Vier-Farben-Problem
Gegeben: Eine Landkarte mit Regionen
Gesucht: Eine Färbung der Region mit vier Farben
0
1
3
2
#
0
1
2
3
0
0
1
1
1
1
1
0
1
1
2
1
1
0
1
Adjazenzmatrix
8.16
Tihomir R. Todorov
3
1
1
1
0
Informatik 1 – Tutorium 8
Auf. 1 Vier-Farben-Problem (Klassendiagramm)
VierFarbenProblem
- farben: int[]
- karte: int[][]
+ VierFarbenProblem(farben: int[], karte: int[][])
+ faerben() : boolean
- nachbarHatGleicheFarbe(land:int, farbe:int):boolean
#
0
1
2
3
0
0
0
0
0
1
1
0
0
0
2
1
1
0
0
Adjazenzmatrix
8.17
Tihomir R. Todorov
3
1
1
1
0
Informatik 1 – Tutorium 8
Auf. 1 Vier-Farben-Problem (Pseudocode)
public boolean faerben(int land) {
for (int farbe = 1; farbe <= 4; farbe++) {
if (!nachbarHatGleicheFarbe(land, farbe)) {
this.farben[land] = farbe;
if (land < karte.length - 1) {
if (faerben(land + 1)) {
return true;
} else {
this.farben[land] = 0;
}
} else {
return true;
}
}
}
return false;
}
private boolean nachbarHatGleicheFarbe(int land, int farbe) {
return false;
}
8.18
Tihomir R. Todorov
Informatik 1 – Tutorium 8
Auf. 1 Vier-Farben-Problem (Pseudocode)
private boolean nachbarHatGleicheFarbe(int land, int farbe) {
for (int nachbar = 0; nachbar < farben.length; nachbar++) {
if (nachbar != land &&
farben[nachbar] == farbe &&
(karte[land][nachbar] == 1 || karte[nachbar][land] == 1)) {
return true;
}
}
return false;
}
8.19
Tihomir R. Todorov
Informatik 1 – Tutorium 9
Informatik 1
Tutorium 9
9.1
Tihomir R. Todorov
Informatik 1 – Tutorium 9
9.2
Tihomir R. Todorov
Informatik 1 – Tutorium 9
9.3
Tihomir R. Todorov
Herunterladen