• Keine Ergebnisse gefunden

Übungsstunde 7

N/A
N/A
Protected

Academic year: 2022

Aktie "Übungsstunde 7"

Copied!
33
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Übungsstunde 7

Einführung in die Programmierung

(2)

Probleme bei Übung 5

[TODO Assistent]

(3)

Nachbesprechung Übung 6

(4)

Feedback nach der Korrektur direkt per Git

Lösungsvorschlag von Studenten

Aufgabe 1: Talsohlen (Bonus!)

(5)
(6)

Person(int alter, double gewicht,

double groesse, boolean istMaennlich,

double schulterBreite, double brustTiefe, double brustBreite) {

this.alter = alter;

this.gewicht = gewicht;

this.groesse = groesse;

this.istMaennlich = istMaennlich;

this.schulterBreite = schulterBreite;

this.brustTiefe = brustTiefe;

this.brustBreite = brustBreite;

} public class Person {

int alter; // Jahre double gewicht; // kg double groesse; // cm boolean istMaennlich;

double schulterBreite; // cm double brustTiefe; // cm double brustBreite; // cm

String beschreibung() {

}

double bodyMassIndex() {

return 10000 * gewicht / (groesse * groesse);

}

‘this.alter’ um Konflikt mit Parameter ‘alter’ zu vermeiden

(7)

static Person[] liesPersonen(Scanner scanner) {

Person[] personen = new Person[scanner.nextInt()];

for (int i = 0; i < personen.length; i++) personen[i] = liesPerson(scanner);

return personen;

}

static Person liesPerson(Scanner scanner) {

double schulterBreite = scanner.nextDouble();

double brustTiefe = scanner.nextDouble();

double brustBreite = scanner.nextDouble();

int alter = scanner.nextInt();

double gewicht = scanner.nextDouble();

double groesse = scanner.nextDouble();

boolean istMaennlich = scanner.nextInt() == 1;

return new Person(....);

}

in main()-Methode

Scanner scanner = new Scanner(

new File("body.dat.txt"));

Person[] personen = liesPersonen(scanner);

scanner.close();

(8)

static void druckeUngesunde(Person[] personen, PrintStream ausgabe) { for (int i = 0; i < personen.length; i++) {

Person person = personen[i];

String klasse = gewichtsKlasse(person);

if (!klasse.equals("normalgewichtig"))

ausgabe.println(person.beschreibung() + " ist " + klasse);

} }

static String gewichtsKlasse(Person person) { if (person.bodyMassIndex() >= 30)

return "fettleibig";

if (person.bodyMassIndex() >= 25) return "übergewichtig";

if (person.bodyMassIndex() < 18.5) return "untergewichtig";

return "normalgewichtig";

}

(9)

static double partnerQualitaet(Person p1, Person p2) { double distanz = Math.pow(p1.groesse - p2.groesse, 2)

+ 0.2 * Math.abs(p1.brustTiefe * p1.brustBreite - p2.brustTiefe * p2.brustBreite)

+ 0.5 * Math.pow(p1.schulterBreite - p2.schulterBreite, 2);

return 1 / (1 + distanz);

}

(10)

P1 P2 P3 P4 P5 P6 P7 P8 P9

P1 P2 P3 P4 P5 P6 P7 P8 P9 Personen:

Personen:

……...

(11)

static void druckeGuteTrainingsPartner(Person[] personen, PrintStream ausgabe) { for (int i = 0; i < personen.length; i++) {

for (int j = i + 1; j < personen.length; j++) {

double q = partnerQualitaet(personen[i], personen[j]);

if (q > 0.8) {

ausgabe.println(personen[i].beschreibung() + ", "

+ gewichtsKlasse(personen[i]));

ausgabe.println(personen[j].beschreibung() + ", "

+ gewichtsKlasse(personen[j]));

ausgabe.println("Qualität: " + q);

} }

} }

(12)
(13)

// test corner cases // null

BlackBox.rotateArray(null, 0);

BlackBox.rotateArray(null, 1);

BlackBox.rotateArray(null, -1);

// empty

int[] expected = new int[] {};

int[] values = new int[] {};

BlackBox.rotateArray(values, 0);

assertArrayEquals(expected, values);

(14)

// 1-elem

expected = new int[] { 1 };

values = new int[] { 1 };

BlackBox.rotateArray(values, 0);

assertArrayEquals(expected, values);

BlackBox.rotateArray(values, 1);

assertArrayEquals(expected, values);

BlackBox.rotateArray(values, -1);

assertArrayEquals(expected, values);

// 2-elem

expected = new int[] { 1, 2 };

values = new int[] { 1, 2 };

BlackBox.rotateArray(values, 0);

assertArrayEquals(expected, values);

BlackBox.rotateArray(values, 2);

assertArrayEquals(expected, values);

BlackBox.rotateArray(values, -2);

assertArrayEquals(expected, values);

expected = new int[] { 2, 1 };

values = new int[] { 1, 2 };

BlackBox.rotateArray(values, 1);

assertArrayEquals(expected, values);

values = new int[] { 1, 2 };

BlackBox.rotateArray(values, -1);

assertArrayEquals(expected, values);

(15)

static private int[] createRangeArray(int start, int end) { int size = end - start;

int[] res = new int[size];

for (int i = 0; i < size; i++) { res[i] = start + i;

}

return res;

}

// general test

int[] rotations = createRangeArray(-42, 43);

for (int n = 0; n < 13; n++) { for (int steps : rotations) {

expected = createRangeArray(-1, n - 1);

values = expected.clone();

BlackBox.rotateArray(values, steps);

for (int i = 0; i < values.length; i++) {

assertEquals(expected[((i - steps) % n + n) % n], values[i]);

} }

}

start start+1 start+2 …... end-3 end-2 end-1

(16)

<yz> <= Y | ZZZ

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

(17)

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

(18)

Aufgabe 5: Analoge Uhr

double seconds = System.currentTimeMillis() / 1000.0;

double minutes = seconds / 60;

double hours = minutes / 60 + HOUR_OFFSET;

double hourAngle = hours/12 * 2*Math. PI;

double minuteAngle = minutes/60 * 2*Math. PI;

double secondAngle = seconds/60 * 2*Math. PI;

UTC,

Greenwich-Zeit

(19)

Aufgabe 5: Analoge Uhr

double x = SIZE/2 + Math.sin(hourAngle)*120;

double y = SIZE/2 - Math.cos(hourAngle)*120;

window.drawLine(

SIZE/2, SIZE/2, x, y);

x =

SIZE/2 + Math.sin(minuteAngle)*200;

y =

SIZE/2 - Math.cos(minuteAngle)*200;

window.drawLine(

SIZE/2, SIZE/2, x, y);

x =

SIZE/2 + Math.sin(secondAngle)*180;

y = SIZE/2 - Math.cos(secondAngle)*180;

window.setStrokeWidth(5);

window.drawLine(

SIZE/2, SIZE/2, x, y);

(20)

Vorbesprechung Übung 7

(21)

Aufgabe 1: Teilfolgen

(22)

(23)

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=””

(24)

(25)

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);

}

}

