Dr. Volker Riediger Tassilo Horn -...

27
1 Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger|[email protected] WiSe 2012/13

Transcript of Dr. Volker Riediger Tassilo Horn -...

1

Einführung in die Java-Programmierung

Dr. Volker Riediger

Tassilo Horn

riediger|[email protected]

WiSe 2012/13

2

Rückblick

● Schleifen● while● do-while● for

● Methoden● Verfahren: Intervallschachtelung

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 _

7

Themen der heutigen Vorlesung

● rekursive Methoden

● Arrays

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

17

Für die Mittagspause

http://www.stupidedia.org/stupi/Rekursiv

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

22

Arrays

● Beispiel: Ein Array der Länge 10 (Typ unbekannt)

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;

28

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.