• Keine Ergebnisse gefunden

Übungsstunde 8

N/A
N/A
Protected

Academic year: 2022

Aktie "Übungsstunde 8"

Copied!
30
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Übungsstunde 8

Einführung in die Programmierung

(2)

Probleme bei Übung 6

[TODO Assistent]

(3)

Nachbesprechung Übung 7

(4)

Aufgabe 1: Doubly-linked List

LinkedPersonList first:

last : size : 3

PersonNode next : prev : person:

PersonNode next : prev : person:

PersonNode next : prev : person:

Person ...

Person ...

Person ...

× ×

(5)

Aufgabe 2: Split (Bonus!)

Feedback nach der Korrektur direkt per Git

Lösungsvorschlag von Studenten

(6)

<yz> <= Y | ZZZ

<xyz> <= { X <xyz> <yz> | <yz> <xyz> X }

Aufgabe 3: EBNF Wiederholung

(7)

<abc> <= A {CC} { XY {CC} | XZ | A {CC} | B {CC} } B

(8)

Aufgabe 4: Rekursion

(9)

(x,y) (nx,ny)

// 1. Zeichnen des aktuellen Segments

double nx = x + Math.cos(angle) * length;

double ny = y - Math.sin(angle) * length;

win.setStrokeWidth(length / 20);

win.setColor(0, 0, 0);

win.drawLine(x, y, nx, ny);

Aufgabe 4: Rekursion

(10)

// Falls l < 10 endet die Rekursion und // am Ende des Segments wird ein Blatt // gemalt.

if (length < 10.0) {

win.setColor(0, 180, 0);

win.fillCircle(nx, ny, 3);

}

// Jede Rekursion muss einen Ausgang // haben!

Aufgabe 4: Rekursion

Recursion exits

(11)

(x,y) (nx’,ny’)

(nx’’,ny’’)

drawTree(win, nx, ny, length * 0.8,

angle + Math.PI / 5);

drawTree(win, nx, ny, length * 0.6,

angle - Math.PI / 3);

Aufgabe 4: Rekursion

(12)

//recursive method

public static void drawTree(Window win, double x, double y, double length, double angle) { double nx = x + Math.cos(angle) * length;

double ny = y - Math.sin(angle) * length;

win.setStrokeWidth(length / 20);

win.setColor(0, 0, 0);

win.drawLine(x, y, nx, ny);

if (length < 10.0) {

win.setColor(0, 180, 0);

win.fillCircle(nx, ny, 3);

} else {

drawTree(win, nx, ny, length * 0.8, angle + Math.PI / 5);

drawTree(win, nx, ny, length * 0.6, angle - Math.PI / 3);

} }

Aufgabe 4: Rekursion

(13)

Vorbesprechung Übung 8

(14)

Aufgabe 1: Enthalten mit Abstand (Bonus!)

Gegeben: String s, String t, Integer k (wobei k >= 0)

Ziel: Man muss entscheiden, ob

● die Zeichen in t in beliebiger Reihenfolge als Subsequenz in s vorkommen und zusätzlich für diese Subsequenz gilt, dass

● der maximale Abstand in s zwischen zwei aufeinanderfolgen Zeichen in der Subsequenz höchstens k ist

○ Abstand zwischen zwei Zeichen in s ist definiert als: Anzahl Zeichen zwischen den zwei Zeichen

Falls diese Bedingung gilt, dann sollte man “true” und sonst “false” zurückgeben.

(15)

Aufgabe 1: Enthalten mit Abstand (Bonus!)

Beispiel 1: s = “abbc”, t = “cab”, k = 1

a b b c

Abstand 1 Abstand 0

Programm sollte “true” zurückgeben, weil “abc” in s als Subsequenz mit Abstand maximal 1 vorkommt.

(16)

Aufgabe 1: Enthalten mit Abstand (Bonus!)

Beispiel 2: s = “abbbc”, t = “cab”, k = 1

Abstand 1 Abstand 1

a b b b c

Bemerkung: “abc” kann auf mehrere Arten als Subsequenz vorkommen. Es genügt, wenn eine der Arten die Bedingungen erfüllt (wie die Subsequenz oben).

Programm sollte “true” zurückgeben, weil “abc” in s als Subsequenz mit Abstand maximal 1 vorkommt.

(17)

Aufgabe 1: Enthalten mit Abstand (Bonus!)

Beispiel 3: s = “abbbbc”, t = “cab”, k = 1

Beispiel 4: s = “abc”, t = “cbab”, k = 1

Programm sollte “false” zurückgeben, weil in jeder Subsequenz in s mit Zeichen “c”, “a”, “b” der Abstand zwischen dem “a” und dem “b” oder dem “b” und dem “c” grösser ist wie 1.

Programm sollte “false” zurückgeben, weil es keine Subsequenz in s gibt, welche zwei “b” enthält.

(18)

Aufgabe 2: Teilfolgen

(19)

Beispiele

● S = abcd, j = 3

abc abd bcd acd

● S = abcd, j = 5

● S = abcd, j = 0

leerer String ("")

● S = accb, j = 2

ac ac ab cc cb cb

19

(20)

Rekursion: Teilprobleme identifizieren

S = ”apple”

