• Keine Ergebnisse gefunden

Übungsstunde 4

N/A
N/A
Protected

Academic year: 2022

Aktie "Übungsstunde 4"

Copied!
28
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Übungsstunde 4

Einführung in die Programmierung

(2)

Probleme bei Übung 3

[TODO Assistent]

(3)

Nachbesprechung Übung 4

(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++;

} }

(5)

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|

(6)

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

(7)

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

(8)

Aufgabe 4: Chaos Game

Wacław Sierpiński Sierpinski-Dreieck

(9)

Vorbesprechung Übung 5

(10)

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

(11)

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

(12)

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?

(13)

Aufgabe 2: Wörter Raten

(14)

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

(15)

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

(16)

Aufgabe 3: Datenanalyse

Anzahl Daten: 26 Minimum: 137 cm Maximum: 202 cm

Durchschnitt: 173 cm

Beispiel:

(17)

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)

(18)

Aufgabe 4: Random Sort (Bonus!)

int randomSort (int[] toSortArray) {

return …;

}

(19)

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?

(20)

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

(21)

Werden A&D Professoren diesen Algorithmus mögen?

(22)

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

(23)

Math Class

(24)

window.drawLine(double x1, double y1, double x2, double y2)

(x1,y1) Center

(x2, y2)

(25)

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

(26)

Zusatzübungen

(27)

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

(28)

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?

Referenzen

ÄHNLICHE DOKUMENTE

Leerzeichen um Operatoren erhöht Leserlichkeit.. Aufgabe 1: Folgen und Reihen.. Aufgabe 2: Binärdarstellung.. Aufgabe 3: Grösster gemeinsamer Teiler.. Aufgabe 4:

Schreiben Sie eine Methode quersumme, welche die Quersumme einer ganzen Zahl

● Tests sollten interessante Parameter für die Methoden testen.. ● Beispiel

Schreiben Sie eine Methode sortedInt, die zwei int Parameter a, b entgegen nimmt und sie der Grösse nach sortiert (aufsteigend) zurück

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

als Tipps probiert …?.. Aufgabe 5: Pong.. a) Erstellen Sie zwei weitere Klassen Player und Ball , welche alle Informationen zu Spieler und Ball beinhalten. Ein Spieler hat eine

Schreiben Sie ein Programm, das eine Datei mit ganzen Zahlen einliest und dann die Zahlen als Liste druckt:. 1. Dann drucken Sie den Durchschnitt

Schreiben Sie eine Methode quersumme, welche die Quersumme einer ganzen Zahl