Übungsstunde 6
Einführung in die Programmierung I
Probleme bei Übung 5
[TODO Assistent]
Nachbesprechung Übung 6
256
5 6 4 5 5 6 3
…
hoehen.txt
Plateau längstes
Plateau
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
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);
}
P
₀P
₁P
₂P
₃P
₄P
₅0 1 2 3 4 5
3 5 4 0 2 1
personen
partner
Paar-Einteilung:
(P
₀, P
₃), (P
₁, P
₅), (P
₂, P
₄)
int[] partner = new int[personen.length];
// erste naive Einteilung
for(int i = 0; i < personen.length; i += 2) { partner[i] = i + 1;
partner[i + 1] = i;
}
Einteilung 1:
(P
₀, P
₃) (P
₁, P
₅) (P
₂, P
₄)
Einteilung 2:
(P
₄, P
₃) (P₁, P₅) (P
₂, P
₀)
// wiederholtes Mischen von zufälligen Paaren int n = 10000000;
Random r = new Random();
while (n-- > 0) {
// Wahl unterschiedlicher Paare int p1 = r.nextInt(partner.length);
int p2;
do {
p2 = r.nextInt(partner.length);
} while(p2 == p1 || partner[p1] == p2);
mischePaareWennBesser(personen, partner, p1, p2);
}
static void mischePaareWennBesser(Person[] personen, int[] partner, int p1, int p2) { double alteQ = partnerQualitaet(personen[p1], personen[partner[p1]])
+ partnerQualitaet(personen[p2], personen[partner[p2]]);
double neueQ = partnerQualitaet(personen[p2], personen[partner[p1]]) + partnerQualitaet(personen[p1], personen[partner[p2]]);
if (neueQ > alteQ) {
int pp1 = partner[p1];
// p1 kriegt Partner von p2 partner[p1] = partner[p2];
partner[partner[p1]] = p1;
// p2 kriegt Partner von p1 partner[p2] = pp1;
partner[partner[p2]] = p2;
} }
2 Paare auswählen (P
₀, P
₃)
(P
₂, P
₄)
Paare mischen (P
₄, P
₃)
(P
₂, P
₀)
Vorbesprechung Übung 7
Aufgabe 1: Linked List
null
Überprüfen von fehlerhaften Bedingungen:
Aufgabe 2: 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
LinkedIntList list =
new LinkedIntList();list.addFirst(1);
list.addFirst(2);
list.addFirst(3);
assertArrayEquals(new int[]{3, 2, 1}, list.toArray());
Beispiel:
Praktisch!
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());
}
Linked List Person Person Person
Linked List Person
Linked List Person Person Person
Linked List Person Person
… Histogramm
LinkedPersonList PersonNode PersonNode PersonNode
LinkedPersonList PersonNode
LinkedPersonList PersonNode PersonNode PersonNode
LinkedPersonList PersonNode PersonNode
… Histogramm
Demo zu Aufgabe b)
42.9 17.7 28.0 21 65.6 174.0 1 43.7 16.9 30.8 23 71.8 175.3 1 40.1 20.9 31.7 28 80.7 193.5 1 44.3 18.4 28.2 23 72.6 186.5 1 42.5 21.5 29.4 22 78.8 187.2 1
…
body.dat.txt
[147.0, 149.6) ├─╫─┤
[149.6, 152.2) ├──────╫──────────────┤
[152.2, 154.8) ├──────╫────────────┤
[154.8, 157.4) ├───────╫────────┤
[157.4, 160.0) ├──────╫──────────────────┤
[160.0, 162.6) ├─────────────╫───────────────────┤
[162.6, 165.2) ├─────────╫─────────────────────────────────┤
[165.2, 167.8) ├─────────╫────────────────┤
[167.8, 170.4) ├───────────╫─────────────────┤
[170.4, 173.0) ├─────────────╫──────────────────────────┤
[173.0, 175.6) ├──────────────╫───────────────┤
[175.6, 178.2) ├────────────────╫─────────────────────────────┤
[178.2, 180.8) ├──────────────╫──────────┤
[180.8, 183.4) ├─────────╫─────────┤
[183.4, 186.0) ├────────────╫───────────────┤
[186.0, 188.6) ├──────────╫───────────┤
[188.6, 191.2) ├───────────╫───────────────┤
[191.2, 193.8) ├─────────╫──────┤
[193.8, 196.4) [196.4, 199.0) ├─╫─┤ Minimum Maximum
Durchschnitt
Aufgabe 4: Self-avoiding Random Walks
Zusatzübungen
s
2D-Array
int [] [] array2d = new int [zeilen] [spalten];
Ein 2D-Array ist ein lineares Array von Zeilen. Der new Operator initialisiert die Elemente der Zeilen mit dem Nullwert des Typs, z.B. 0 für int.
0 0 0 0
0 0 0 0
0 0 0 0
…