TAG 3: FUNKTIONEN, EVENTS, ARRAYS, EXKURS: SPEICHERVERWALTUNG Brückenkurs Programmierung WiSe 16/17 Toni Barthel Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Organisatorisches I Themen: • Tag 1: Variablen Operatoren, Verzweigungen • Tag 2: Animationen, Schleifen • Tag 3: Funktionen, Events, Arrays, Exkurs: Speicherverwaltung • Tag 4: Objektorientierung, Twitter und Processing • Tag 5: Ausblick auf Java und C Heute: • Wiederholung Tag 2 • Nicht so viel Mathe wie gestern! • Wir Blicken hinter die Kulissen. • Heute schon Funktionen! Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Organisatorisches II Tagesablauf: • Zwei Vorlesungsblöcke (ca. 90min), 15min Kaffeepause • Neuankömmlinge melden sich bitte in der Pause bei mir Kursunterlagen Uns ist positiv aufgefallen: • Lerngruppen • Anwesend in den Tutorien • Aufmerksamkeit http://bit.ly/1KDJyMY Brückenkurs Programmierung WiSe 16/17 - Toni Barthel TAG3.0: WIEDERHOLUNG Brückenkurs Programmierung WiSe 16/17 Toni Barthel Brückenkurs Programmierung WiSe 16/17 - Toni Barthel WDH: Ablaufsteuerung I Formulieren Sie das abgebildete Flussdiagramm als Anweisungsabfolge. … Antwort while(x>5){ x=x+2; } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel WDH: Ablaufsteuerung II Formulieren Sie das abgebildete Flussdiagramm als Anweisungsabfolge. … Antwort for (i=0; i<5; i++) { //Anweisung } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel WDH: Processing Wie erzeugen Sie eine zufällige Zahl im Wertebereich von 15 bis 50 mit der Programmiersprache Processing? random(15,50); Welche zwei Standardfunktionen haben Sie bisher kennengelernt? void setup () { … } und void draw () { … } Definieren Sie eine beliebige Farbe und initialisieren sie diese als Variable. col meineFarbe = col(15,125,35); Brückenkurs Programmierung WiSe 16/17 - Toni Barthel WDH: Processing Zeichnen Sie eine einfache Linienabfolge mit maximal 10 Stück. Die erste Linie liegt bei: A(0,0)-A’(400,0). Alle folgenden Linien sind um 10 Punkte versetzt. size(400, 650); background(255); strokeWeight(2); // Einfache Linien for (int y = 0; y < 100; y = y + 10) { line(0, y, height, y); } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel WDH: Processing Zeichnen Sie eine nicht bestimmte Anzahl einer Linienabfolge. Die erste Linie liegt bei: A(0,0)-A’(400,0). Alle folgenden Linien sind um 10 Punkte versetzt. size(400, 650); background(255); strokeWeight(2); // Einfache Linien int y = 0; while(y<height) { line(0, y, height, y); y = y + 10; } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel TAG 3.1: FUNKTIONEN Brückenkurs Programmierung WiSe 16/17 Toni Barthel Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Funktionen Mathematik • Zuordnung Argumentwert(e) -> Ergebniswert • Beispiel: f(x) = a + 2x Informatik / Programmierung • Zusammenfassung von Anweisungen die • von Argumentwerten abhängen (können) • Einen Ergebniswert produzieren (können) • Hilft QuellCode zu vereinfachen und zu strukturieren • Hinweis: Dopplungen sind ein Hinweis zur Verwendung von Funktionen ;-) int getMax(int x, int y) { return x > y ? x : y; } int geUniversalNumber() { return 42; } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Funktionsdefinition Funktionskopf • Funktionsname • Funktionsparameter • auch formale Funktionsargumente Funktionskörper • Code, Sammlung von Anweisungen Funktionsergebnis • Rückgabewert • return … ; Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Funktionsaufruf Funktionsname Funktionsargument • auch aktuelle Funktionsargumente int myMin = 4; int myIntValue = max(17,myMin); Unterscheidung der Begrifflichkeit: Funktion / Methode Wenn static davor steht, handelt es sich um eine Funktionoder statische Methode, ansonsten ist es eine Methode. static int geUniversalNumber() { return 42; } Funktion int geUniversalNumber() { return 42; } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Methode Funktionen und Variablen Hinweise zur Verwendung von Funktionen • Eine Methode (Funktion) kann beliebig viele Variablendefinitionen und Anweisungen enthalten. • Sie endet mit return oder der letzten Anweisung float entfernungZumMittelpunkt(float x, float y) { float d = dist(x, y, width/2, height/2); // gebe das ergbenis zurück return d; } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Funktionen ohne Rückgabewert Funktionen ohne Rückgabewert Parameter • einfachste Form, erledigen Aufgaben • beliebig viele Parameter • mit dem Schlüsselwort void (engl. leer) • jede Variable kann (muss aber nicht!) ein Parameter sein markiert • geben kein Ergebnis zurück void setup() { } void draw() { zeichneEllipse(); } void zeichneEllipse() { ellipse(50, 50, 50, 50); } void setup() { } void draw() { // Funktionsaufruf mit zwei Parametern zeichneEllipse(25, 25); zeichneEllipse(75, 75); } // Funktion mit zwei float Parametern void zeichneEllipse(float x, float y) { ellipse(x, y, 50, 50); } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Funktionen MIT Rückgabewert Funktionen mit Rückgabewert • erledigen Aufgaben und geben einen Wert zurück • komplizierte Berechnungen, etc. • Statt void also z.B. int, float, String • das Ergebnis wird nach Abschluss aller nötigen Schritte mit dem Schlüsselwort return zurück void setup() { background(255); fill(0); } void draw() { background(255); float d = entfernungZumMittelpunkt(mouseX, mouseY); ellipse(50, 50, d, d); } // berechnet die Entfernung // von einem Punkt (x, y Parameter) // zum Mittelpunkt der Anwendung float entfernungZumMittelpunkt(float x, float y) { float d = dist(x, y, width/2, height/2); // gebe das Ergebnis zurück return d; } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Anwendungsbeispiel void setup () { size (320, 240); background (0); smooth (); noLoop (); } void draw () { // draw thick, dark x stroke (80); strokeWeight (20); line (50, 40, 110, 105); line (110, 40, 50, 105); // draw medium, light gray x stroke (210); strokeWeight (10); line (150, 140, 210, 200); line (210, 140, 150, 200); // draw thin, white x stroke (255); strokeWeight (2); line (50, 140, 110, 200); line (110, 140, 50, 200); } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Anwendungsbeispiel I void setup () { size (320, 240); background (0); smooth (); noLoop (); } void draw () { drawCross (50, 40, 60, 80, 20); drawCross (150, 140, 60, 210, 10); drawCross (50, 140, 60, 255, 2); } void drawCross (float theX, float theY, float theSize, int theGrey, float theWeight) { stroke (theGrey); strokeWeight (theWeight); line (theX, theY, theX+theSize, theY+theSize); line (theX+theSize, theY, theX, theY+theSize); } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Anwendungsbeispiel II void setup () { size (320, 240); background (0); smooth (); noLoop (); } void draw () { for(int i=0; i < 70; i++) { drawCross (random (width), random (height), random (10, 100), int (random (40, 255)), random (1, 18)); } } void drawCross (float theX, float theY, float theSize, int theGrey, float theWeight) { stroke (theGrey); strokeWeight (theWeight); line (theX, theY, theX+theSize, theY+theSize); line (theX+theSize, theY, theX, theY+theSize); } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Zusammenfassung Funktionen 1. Unser Code wird kürzer und übersichtlicher. 2. Wir brauchen Codeteile nicht immer und immer wieder zu schreiben, was die Fehlerquote senkt. Prinzip der Modularität Dieses Prinzip, komplexe Aufgaben in ihre Grundbestandteile zu gliedern, um diese später einfach wiederverwenden zu können, bezeichnet man als Modularität. Brückenkurs Programmierung WiSe 16/17 - Toni Barthel TAG 3.2: EVENTS (FUNKTIONEN IN PROCESSING) Brückenkurs Programmierung WiSe 16/17 Toni Barthel Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Wie Entsteht ein Event? Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Funktionen In PROCESSING II In Processing gibt es viele Funktionen. Einige davon haben wir bisher benutzt ohne uns genauer damit zu beschäftigen. • setup() - wird einmal zu Beginn des Programms ausgeführtvoid • draw() - wird, je nach frameRate() pro Sekunde ausgeführt (default 60 Frames pro Sekunde) - Hauptteil unseres Processing Programms • mousePressed() - wird einmal ausgeführt, wenn die Maus gedrückt wird (Vergleiche dazu mousePressed) • keyPressed() - wird einmal ausgeführt, wenn eine Taste auf der Tastatur gedrückt wird (Vergleiche dazu keyPressed) Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Funktionen In PROCESSING II void mouseClicked() { // Aktion wenn die Maus geklickt wurde } void mousePressed() { // Aktion wenn die Maus geklickt ist } void mouseReleased() { // Aktion wenn eine Maustaste losgelassen wird. } void mouseMoved() { // Aktion wenn sich die Maus bewegt } void mouseDragged() { // Aktion wenn die Maus geklickt ist und bewegt wird } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Funktionen In PROCESSING II void setup() { size(400, 400); background(0); textAlign(CENTER); textSize(24); fill(255); text(“Nichts passiert!“, width/2, height/2); } void draw() { } void mousePressed() { background(100, 100, 0); text(„Maus wurde gedrückt", width/2, height/2); if ( mouseButton == LEFT) { text("und es war ein links Klick", width/2, height/2 + 40); } if (mouseButton == RIGHT) { text("und es war ein rechts Klick", width/2, height/2 + 40); } } void mouseReleased() { background(100, 0, 100); text("Maus wurde los gelassen.“, width/2, height/2); } void mouseMoved() { background(150, 10, 70); text("Maus wurde bewegt", width/2, height/2); } void mouseDragged() { background(10, 70, 100); text("Maustaste ist gedrückt und wird bewegt.“, width/2, height/2); } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel TAG 3.3: ARRAYS Brückenkurs Programmierung WiSe 16/17 Toni Barthel Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Wie Speichern wir viele Werte? 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 Es werden am besten Variable von variabler Größe benötigt… nur wie? Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Arrays Definition: Ein Array ist eine Variable, die mehrere Werte vom gleichen Typ enthält. Syntax: <typ>[] name = new <typ>[<size>]; Beispiel: Zugriff: Zugriff: float[] a = new float[3]; int[] b = new int[]{1,2,4} b[0] = 1; a[1+1] = 3.4; int x = b[0]; println(a[x+1]); int n = a.length; Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Arrays als Regale Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Arrays im Einsatz & Ausgabe auf der Konsole String[] array = {"Alles", "aus", "der", "Liste"}; for (int i=0; i < array.length; i = i + 1) { print (array[i] + " "); } Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Arrays im Einsatz der Theorie Fragestellung: Welche Ausgabe können Sie erwarten? Zeigen Sie ihre Lösung Schritt für Schritt! import java.util.*; int feldA[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int a = 5; feldA[2] = feldA[a+feldA[0]]-feldA[a]; print(Arrays.toString(feldA)); Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Arrays im Einsatz der Theorie int feldA[] = {1,2,3,4,5,6,7,8,9}; 0|1|2|3|4|5|6|7|8 int a = 5; feldA[2] = feldA[a+feldA[0]]-feldA[a]; feldA[2]= feldA[a+ 1 ]-feldA[a] feldA[5+ 1 ]-feldA[a] feldA[ 6 ]-feldA[a] feldA[ 6 ]-feldA[a] 7 -feldA[a] 7 -feldA[5] 7 - {1,2,1,4,5,6,7,8,9} 6 Ausgabe: [1,2,1,4,5,6,7,8,9] Brückenkurs Programmierung WiSe 16/17 - Toni Barthel TAG 3.4: EXKURS WERT- UND REFERENSEMANTIK Brückenkurs Programmierung WiSe 16/17 Toni Barthel Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Unterschied Primitive - und Referenztypen Erinnerung: Processing (Java) unterscheidet zwischen primitiven Typen (z.B. int) und Referenztypen (Arrays und Klassen). primitiver Typ: Variable enthält Wert • bei Zuweisung wird der Wert direkt kopiert Stack 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 Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Heap Stack und Heap (Einführung) Stack (Stapel) Auf dem Stack werden Parameter und alle lokalen Variablen aller gerade aktiven Methoden verwaltet. (Parameter und Lokale Variablen leben nur für die Dauer der Aktivität der Methode) Heap (Haufen) Auf dem Heap werden Objekte verwaltet (unter anderem mit new angelegt). Der Inhalt der Referenzvariablen verweisen auf den Speicherort der Objekte im Heap. Ein Array ist ein Objekt. liste% check% str% c% a% args% Stack& false% 0 0 0 0 "abc" 'm'% 5% ... Heap& Brückenkurs Programmierung WiSe 16/17 - Toni Barthel 0 Beispiel zu Stack und Heap mit einem Array public static void main(String[] args) { int[] a = {1, 2, 3, 4}; int[] b = {10, 20, 30, 40}; ... } 10 20 30 40 b" a" args" 1 2 3 ... Stack& Heap& Brückenkurs Programmierung WiSe 16/17 - Toni Barthel 4 Aufräumen des Heap • Der Garbage Collector reinigt den Heap vom „Müll“ • Verfolgt systematisch alle Referenzen und markiert diese • Nicht markierte Objekte können weggeräumt werden, da keine Referenzvariable auf diese Objekte zeigt • Das Wegräumen nicht benötigter Objekte erfolgt automatischIn regelmäßigen Abständen • Wenn das Programm knapp an Speicher ist • Kann Programmlauf jederzeit unterbrechen, weil er gerade mal Lust hat Gleich'fahre' ich'wieder'im' Heap'rund'und' sammle'allen' Abfall' aufzuräumen! b" a" args" Stack& 10 20 30 40 1 2 3 4 ... Heap& Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Carbage&Collector& 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 • ist keine Referenz mehr auf ein Objekt vorhanden, wird dieses über die Carbage Collection aufgeräumt Brückenkurs Programmierung WiSe 16/17 - Toni Barthel Zusammenfassung I • • • • • • • setup() draw() mousePressed() mouseMoved() mouseReleased() … keyPressed() Theorie: • unterschied primitive und komplexe Datentypen • Speicherverwaltung (Stack, Heap) • Aufräumen des Speichers -> Carbage Collection Array-Syntax: <typ>[] name = new <typ>[<size>]; Beispiel: Zugriff: Zugriff: float[] a = new float[3]; int[] b = new int[]{1,2,4} b[0] = 1; a[1+1] = 3.4; int x = b[0]; println(a[x+1]); int n = a.length; Brückenkurs Programmierung WiSe 16/17 - Toni Barthel HERZLICHEN DANK FÜR IHRE AUFMERKSAMKEIT Toni Barthel Brückenkurs Programmierung WiSe 16/17 - Toni Barthel