TAG 3: FUNKTIONEN, EVENTS, ARRAYS, EXKURS: SPEICHERVERWALTUNG Brückenkurs Programmierung SoSe 16 Toni Barthel
Organisatorisches I Themen: Tag 1: Variablen Operatoren, Verzweigungen Tag 2: Animationen, Schleifen Tag 3: Funktionen, Events, Arrays, Exkurs: Speicherverwaltung Tag 4: Objektorientierung, Ausblick auf Java und C Heute: Wiederholung Tag 2 Nicht so viel Mathe wie gestern! Wir Blicken hinter die Kulissen. Heute schon Funktionen!
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/1zhffby Brückenkurs Programmierung WiSe 15/16 - Toni Barthel
TAG3.0: WIEDERHOLUNG Brückenkurs Programmierung SoSe 16 Toni Barthel
WDH: Ablaufsteuerung I Formulieren Sie das abgebildete Flussdiagramm als Anweisungsabfolge. Antwort while(x>5){ x=x+2;
WDH: Ablaufsteuerung II Formulieren Sie das abgebildete Flussdiagramm als Anweisungsabfolge. Antwort for (i=0; i<5; i++) { //Anweisung
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);
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);
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;
TAG 3.1: FUNKTIONEN Brückenkurs Programmierung SoSe 16 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;
Funktionsdefinition Funktionskopf Funktionsname Funktionsparameter auch formale Funktionsargumente Funktionskörper Code, Sammlung von Anweisungen Funktionsergebnis Rückgabewert return ;
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; 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;
Funktionen ohne Rückgabewert Funktionen ohne Rückgabewert einfachste Form, erledigen Aufgaben mit dem Schlüsselwort void (engl. leer) markiert geben kein Ergebnis zurück Parameter beliebig viele Parameter jede Variable kann (muss aber nicht!) ein Parameter sein void setup() { void setup() { void draw() { zeichneellipse(); void zeichneellipse() { ellipse(50, 50, 50, 50); 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);
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;
Anwendungsbeispiel 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); void setup () { size (320, 240); background (0); smooth (); noloop (); // draw thin, white x stroke (255); strokeweight (2); line (50, 140, 110, 200); line (110, 140, 50, 200);
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);
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);
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.
TAG 3.2: EVENTS (FUNKTIONEN IN PROCESSING) Brückenkurs Programmierung SoSe 16 Toni Barthel
Wie Entsteht ein Event?
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)
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
Funktionen In PROCESSING II 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 setup() { size(400, 400); background(0); textalign(center); textsize(24); fill(255); text( Nichts passiert!, width/2, height/2); void draw() { 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);
TAG 3.3: ARRAYS Brückenkurs Programmierung SoSe 16 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?
Arrays Definition: Ein Array ist eine Variable, die mehrere Werte vom gleichen Typ enthält. Syntax: <typ>[] name = new <typ>[<size>]; Beispiel: float[] a = new float[3]; int[] b = new int[]{1,2,4 Zugriff: b[0] = 1; a[1+1] = 3.4; Zugriff: int x = b[0]; println(a[x+1]); int n = a.length;
Arrays als Regale
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] + " ");
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));
Arrays im Einsatz der Theorie int felda[] = {1,2,3,4,5,6,7,8,9; int a = 5; 0 1 2 3 4 5 6 7 8 felda[2] = felda[a+felda[0]]-felda[a]; felda[a+ 1 ]-felda[a] felda[5+ 1 ]-felda[a] felda[2]= felda[ 6 ]-felda[a] felda[ 6 ]-felda[a] 7 -felda[a] 7 -felda[5] 7-6 {1,2,1,4,5,6,7,8,9 Ausgabe: [1,2,1,4,5,6,7,8,9]
TAG 3.4: EXKURS WERT- UND REFERENSEMANTIK Brückenkurs Programmierung SoSe 16 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 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% 'm'% 5% 0 0 0 0 0 "abc"... Heap&
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" Stack& 1 2 3 4... Heap&
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 aufzuräumen! b" a" args" 10 20 30 40 1 2 3 4... Gleich'fahre' ich'wieder'im' Heap'rund'und' sammle'allen' Abfall' Stack& Heap& 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
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: float[] a = new float[3]; int[] b = new int[]{1,2,4 Zugriff: b[0] = 1; a[1+1] = 3.4; Zugriff: int x = b[0]; println(a[x+1]); int n = a.length;
HERZLICHEN DANK FÜR IHRE AUFMERKSAMKEIT Toni Barthel