View
213
Download
0
Category
Preview:
Citation preview
1
Einführung in die Java-Programmierung
Dr. Volker Riediger
Tassilo Horn
riediger|horn@uni-koblenz.de
WiSe 2012/13
3
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
4
Beispiele in Eclipse importieren
● Nach dem Entpacken der ZIP-Dateijavakurs-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]
5
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 geschriebenprintValue(), readInt(), sqrt(), sin(), cos(), wurzel()
● Variablennamen sind i.d.R. Substantive in camelCase mit Kleinbuchstabe am Anfangoder im Falle von mathematischen Funktionen die Formelzeichenzaehler, 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 _
8
Rekursive Methoden
● Methoden können sich auch selbst aufrufen (Rekursion)
● Viele mathematischen Funktionen sind rekursiv defniert, z.B. die Fakultät:
9
Rekursive Methoden
● Eine rekursive Defnition hat immer einen nicht-rekursiven Basisfall (Abbruchbedingung)
10
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
11
Demo: Rekursion.java
● Aufgabe: Schreibe eine Methode fact(), welche die Fakultät einer gegebenen natürlichen Zahl n rekursiv berechnet
12
Rekursive Methoden
● Beim Aufruf einer rekursiven Methode wird die Aufrufstelle (Rücksprungadresse) und aktuellen Parameter auf dem Stack der Java-Maschine 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
13
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,...
14
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.
15
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
16
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
18
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)
19
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
20
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.
21
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
23
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;
24
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) // ??
25
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
26
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.
27
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;
Recommended