Einführung in die Java- Programmierung

Werbung
Einführung in die JavaProgrammierung
Dr. Volker Riediger
Tassilo Horn
riediger|[email protected]
WiSe 2012/13
1
Rückblick
●
Schleifen
●
●
●
while
do-while
for
●
Methoden
●
Verfahren: Intervallschachtelung
2
Wo sind meine Programme?
●
●
●
●
Windows-Rechner in den Rechner-Räumen
sind alle gleich (meistens...)
Benutzerdaten (begrenzter Speicherplatz,
ein paar 100 MB) zentral im
Rechenzentrum, mit Datensicherung
Unter Windows erreichbar über
Laufwerksbuchstabe Z:
Eclipse-Workspace normalerweise bei:
Z:\nt\workspace
3
Beispiele in Eclipse importieren
●
●
Nach dem Entpacken der ZIP-Datei
javakurs-wise1213-demo.zip ist darin ein
Ordner javakurs-wise1213-demo
Dieser Ordner ist ein Eclipse-Projekt und
kann so in Eclipse importiert werden
●
File > Import...
●
Existing Projects into workspace, [Next]
●
Select root directory: Browse... Ordner suchen:
javakurs-wise1213-demo
●
Auswählen und [Finish]
4
Java-Namenskonventionen
●
Klassennamen sind i.d.R. Substantive und werden in CamelCase mit
Großbuchstabe am Anfang geschrieben
●
●
●
●
●
●
EinMalEins, JConsole, Rechner, String
Methodennamen sind i.d.R. Verbalphrasen (Verb und Objekt) oder
mathematische Funktionen und werden in camelCase geschrieben
printValue(), readInt(), sqrt(), sin(), cos(), wurzel()
Variablennamen sind i.d.R. Substantive in camelCase mit Kleinbuchstabe
am Anfangoder im Falle von mathematischen Funktionen die Formelzeichen
zaehler, obereSchranke, x, y
Konstanten werden wie Variablen benannt, aber vollständig in
GROSSBUCHSTABEN geschrieben, Trennung mehrerer Teile durch _
EPSILON, MAX_VALUE
Will man Programme weitergeben, so empfelt es sich, alle Bezeichner
englisch zu schreiben
Java unterstützt Unicode (Umlaute, Sonderzeichen, etc.), aber man sollte für
Bezeichner besser nur normale Buchstaben und Zahlen, evtl. den
Unterstrich _
5
Themen der heutigen Vorlesung
●
rekursive Methoden
●
Arrays
7
Rekursive Methoden
●
●
Methoden können sich auch selbst
aufrufen (Rekursion)
Viele mathematischen Funktionen sind
rekursiv defniert, z.B. die Fakultät:
8
Rekursive Methoden
●
Eine rekursive Defnition hat immer einen
nicht-rekursiven Basisfall
(Abbruchbedingung)
9
Rekursive Methoden
4! = 4 * 3!
= 4 * 3 * 2!
= 4 * 3 * 2 * 1!
= 4 * 3 * 2 * 1 * 0!
= 4 * 3 * 2 * 1 * 1
= 4 * 3 * 2 * 1
= 4 * 3 * 2
= 4 * 6
= 24
Rekursionstiefe
10
Demo: Rekursion.java
●
Aufgabe: Schreibe eine Methode fact(),
welche die Fakultät einer gegebenen
natürlichen Zahl n rekursiv berechnet
11
Rekursive Methoden
●
●
●
●
Beim Aufruf einer rekursiven Methode wird die
Aufrufstelle (Rücksprungadresse) und
aktuellen Parameter auf dem Stack der JavaMaschine gespeichert
Je höher die Rekursionstiefe, desto mehr
Speicher wird verbraucht
Ab einer gewissen Rekursionstiefe (~1500)
wirft die Java-Maschine einen
StackOverflowError
Für die meisten Programme ist das aber kein
Problem
12
Rekursive Methoden
●
Rekursion und Schleifen sind äquivalent in
ihrer Mächtigkeit
●
●
●
Jedes Programm mit Schleifen kann in ein
rekursives Programm ohne Schleifen überführt
werden
Jedes rekursive Programm kann in ein
Programm ohne Rekursion mit Schleifen
überführt werden
Es gibt einige Programmiersprachen, die
tatsächlich keine Schleifen enthalten,
funktionale Sprachen: Haskell, Scheme,...
13
Demo: Summe.java
●
●
Aufgabe: Schreibe eine Methode
summeVonBis() die zwei Ganzzahlen a
und b erhält und die Summe aller Zahlen
von a bis b zurückgibt. (Aufgabe C1/C2)
Schreibe eine äquivalente Methode
summeVonBisRekursiv(), welche die
gleiche Summe mittels Rekursion
berechnet.
14
Wechselseitige Rekursion
●
●
Eine Funktion kann auch rekursiv sein,
ohne sich selbst direkt aufzurufen
Demo: GeradeUngerade.java:
●
0 ist eine gerade Zahl
●
n ist gerade, wenn n-1 ungerade ist
●
n ist ungerade, wenn n-1 gerade ist
15
Demo: Hofstadter.java
●
Aufgabe: Schreibe ein Klasse
Hofstadter mit zwei Methoden male()
und female(), die jeweils einen long n
erhalten und dann die n-te Zahl der
jeweiligen Folge zurückgibt
16
Für die Mittagspause
http://www.stupidedia.org/stupi/Rekursiv
17
Arrays
●
Viele mathematische Probleme müssen
Vektoren (oder Matrizen) verarbeiten
●
●
Vektoren im zweidimensionalen Raum (R²)
bestehen aus einem x- und einem y-Wert
Vektoren im dreidimensionalen Raum (R³)
bestehen aus einem x-, einem y- und einem
z-Wert (Länge, Höhe, Breite)
18
Arrays
●
●
Beispiel: Sei p1 ein Punkt im zweidimensionalen Raum mit
den Koordinaten (1, 2) und p2 ein Punkt mit den Koordinaten
(3, 4)
Mit dem bisher bekannten Stof können wir einen Punkt mit
jeweils 2 einzelnen Variablen darstellen:
int p1_x = 1; int p1_y = 2; // Punkt p1
int p2_x = 3; int p2_y = 4; // Punkt p2
// Punkte p1 und p2 addieren
int p3_x = p1_x + p2_x;
int p3_y = p1_y + p2_y;
●
●
Noch schlimmer wird es, wenn wir viele Punkte in der
Berechnung oder höhere Dimensionen benötigen.
Für einen Punkt aus dem R^n benötigen wir hier n Variablen
19
Arrays
●
Ein weiteres Problem: Wir können keine Methode
schreiben, die 2 Vektoren/Punkte addiert
static ??? add2DPoints(int p1_x, int p1_y,
int p2_x, int p2_y) {
int p3_x = p1_x + p2_x;
int p3_y = p1_y + p2_y;
return ???;
}
●
Was ist der Ergebnistyp dieser Methode? Man müsste
ja eigentlich 2 Werte zurückgeben, aber das geht in
Java nicht.
20
Arrays
●
●
●
●
●
Die Lösung sind Arrays (Felder)
Ein Array ist eine nummerierte Sammlung von
Werten genau eines Typs (alle Komponenten
haben den selben Typ)
Die einzelnen Komponenten werden über ihren
Index angesprochen
Der Index beginnt bei 0 und endet bei der Länge
des Arrays – 1
Die Länge eines Arrays ist mit der Deklaration
festgelegt und kann nicht verändert werden
21
Arrays
●
Beispiel: Ein Array der Länge 10 (Typ
unbekannt)
22
Arrays deklarieren
●
Arrays werden wie Variablen deklariert,
allerdings wird dem Element-Typ ein []
nachgestellt:
// Uninitialisierte Arrays, Länge
// noch nicht festgelegt
int[] intArray;
long[] longArray;
double[] doubleArray;
23
Arrays deklarieren und
initialisieren
●
●
Wie Variablen können Arrays direkt bei
der Deklaration initialisiert werden
Jedes Array kennt seine Länge
int[] p1 = {1, 2};
System.out.println(p1.length) // ??
double[] p2 = {3.3, 7.9, -1.0};
System.out.println(p2.length) // ??
24
Index-Zugrif
●
●
Auf die einzelnen Elemente des Arrays
wird per Index zugegrifen
Ist der Index nicht gültig, d.h. < 0 oder >=
als die Array-Länge, wird eine
ArrayIndexOutOfBoundsException
geworfen
double[] p = {3.3, 7.9, -1.0};
// p[0] = 3.3,p[1] = 7.9,p[2] = -1.0
25
Demo: ArrayUtils.java
●
Aufgabe: Schreibe eine Klasse ArrayUtils,
die 3 Methoden
void printArray(int[] a)
void printArray(long[] a)
void printArray(double[] a)
enthält. Diese Methoden sollen das
übergebene Array einfach in der Form
{1, 2, 3, 4}
auf der Standardausgabe ausgeben.
26
Arrays zur Laufzeit initialisieren
●
In den meisten Programmen wollen wir zur Laufzeit
Arrays beliebiger Länge erzeugen
int[] oneToThree = new int[3];
// Speicher zuweisen, Array-Länge
// Nach der Speicherzuweisung haben alle
// Komponenten den Standartwert des jeweiligen
// Typs, also 0 bei int.
oneToThree[0] = 1; // Eigene Werte zuweisen
oneToThree[1] = 2;
oneToThree[2] = 3;
27
Demo: ArrayUtils.java
●
Aufgabe: Füge der Klasse ArrayUtils
die 3 Methoden
int[] readIntArray(int n)
long[] readLongArray(int n)
double[] readDoubleArray(int n)
hinzu. Diese Methoden sollen mittels
JConsole n Werte des jeweiligen Typs
einlesen und als Array zurückliefern.
28
Herunterladen