Übungsstunde 4
Einführung in die Programmierung
Probleme bei Übung 3
[TODO Assistent]
Nachbesprechung Übung 4
Aufgabe 1: Sieb des Eratosthenes
//Initialisiere das Array sieb und setze alle Werte auf true boolean[] sieb = new boolean[limit + 1];
for(int i = 2; i < sieb.length; i++){
sieb[i] = true;
}
//Markiere die Vielfachen der Primzahlen als false for(int i = 2; i < limit; i++) {
if(sieb[i]) {
for(int vielfaches = 2 * i; vielfaches <= limit; vielfaches += i) { sieb[vielfaches] = false;
} }
}
//Zähle die Primzahlen int primzahlen = 0;
for(int i = 2; i < sieb.length; i++){
if(sieb[i]){
primzahlen++;
} }
Aufgabe 2: Newton-Raphson
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int z = scanner.nextInt();
double root = squareRoot(z);
System.out.println("Wurzel von " + z + " = " + root);
}
static double squareRoot(int z) { double c = z;
double t = c / 2.0;
double eps = 0.000000000001;
while (Math.abs(t * t - c) > eps) { t = (c / t + t) / 2.0;
}
return t;
}
Double-Division erzwingen
Math.abs(x) = |x|
Aufgabe 3: Passende Winkel
static boolean passendeWinkel(int a, int b, int c) {
boolean hatKomplementaer = ((a + b == 90) || (a + c == 90) || (b + c == 90));
boolean hatSupplementaer = ((a + b == 180) || (a + c == 180) || (b + c == 180));
return hatKomplementaer && hatSupplementaer;
}
Aussagekräftige Variablennamen
Aufgabe 4: Chaos Game
public static void main(String[] args) { int size = 800;
int stepsPerIter = 50;
double[] cornersX = {size/2, 50, size-50};
double[] cornersY = {100, size-100, size-100};
double x = Math.random() * size;
double y = Math.random() * size;
Window window = new Window("Chaos Game", size, size);
window.open();
while(window.isOpen()) {
for(int i = 0; i < stepsPerIter; i++) { int index = (int) (Math.random() * 3);
x = (x + cornersX[index]) / 2;
y = (y + cornersY[index]) / 2;
window.fillRect(x, y, 1, 1);
}
window.refresh();
} }
Eckpunkte des Dreiecks
x,y-Koordinaten eines zufälligen Punktes im Fenster
Wahl eines Eckpunktes
Berechne die Koordinaten des
Mittelpunkts
Aufgabe 4: Chaos Game
Wacław Sierpiński Sierpinski-Dreieck
Vorbesprechung Übung 5
Aufgabe 1: Testen mit JUnit
Zweck des Programms:
● Wochentag eines Datums (nach 01.01.1900) ausgeben Beispiel:13.10.2017 → Friday
Gibt fälschlicherweise aber “The 13.10.2017 is a Sunday” aus.
● Berücksichtigt Schaltjahre (“Leap year”) Funktionsweise:
1. Überprüft, ob Datum OK ist
2. Zählt die Tage ab 1.1.1900 bis zum eingegebenen Datum 3. Wochentag = Tage % 7
Aufgabe 1: Testen mit JUnit
Tests in PerpetualCalendarTest.java
● Einzelne Tests prüfen Rückgabewerte von einzelnen Methoden des Programms PerpetualCalendar.java
● Tests sollten interessante Parameter für die Methoden testen
● Beispiel testCountDaysInYear():
assertEquals(366, PerpetualCalendar.countDaysInYear(1904));
1904 ist ein Schaltjahr, also sollte countDaysInYear() 366 Tage zurückgeben
DEMO
Distanz
Schreiben Sie eine Methode, die als Parameter die x und y kartesischen Koordinaten eines
Punktes (x | y) nimmt und die Entfernung des Punktes vom Ursprung liefert.
Überlegen Sie sich einige Testfälle: Wieviele wollen Sie und was für Eigenschaften sollten sie testen?
Aufgabe 2: Wörter Raten
Aus Textdatei lesen
Scanner scanner = new Scanner(new File("woerter.txt"));
String[] woerter = new String[scanner.nextInt()];
for(int i = 0; i < woerter.length; i++) { woerter[i] = scanner.next();
} 8
wort
blasinstrument computer
schlange java
programmieren welt
sugus
woerter.txt Code zum Einlesen der Wörter:
Absoluter Pfad
● beginnt mit C:\… unter Windows oder /… unter Linux/macOS
Relativer Pfad
● ist relativ zum aktuellen Verzeichnis (“working directory”) des Programms (bei uns der Projektordner)
Liest das nächste Wort
Anzahl Wörter = 8
String-Vergleiche
String [] buchstaben = {"n", "o"};
String [] array = {"no"};
// wort = "no"
String wort = buchstaben[0] + buchstaben[1];
System.out.println((wort == array));
System.out.println((wort == array[0]));
System.out.println((wort.equals(array)));
System.out.println(wort.equals(array[0]));
System.out.println((wort.equals("no")));
①
②
③
④
⑤
Aufgabe 3: Datenanalyse
Anzahl Daten: 26 Minimum: 137 cm Maximum: 202 cm
Durchschnitt: 173 cm
Beispiel:
Histogramm
26 168 190 174 170 183 145 202
…
groessen.txt Wie viele Klassen soll das
Histogramm enthalten? 10 [100,115)
[115,130) | [130,145) ||
[145,160) |||||||
[160,175) ||||||||||||||||
[175,190) ||||||||||||||
[190,205) ||||||
[205,220) [220,235) [235,250)
Aufgabe 4: Random Sort (Bonus!)
int randomSort (int[] toSortArray) {
return …;
}
Class Random
Random r = new Random();
int index1 = r.nextInt (bound);
int index2 = r.nextInt (bound);
/* returns a pseudorandom, uniformly distributed int value
between 0 (inclusive) and the specified value ( exclusive) */
Wie kann man eine zufällige ganze Zahl in [1,10) generieren?
Wie kann man eine zufällige ganze Zahl in (0,10) generieren?
index2 index1
Index: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Die Elemente in array[index2] und array[index1] tauschen.
array[index2] = array[index1];
array[index1] = array[index2];
Richtig?
5 10 20 13 15 22 11 8 9 2 1 23 14 7 3 32 4 17
Swap
Werden A&D Professoren diesen Algorithmus mögen?
…
Aufgabe 5: Analoge Uhr
Zeit ---> Winkel z.B. 23:10:20
Wie kann man 20 Sekunden in einen Winkel umrechnen?
α = 20 / 60 * 2 π (rad)
Achtung: eine Uhr läuft im Uhrzeigersinn
Math Class
window.drawLine(double x1, double y1, double x2, double y2)
(x1,y1) Center
(x2, y2)
System.currentTimeMillis()
Millisekunden seit 00:00:00, 01.01.1970
System.out.println(System.currentTimeMillis);
→ 1507981421
Wie kann man mit dieser Zahl die aktuelle Zeit ausrechnen?
Division und Modulo: sec = (msec / 1000) % 60
Zusatzübungen
Postfix-Increment Operator
Was sind die Werte der Variablen (alles int)?
x = 0;
y = 0;
z = 1;
y = x++ + z - x;
x = 0;
y = 0;
z = 1;
y = x++ + z * x;
x = 0;
y = 0;
z = 1;
y = z * x + x++;
Arrays
Was gibt das folgende Code-Segment aus?
int [] a = new int [10];
for (int i = 0; i < 10; i++) { a[i] = 9 - i;
}
for (int i = 0; i < 10; i++) { a[i] = a[ a[i] ] ;
}
for (int i = 0; i < 10; i++) { System.out.print(a[i]);
}
Wie könnte man dieses Code-Segment flexibler formulieren?