Bru ckenkurs Programmieren Tag 3: Events und Arrays Jakob Czekansky Technische Hochschule Mittelhessen 28. September 2016
Inhalt Events Arrays Wert- vs Referenzsemantik 2 / 20
Inhalt Events Arrays Wert- vs Referenzsemantik 3 / 20
Events: Besondere Funktionen in Processing Processing-code kann in Funktionen stehen, die zu unterschiedlichen Zeitpunkten aufgerufen werden: setup() draw() mousepressed()? keypressed()? keyreleased()... 4 / 20
Events: Wie entsteht ein Event? Key-Event (OS) key =...; keycode =...; keypressed = true; setup() Hardware-Interrupt Key-Event (Java) draw() draw() keypressed() draw() Wikimedia-Bilder: Tux von Ewing, Budig und Gerwinsik, Processing von Woodmath (CC3), Tastatur von Cy21 (CC3) 5 / 20
Events: keypressed Beispiel void keypressed() { if(key == w ) y--; else if (keycode == CONTROL) y = 0; } Bausteine Besondere Variablen: key (char) für druckbare Zeichen ( a, b, 7,,...) keycode (int) für Steuerzeichen (CONTROL, ALT, LEFT,...) void keypressed() { //wird bei jedem Tastendruck ausgeführt } 6 / 20
Events: mousepressed Beispiel void mousepressed() { if(mousebutton == LEFT && mousex > 100) running = true; } Bausteine Besondere Variablen: mousebutton (int) entweder LEFT, RIGHT oder CENTER mousex, mousey (int) als Koordinaten im Fenster void mousepressed() { //wird bei jedem Mausdruck ausgeführt } 7 / 20
Aufgabe: Disco Klicker Verändere jedes mal, wenn die Maus geklickt wird die Hintergrundfarbe zu einer neuen Zufallsfarbe. Vorgabe void setup() {... //Initialisierung } void draw() {} //kann leer bleiben, muss aber da sein void mousepressed() {... //Verändern der Hintergrundfarbe } 8 / 20
Inhalt Events Arrays Wert- vs Referenzsemantik 9 / 20
Arrays Was macht man, wenn ein Programm viele Werte speichern muss? viele Werte speichern viele Variablen definieren genauso unpraktikabel wie Schleifen auszuschreiben Anzahl benötigter Variablen evtl. zu Beginn unbekannt Variable von variabler Größe benötigt 10 / 20
Arrays: Definition, Zuweisung, Zugriff Ein Array ist eine Variable, die mehrere Werte vom gleichen Typ enthält. Definition float[] a = new float[3]; int[] b = new int[]{1,2,4}; Zuweisung b[0] = 1; a[1+1] = 3.4; Zugriff int x = b[0]; println(a[x+1]); int n = a.length; 11 / 20
Array als Regal 12 / 20
Array als Regal 12 / 20
Array als Regal 12 / 20
Aufgabe: Balkendiagramm Erstelle ein Array mit 10 positiven ganzen Zahlen und stelle es als Balkendiagramm dar. Allgemeine Syntax int[] ar = new int[10]; ar[0] = 4; int x = ar[2]; 13 / 20
Inhalt Events Arrays Wert- vs Referenzsemantik 14 / 20
Wert- vs Referenzsemantik Erinnerung Java unterscheidet zwischen primitiven Typen (z.b. int) und Referenztypen (Arrays und Klassen). Frage: Produzieren die beiden folgenden Codestücke die gleiche Ausgabe? int a = 3; int b; b = a; b = 4; println(a); int[] a = new int[2]; a[0] = 3; int[] b; b = a; b[0] = 4; println(a[0]); 15 / 20
Wertsemantik bei primitiven Typen int a = 3; 16 / 20
Wertsemantik bei primitiven Typen int a = 3; int b; 16 / 20
Wertsemantik bei primitiven Typen int a = 3; int b; b = a; 16 / 20
Wertsemantik bei primitiven Typen int a = 3; int b; b = a; b = 4; 16 / 20
Referenzsemantik bei Referenztypen int[] a = new int[2]; a[0] = 3; 17 / 20
Referenzsemantik bei Referenztypen int[] a = new int[2]; a[0] = 3; int[] b; 17 / 20
Referenzsemantik bei Referenztypen int[] a = new int[2]; a[0] = 3; int[] b; b = a; 17 / 20
Referenzsemantik bei Referenztypen int[] a = new int[2]; a[0] = 3; int[] b; b = a; b[0] = 4; 17 / 20
Wert- vs Referenzsemantik: Zusammenfassung Der Inhalt von Variablen unterscheidet sich je nach dem, welchen Typ die Variable hat. primitiver Typ: Variable enthält Wert bei Zuweisung wird der Wert direkt kopiert Referenztyp: Variable enthält Referenz bzw. Zeiger verweist auf Speicherstelle an der die Daten liegen bei Zuweisung wird nur die Referenz kopiert die Daten bleiben die selben 18 / 20
Wert- vs Referenzsemantik: Übungsaufgabe Gemeinsam an der Tafel: Was steht im Speicher, wenn der folgende Code ausgeführt wurde? float[] ypos; float[] xpos; ypos = new float[]{100, 150, 200} xpos = ypos; float x = xpos[1]; x *= 2; ypos[1] += 1; 19 / 20
Zusammenfassung keypressed int counter = 0; void keypressed() { if(key == a ) { counter++; } else if (key == x ) { exit(0); } } Arrays int[] numbers = new int[10]; numbers[0] = 20; numbers[3+2] = numbers[0]; int val = numbers[5]; mousepressed void mousepressed() { if(mousebutton == LEFT) background(255); else background(0); } 20 / 20