(26)

Aufgabe 2: Verzahnungen (Bonus!)

(27)

Aufgabe 3: Linked List

null

(28)
(29)

Überprüfen von fehlerhaften Bedingungen:

if (condition) {

Errors.error(message);

}

(30)

Aufgabe 4: Unit-Tests für die Linked List

public class LinkedIntListTest {

@Test

public void testGet() {}

@Test

public void testSet() {}

@Test

public void testIsEmpty() {}

@Test

public void testAddFirst() {}

@Test

public void testAddLast() {}

@Test

public void testRemoveFirst() {}

@Test

public void testRemoveLast() {}

@Test

public void testClear() {}

@Test

public void testToArray() {}

}

LinkedIntListTest.java

(31)

LinkedIntList list =

new LinkedIntList();

list.addFirst(1);

list.addFirst(2);

list.addFirst(3);

assertArrayEquals(new int[]{3, 2, 1}, list.toArray());

Beispiel:

Praktisch!

(32)

testRandom() vom Übungsblatt

@Test

public void testRandom() {

Random rand = new Random(42);

LinkedIntList ll = new LinkedIntList();

for(int n = 0; n < 9721; n++) { int choice = rand.nextInt(6);

int value = rand.nextInt();

if(choice == 0)

ll.addFirst(value);

else if(choice == 1) ll.addLast(value);

else if(choice == 2 && !ll.isEmpty()) ll.removeFirst();

else if(choice == 3 && !ll.isEmpty()) ll.removeLast();

else if(choice == 4 && !ll.isEmpty()) ll.set(rand.nextInt(ll.size), value);

else if(choice == 5 && value % 5 == 0) ll.clear();

}

String msg = "There is a bug in your LinkedIntList";

assertFalse(msg, ll.isEmpty());

assertEquals(msg, 5, ll.size);

int[] expect = new int[]{-1759285598, -424345731, -1746103561,

-1623993329, -1831395423};

assertArrayEquals(msg, expect, ll.toArray());

}

(33)

Aufgabe 5: Rekursion

int main(String[] args){

Window w = new Window("Tree", SIZE, SIZE);

w.open();

drawTree(w, SIZE/2, SIZE, 100, Math.PI/2);

w.refresh();

w.waitUntilClosed();

}

public static void drawTree(Window w, int x, int y, double l, double angle){

if (...) { ...

} else { ...

drawTree(...);

drawTree(...);

} }

Bezüglich Animation, siehe Lösung der Aufgabe

5 (Uhr)

der Übung 6

Referenzen

ÄHNLICHE DOKUMENTE

Eine Kante einzufügen funktioniert gleich wie bei der einfachen Adjazenzliste, ausser dass man wiederum noch den Grad am Anfang der Liste anpassen muss (Laufzeit O( 1 ) ), ausser

Wir zeigen die Korrektheit des Algorithmus. Stossen wir also im Laufe des Algorithmus auf einen “Widerspruch”, d.h. wir besuchen z.B. einen bereits rot eingefärbten Knoten von

Er enthält ausserdem immer mindestens eine unge- färbte Kante: es ist nicht möglich alle Kanten über einen Schnitt grau zu färben, da die letzte davon nicht in einem Kreis

Entweder das i-te Objekt ist im Rucksack, dann dürfen die restlichen Objekte im Rucksack noch höchstens b − w i Gewicht haben oder das i-te Objekt ist nicht im Rucksack. (2) Der

Sobald keine Rebalancierungen mehr nötig sind (d.h. der Vater v hat maximal b Kinder), so laufen wir von v bis zur Wurzel und erhöhen den ` - Wert jedes besuchten Knotens um 1, da

Sei ( A, x ) die Eingabe, die unser Programm P als Bitstring erhält. Genau das ist, was wir haben wollen: P soll testen, ob A auf x hält. Dies steht aber in direktem Widerspruch zu

Da es keine Kanten zwischen zwei out-Knoten gibt und keine Kanten zwischen zwei in-Knoten gibt, muss jeder out-Knoten zwischen einem mid-Knoten und einem in-Knoten auf dem

’NEIN’. Korrektheit folgt aus obiger Aussage und die Laufzeit.. Anschliessend kann B mit demselben Algorithmus durch- sucht werden. Offensichtlich werden wir so das gesuchte