funktionen, events, arrays, exkurs: speicherverwaltung

Werbung
TAG 3: FUNKTIONEN, EVENTS, ARRAYS,
EXKURS: SPEICHERVERWALTUNG
Brückenkurs Programmierung SoSe 16
Toni Barthel
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!
Brückenkurs Programmierung SoSe 16 - 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/1ZhfFby
Brückenkurs Programmierung WiSe 15/16 - Toni Barthel
TAG3.0: WIEDERHOLUNG
Brückenkurs Programmierung SoSe 16
Toni Barthel
Brückenkurs Programmierung SoSe 16 - Toni Barthel
WDH: Ablaufsteuerung I
Formulieren Sie das abgebildete
Flussdiagramm als Anweisungsabfolge.
… Antwort
while(x>5){
x=x+2;
}
Brückenkurs Programmierung SoSe 16 - Toni Barthel
WDH: Ablaufsteuerung II
Formulieren Sie das abgebildete
Flussdiagramm als Anweisungsabfolge.
… Antwort
for (i=0; i<5; i++) {
//Anweisung
}
Brückenkurs Programmierung SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - Toni Barthel
TAG 3.1: FUNKTIONEN
Brückenkurs Programmierung SoSe 16
Toni Barthel
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;
}
Brückenkurs Programmierung SoSe 16 - Toni Barthel
Funktionsdefinition
Funktionskopf
• Funktionsname
• Funktionsparameter
• auch formale Funktionsargumente
Funktionskörper
• Code, Sammlung von Anweisungen
Funktionsergebnis
• Rückgabewert
• return … ;
Brückenkurs Programmierung SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - Toni Barthel
TAG 3.2: EVENTS (FUNKTIONEN IN PROCESSING)
Brückenkurs Programmierung SoSe 16
Toni Barthel
Brückenkurs Programmierung SoSe 16 - Toni Barthel
Wie Entsteht ein Event?
Brückenkurs Programmierung SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - Toni Barthel
TAG 3.3: ARRAYS
Brückenkurs Programmierung SoSe 16
Toni Barthel
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?
Brückenkurs Programmierung SoSe 16 - 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 SoSe 16 - Toni Barthel
Arrays als Regale
Brückenkurs Programmierung SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - Toni Barthel
TAG 3.4: EXKURS WERT- UND REFERENSEMANTIK
Brückenkurs Programmierung SoSe 16
Toni Barthel
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
Brückenkurs Programmierung SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - 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 SoSe 16 - Toni Barthel
HERZLICHEN DANK
FÜR IHRE AUFMERKSAMKEIT
Toni Barthel
Brückenkurs Programmierung SoSe 16 - Toni Barthel
Herunterladen