N = 3

S = ”pple”

N = 2

S = ”pple”

N = 3

prefix=”

a”

prefix=””

S = ”ple”

N = 1

prefix=”ap”

S = ”ple”

N = 2

prefix=”

a”

S = ”ple”

N = 2

prefix=”p”

S = ”ple”

N = 3

prefix=””

(21)

Rekursionsende

Wann haben wir eine Teilfolge gefunden?

→ Wenn ‘prefix’ die richtige Länge hat (oder N=0 ist).

Wie könnte eine rekursive Lösung aussehen?

(22)

subSequences(prefix, S, N) { if (N == 0) {

// ‘prefix’ ist eine Teilfolge!

print prefix;

} else if (S is not empty) {

rest = S ohne erstes Zeichen;

// Reduziertes Teilproblem im Rest von S lösen:

subSequences(prefix + S[0], rest, N - 1);

// Gleiches Problem im Rest von S lösen:

subSequences(prefix, rest, N);

} }

22

Teilfolgen: Pseudocode

(23)
(24)

Kasse

Kasse

Kasse

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

(25)

Aufgabe 4: Dominator

Schreiben Sie Junit-Tests für die Methode int[] dominators( int[] elevations)

Die Methode bekommt ein Array, mit Höhenangaben für jeden Punkt P, als Input und gibt ein Array mit dem Index des jeweiligen Dominators zurück.

Ein Dominator D eines Punktes P hat von allen Punkten, welche höher als P liegen, die kleinste

(horizontale) Distanz zu P. Falls zwei solche Punkte existieren, ist der höhere der beiden der einzige

Dominator. Falls beide dieser Punkte gleich hoch sind, gibt es zwei mögliche Dominatoren. Falls kein

Dominator für P existiert, enthält result[P] die Zahl -1.

(26)

Aufgabe 4: Dominator

result = {3, 0, 3, 5, 5, -1, 5, -1}

oder

result = {3, 0, 3, 5, 5, -1, 7, -1}

(27)

Aufgabe 4: Dominator

Weiteres Beispiel:

elevations = {5, 1, 5, 6}

result = {3, 0, 3, -1}

result = {3, 2, 3, -1}

(28)

Aufgabe 4: Dominator

Um die Stärke Ihrer Tests zu beurteilen, werden verschiedene, teilweise fehlerhafte

Implementierungen mithilfe Ihrer Tests überprüft. Je mehr Fehler Ihre Tests aufdecken, desto besser.

Tests sollten fehlschlagen, falls die Implementierung fehlerhaft ist, und erfolgreich durchlaufen, falls keine Fehler vorhanden sind.

Als Hilfe können Sie sich die Lösung der Aufgabe ”Black-Box Testing” aus der letzten Serie

anschauen.

(29)

Aufgabe 5: Self-avoiding Random Walks

Die Stadt besteht aus 2*N Strassen, die in einem regelmässigen Gitter angeordnet sind (N ist ungerade und > 1.). Die Stadt kann also vollständig durch die N*N Kreuzungen der Strassen beschrieben werden.

Eine einmal besuchte Kreuzung wird nicht nochmal besucht. Der Wolf wählt zufällig unter

den Richtungen, die ihn zu einer neuen, noch nicht besuchten Kreuzung führen. Wenn der

Wolf den Stadtrand erreicht hat, ist die Flucht erfolgreich verlaufen. Wenn der Wolf an

eine Kreuzung kommt, von der aus er keine unbesuchte Kreuzung erreichen kann, dann ist

die Flucht fehlgeschlagen.

(30)

Aufgabe 5: Self-avoiding Random Walks

Referenzen

ÄHNLICHE DOKUMENTE

Beispiel für ein System mit veränderlicher Masse: Wachstum eines Wassertrop- fens.. Ein kugelförmiger Wassertropfen falle in einer gesättigten Wasserdampfatmosphäre nach

Beispiel für ein System mit veränderlicher Masse: Wachstum eines Wassertrop- fens.. Ein kugelförmiger Wassertropfen falle in einer gesättigten Wasserdampfatmosphäre

Weitere Fragen zu Eclipse oder

Tests sollten fehlschlagen, falls die Implementierung fehlerhaft ist, und erfolgreich durchlaufen, falls keine Fehler vorhanden sind. Als Hilfe können Sie sich die Lösung der

8.1 Anzeige der Attribute KNR und KName der Relation KURS sowie der zum Kurs zugehörigen Attribute DName und Mail der Relation DOZENT für alle Kurse.. 8.2 Anzeige aller Attribute

• Nur dann, wenn die Punkte für eine Aufgabe nicht differenziert vorgegeben sind, ist ihre Aufschlüsselung auf die einzelnen Lö- sungsschritte Ihnen überlassen. • Stoßen Sie

• Nur dann, wenn die Punkte für eine Aufgabe nicht differenziert vorgegeben sind, ist ihre Aufschlüsselung auf die ein- zelnen Lösungsschritte Ihnen überlassen.. • Stoßen Sie

er drückt sie deckt zu sie packt aus er schluckt es schmeckt er ist unglücklich sie erschrickt sie entdeckt er steckt sie frühstückt er nickt ein sie streckt sich