Sie sind auf Seite 1von 79

Kapitel 

Methoden

© Prof. Dr. Steffen Heinzl
Methoden

© Prof. Dr. Steffen Heinzl
public static void main(String[] args)
{
Wenn wir mehrere Berechnungen in 
System.out.println("Was wollen Sie tun?"); einem Programm unterbringen 
System.out.println("1: PI‐Berechnung"); wollen, kann es schnell 
System.out.println("2: Quadratwurzelberechnung");
System.out.println("3: Betrag"); unübersichtlich werden.
//...
Scanner scanner = new Scanner(System.in);
int auswahl = scanner.nextInt();
if (auswahl == 1)
{ Wir benötigen eine bessere 
//PI‐Berechnung
//verwendet Quadratwurzelberechnung Unterteilung in einzelne 
} Programmteile!
else if (auswahl == 2)
{
//Quadratwurzelberechnung
}
else if (auswahl == 3)
{
//Betrag Dies geschieht durch sog. 
}
//... „Methoden“.
} © Prof. Dr. Steffen Heinzl
Methoden
 Eine Methode ähnelt einer mathematischen Funktion, sie nimmt ein (od. mehrere) 
Argument(e) entgegen und hat einen Rückgabewert.

Input: x0, Resultat: y
 Eine Methode kann also als eine Art Unterprogramm verwendet werden, die eine 
(od. mehrere) Eingaben verarbeitet und einen Wert zurückgibt.
 Durch solche Unterprogramme können Teilprobleme, die immer wieder gelöst 
werden müssen, gekapselt werden, z.B.:
 Berechnung des verzinsten Kapitals nach n Jahren 
 Berechnung des Kosinus
 Erkennung des Vorzeichens
 Hinzufügen von Daten in eine Tabelle
 Download einer Webseite
 Generierung eines Ebooks
© Prof. Dr. Steffen Heinzl
 …
Welche Methoden kennen 
wir eigentlich schon?
Methoden Rückgabewert Parameter
System.out.println void String oder int oder double, etc.
Math.pow double double, double
string.charAt char int
scanner.nextInt int ‐

© Prof. Dr. Steffen Heinzl
Methoden – Beispiel 
 Eine Methode, die eine Addition zweier Ganzzahlen durchführt, könnte 
folgendermaßen aussehen:

andere  Parameter
Rückgabetyp (durch Kommata getrennt)
Klassen u. 
Objekte  die Methode  Methodenname
können auf  wird der Klasse 
die Methode  zugeordnet
zugreifen
Signatur: Methodenname 
public static int add(int a, int b)
und Parameterliste
{
int result = a + b; Methodenrumpf 
return result; (Anweisungen innerhalb
} der Methode)
Rückgabewert 
Durch return wird (vom Rückgabetyp)
© Prof. Dr. Steffen Heinzl
die Methode verlassen 
public static int add(int a, int b)
{
int result = a + b;
return result;
}

Wie kann ich die Methode 
aufrufen?
Durch Schreiben von 
<Methodenname>(<Argument1>, <Argument2>, …)

Beispiel:

add(5,7); oder: int ergebnis;


ergebnis = add(5,7);

© Prof. Dr. Steffen Heinzl
Methoden ‐ return
 Mit return kann eine Methode auch vorzeitig verlassen 
werden.
 Beispiel: Eine Methode, die das Vorzeichen einer Zahl bestimmt:

public static int sign(double zahl)


{
if (zahl < 0)
return ‐1;
else if (zahl > 0)
return +1;
else
return 0;

© Prof. Dr. Steffen Heinzl
Methodenaufruf – Beispiel
public class MethodenBeispiel
{
public static int sign(double x)
{
if (x < 0) return ‐1;
else if (x > 0) return +1;
else return 0;
}
public static void main(String[] args)
{
//Betrag berechnen
int zahl = ‐5;
zahl = zahl * sign(zahl);
System.out.println(zahl);
}
© Prof. Dr. Steffen Heinzl
}
Methodenaufruf – Beispiel
public class MethodenBeispiel
{
public static int sign(double x)
{
if (x < 0) return ‐1;
else if (x > 0) return +1;
else return 0;
}
public static void main(String[] args)
{
wird zu ‐5 ausgewertet
//Betrag berechnen
wird zu ‐1 ausgewertet
int zahl = ‐5;
zahl = zahl * sign(zahl);
System.out.println(zahl);
} ‐5 * ‐1, also 5 wird in zahl geschrieben
© Prof. Dr. Steffen Heinzl
}
Methode ‐ Rückgabetypen
 Als Rückgabetyp kommen jegliche Datentypen in Frage.
void‐Rückgabetyp bedeutet, 
dass die Methode keinen Wert zurückgibt.
public static void printMenue()
{
System.out.println("***********************");
System.out.println("* 1: Werte einlesen   *");
System.out.println("* 2: Formel berechnen *");
System.out.println("***********************");
return;
}
... Die Methode kann mit einem 
//Aufruf: return (auch vorzeitig) verlassen werden
printMenue();

© Prof. Dr. Steffen Heinzl
Methodennamen
 Methodennamen beginnen wie Variablennamen mit einem Kleinbuchstaben und 
verwenden Camel Case.
 Methoden werden häufig nach Tätigkeiten benannt:
 gibMenueAus, erstelleDokument, …
 Ausnahme sind bspw. mathematische Methoden: Hier wird der bereits bekannte 
Name aus der Mathematik genommen.
 sin, cos, …

© Prof. Dr. Steffen Heinzl
Warum ist der Einsatz von 
Methoden sinnvoll?

z. B. Wiederverwendung von Code

Wir haben bspw. für mehrere Aufgaben 
bereits Potenzrechnung verwendet.

Aber: Wie schreibt man eine Methode, die 
die Potenz berechnet?

© Prof. Dr. Steffen Heinzl
Erste Überlegung:

Welchen Namen hat die Methode 
und welches Ergebnis?

Der Name sollte das kurz bezeichnen, was 
die Methode macht, z. B. potenz

Das Ergebnis der Potenz ist eine Zahl.

 Die Methode gibt also eine Zahl zurück.

public static int potenz()

© Prof. Dr. Steffen Heinzl
Zweite Überlegung:
Welche Argumente verarbeitet die Methode?
(Was gebe ich in die Methode hinein?)

Zur Berechnung der Potenz wird Basis und 
Exponent benötigt.

 Die Methode hat zwei Parameter.

public static int potenz(int basis, int exponent)


{

} © Prof. Dr. Steffen Heinzl
Dritte Überlegung:
Wie berechne ich die Potenz?

· · …·

n‐mal

 Schleife

© Prof. Dr. Steffen Heinzl
Wie berechne ich die Potenz?

int x = 3;
int n = 4;
int ergebnis = 1; //neutrales Element der Multiplikation

for (int i = 1; i <= n; i++)


{
ergebnis = ergebnis * x; 1· · · ·
}
System.out.println(ergebnis);

© Prof. Dr. Steffen Heinzl
Zusammenführung von Methodenkopf und 
Implementierung
public static int potenz(int basis, int exponent)
{
int x = 3;
int n = 4;
int ergebnis = 1; //neutrales Element der Multiplikation

for (int i = 1; i <= n; i++)


{
ergebnis = ergebnis * x;
}
System.out.println(ergebnis);
}

© Prof. Dr. Steffen Heinzl
Zusammenführung von Methodenkopf und 
Implementierung
public static int potenz(int basis, int exponent)
{
int x = 3;
int n = 4;
int ergebnis = 1; //neutrales Element der Multiplikation

for (int i = 1; i <= n; i++)


{ wir bekommen von außen die Werte 
ergebnis = ergebnis * x; für basis und exponent, rechnen 
} aber momentan mit x und n
System.out.println(ergebnis);
 wir müssen die Werte in der 
} Methode nicht selbst 
deklarieren

© Prof. Dr. Steffen Heinzl
Zusammenführung von Methodenkopf und 
Implementierung
public static int potenz(int basis, int exponent)
{

int ergebnis = 1; //neutrales Element der Multiplikation

for (int i = 1; i <= n; i++)


{ Die bisherigen Werte x und n 
ergebnis = ergebnis * x; müssen wir mit basis und exponent
} ersetzen.
System.out.println(ergebnis);
}

© Prof. Dr. Steffen Heinzl
Zusammenführung von Methodenkopf und 
Implementierung
public static int potenz(int basis, int exponent)
{

int ergebnis = 1; //neutrales Element der Multiplikation

for (int i = 1; i <= exponent; i++)


{ die bisherigen Werte x und n 
ergebnis = ergebnis * x; müssen wir mit basis und exponent
} ersetzen.
System.out.println(ergebnis);
}

© Prof. Dr. Steffen Heinzl
Zusammenführung von Methodenkopf und 
Implementierung
public static int potenz(int basis, int exponent)
{

int ergebnis = 1; //neutrales Element der Multiplikation

for (int i = 1; i <= exponent; i++)


{ die bisherigen Werte x und n 
ergebnis = ergebnis * basis; müssen wir mit basis und exponent
} ersetzen.
System.out.println(ergebnis);
}

© Prof. Dr. Steffen Heinzl
Zusammenführung von Methodenkopf und 
Implementierung
public static int potenz(int basis, int exponent)
{

int ergebnis = 1; //neutrales Element der Multiplikation

for (int i = 1; i <= exponent; i++)


{
ergebnis = ergebnis * basis;
} Die Methode muss einen 
Rückgabewert vom Typ int haben.
return ergebnis;
}

© Prof. Dr. Steffen Heinzl
Wie teste ich die Methode?
public class PotenzBeispiel
{
public static int potenz(int basis, int exponent)
{
int ergebnis = 1; //neutrales Element der Multiplikation
for (int i = 1; i <= exponent; i++)
{
ergebnis = ergebnis * basis;
}
return ergebnis;
}

public static void main(String[] args)


{
int ergebnis = potenz(3, 4);
System.out.println(ergebnis);
}
© Prof. Dr. Steffen Heinzl
}
Kann die Methode noch sinnvoll 
verallgemeinert werden?
public static int potenz(int basis, int exponent)
{
int ergebnis = 1; //neutrales Element der Multiplikation
for (int i = 1; i <= exponent; i++)
{
ergebnis = ergebnis * basis;
}
return ergebnis;
}

Wird ein Wert verwendet, den man variabel 
machen könnte?

Können Datentypen ausgeweitet werden?

© Prof. Dr. Steffen Heinzl
Kann die Methode noch sinnvoll 
verallgemeinert werden?
public static int potenz(int basis, int exponent)
{
int ergebnis = 1; //neutrales Element der Multiplikation
for (int i = 1; i <= exponent; i++)
{
ergebnis = ergebnis * basis;
}
return ergebnis;
} Ausweitung von Datentypen

public static double potenz(double basis, int exponent)


{
double ergebnis = 1; //neutrales Element der Multiplikation
for (int i = 1; i <= exponent; i++)
{
ergebnis = ergebnis * basis;
}
return ergebnis;
© Prof. Dr. Steffen Heinzl
}
Nochmal Sichtbarkeit von Variablen
public class PotenzBeispiel
{
public static int potenz(int basis, int exponent)
{
int ergebnis = 1; //neutrales Element der Multiplikation
for (int i = 1; i <= exponent; i++)
{
ergebnis = ergebnis * basis;
}
return ergebnis; basis und exponent sind sichtbar
}

public static void main(String[] args)


{
int ergebnis = potenz(3, 4);
System.out.println(ergebnis);
}
© Prof. Dr. Steffen Heinzl
}
public class PotenzBeispiel Welche Aussage stimmt?
{
public static int potenz(int basis, int exponent)

A:
{ Hinter ergebnis verbirgt sich in den 
int ergebnis = 1; 
Methoden main und potenz jeweils der 
gleiche Speicherplatz.
for (int i = 1; i <= exponent; i++)
{
Es wurde vergessen, ergebnis aus der 

B:
ergebnis = ergebnis * basis;
} main‐Methode an die Methode potenz
return ergebnis; zu übergeben.
}
Der Compiler wirft einen Fehler, weil der 
public static void main(String[] args)
{
int ergebnis = potenz(3, 4);
C: Name ergebnis in zwei unterschiedlichen
Methoden verwendet wurde.

System.out.println(ergebnis);
Hinter ergebnis verbirgt sich in den 
}
}
D: Methoden main und potenz jeweils ein
unterschiedlicher Speicherplatz.
© Prof. Dr. Steffen Heinzl
Nochmal Sichtbarkeit von Variablen
public class PotenzBeispiel
{
public static int potenz(int basis, int exponent)
{
int ergebnis = 1; //neutrales Element der Multiplikation
for (int i = 1; i <= exponent; i++)
{
ergebnis = ergebnis * basis;
}
return ergebnis; ergebnis ist sichtbar
}
Zwei unterschiedliche 
public static void main(String[] args) Variablen (u. Speicherplätze) 
{
trotz gleichen Namens
int ergebnis = potenz(3, 4);
System.out.println(ergebnis); ergebnis ist sichtbar
}
© Prof. Dr. Steffen Heinzl
}
Methodenbeispiel ‐ Betrag
public class MethodenBeispiel
{
public static double absoluteValue(double x)
{
if (x < 0) return ‐x;
else return x;
}  
public static void main(String[] args)
{
System.out.println(absoluteValue(‐5));
System.out.println(absoluteValue(5));
System.out.println(absoluteValue(0));
}
}

© Prof. Dr. Steffen Heinzl
public class MethodenBeispiel2
{
Methode verwendet Methode
public static double absoluteValue(double x)
{
return x*sign(x);
} Methode absoluteValue
public static int sign(double zahl) verwendet Methode sign zur 
{
if (zahl < 0) return ‐1;
Bestimmung des Betrags
else if (zahl > 0) return +1;
else return 0;
}  
public static void main(String[] args)
{
System.out.println(absoluteValue(‐5));
}
}

© Prof. Dr. Steffen Heinzl
Einfache 2D‐Grafik

© Prof. Dr. Steffen Heinzl
Zum Ausprobieren: Graphik
 Java kann mehr als nur die Kommandozeile:
import java.applet.Applet;
import java.awt.*;

public class Haus extends Applet {
public void paint (Graphics g) {
Graphics2D g2D = (Graphics2D) g;
//Haus
g2D.setColor(Color.DARK_GRAY);
g2D.setStroke(new BasicStroke(5)); //Pinselbreite 5
g2D.drawRect(150, 150, 100, 100);
//Dach
g2D.setColor(Color.RED);
g2D.drawLine(149, 150, 200, 75);
g2D.drawLine(251, 150, 200, 75);
g2D.drawLine(154, 146, 247, 146);
//Tür
g2D.setColor(Color.BLACK);
g2D.drawRect(210, 225, 15, 25);
}
}

© Prof. Dr. Steffen Heinzl
Zum Ausprobieren: Graphik
 Java kann mehr als nur Programme auf der Kommandozeile:
import java.applet.Applet;
import java.awt.*;

public class Haus extends Applet {
public void paint (Graphics g) {
Graphics2D g2D = (Graphics2D) g;
//Haus
g2D.setColor(Color.DARK_GRAY);
g2D.setStroke(new BasicStroke(5)); //Pinselbreite 5
g2D.drawRect(150, 150, 100, 100);
//Dach
g2D.setColor(Color.RED);
g2D.drawLine(149, 150, 200, 75);
g2D.drawLine(251, 150, 200, 75);
g2D.drawLine(154, 146, 247, 146);
//Tür
g2D.setColor(Color.BLACK);
g2D.drawRect(210, 225, 15, 25); Wie ergänzt man das Haus 
}
}
um ein Fenster?

© Prof. Dr. Steffen Heinzl
Rekursion

© Prof. Dr. Steffen Heinzl
Aufgaben: Potenz, Fakultät

© Prof. Dr. Steffen Heinzl
Rekursive Methodenaufrufe
 Unter Rekursion versteht man, dass eine Methode sich selbst erneut aufruft. 
 Dabei wird in der Regel ein veränderter Parameter übergeben. 
 Die Aufrufe erfolgen solange bis eine bestimmte Abbruchbedingung erfüllt ist.
 Rekursionen kann man anstelle von Schleifen verwenden.

© Prof. Dr. Steffen Heinzl
Fakultät – Induktive Definition
 Induktive (rekursive) Definition der Fakultät:

Definition: Beispiel:
Für ∈ gilt: 5! 5 · 4!
0! ≔ 1 5 · 4 · 3!
1 !≔ 1 · ! 5 · 4 · 3 · 2!
5 · 4 · 3 · 2 · 1!
5 · 4 · 3 · 2 · 1 · 0!
5·4·3·2·1·1
weitere Beispiele:
n! · 1 · 2 … · 3 · 2 · 1 · 0!

© Prof. Dr. Steffen Heinzl
Fakultät – Rekursive Berechnung
Die Fakultät kann in einer rekursiven Methode berechnet werden:

Wenn n gleich 0 ist, 
public static long fak(int n) wird die Methode verlassen 
und die Rekursion beendet.
{
if (n==0) return 1; 0! ≔ 1
return n * fak(n‐1); 1 !≔ 1 · !
}

© Prof. Dr. Steffen Heinzl
Summe – rekursive Berechnung
 Analog zur Fakultät lässt sich auch die Summe in einer rekursiven Methode berechnen.
 Mathematisch:
, n>0

 Als Methode:
public static int sum(int n)
{ Wird die Summe von der 
if (n == 0) return 0; Zahl 0 gebildet, wird 0 
return n + sum(n‐1); zurückgegeben.
}

© Prof. Dr. Steffen Heinzl
Rekursive Aufrufe – Beispiel 
public static int sum(int n)
{
if (n == 0) return 0;
return n + sum(n‐1);
}

public static void main(String[] args)
{
System.out.println(sum(3));
} © Prof. Dr. Steffen Heinzl
Rekursive Aufrufe – Beispiel 
public static int sum(int n)
{
if (3 == 0) return 0;
return 3 + sum(3‐1);
}
2 public static int sum(int n)
{
if (2 == 0) return 0;
return 2 + sum(2‐1);
}
public static int sum(int n) 1 public static int sum(int n)
{ {
if (0 == 0) return 0; if (1 == 0) return 0;
return 0 + sum(0‐1); return 1 + sum(1‐1);
} public static void main(String[] args) }
0
{
System.out.println(sum(3));
} © Prof. Dr. Steffen Heinzl
Rekursive Aufrufe – Beispiel (ctd.)
public static int sum(int n)
{
if (3 == 0) return 0;
return 3 + sum(3‐1);
}
6public static int sum(int n)
{
if (2 == 0) return 0;
return 2 + sum(2‐1);
}
public static int sum(int n) 3 public static int sum(int n)
{ {
if (0 == 0) return 0; if (1 == 0) return 0;
return 0 + sum(0‐1); return 1 + sum(1‐1);
} }
public static void main(String[] args) 1 0
{
System.out.println(sum(3));
© Prof. Dr. Steffen Heinzl
© Prof. Dr. Steffen Heinzl
}
Rekursive Aufrufe – Beispiel (alternativ)
public static int sum(int n)
{
if (n == 0) return 0;
return n + sum(n‐1);
}

n == 0 ist falsch, daher return 3 + sum(2). Damit die Rückgabe erfolgen 
kann, muss zunächst sum(2) evaluiert werden.
n == 0 ist falsch, da n = 2. Daher return 2 + sum(1). Damit die Rückgabe 
erfolgen kann, muss zunächst sum(1) evaluiert werden.
n == 0 ist falsch, da n = 1. Daher return 1 + sum(0). Damit die Rückgabe 
erfolgen kann, muss zunächst sum(0) evaluiert werden.
n == 0 ist wahr, daher return 0;
Nun werden die Ausdrücke wieder rückwärts zusammengesetzt:
sum(0) = 0
sum(1) = 1 + sum(0) = 1
sum(2) = 2 + sum(1) = 2 + 1 = 3
© Prof. Dr. Steffen Heinzl
sum(3) = 3 + sum(2) = 3 + 3 = 6
public static int sum(int m, int n)
{

Welche Lösung ist die richtige, um 
A: }
if (n==m) return m;
else return sum(m,n‐1);

folgende induktive Definition mit einer 
rekursiven Methode in Java abzubilden? public static int sum(int m, int n)
{

B: }
if (n==m) return m;
else return n + sum(n‐1);

: , public static int sum(int m, int n)


{

: ,
C: }
if (n==m) return m;
else return n + sum(m,n‐1);

public static int sum(int m, int n)


{

D: }
if (n==0) return m;
else return n + sum(m,n‐1);
© Prof. Dr. Steffen Heinzl
Potenz – Induktive Definition
 Induktive (rekursive) Definition der Potenz:

Definition: Beispiele:
Für ∈ , ∈ gilt: 3 1
≔1 0 1
≔ · 5 5 ·5
5 · 5 · 5
5 · 5 · 5 · 5
5 · 5 · 5 · 5 · 5
1 · 5 · 5 · 5 · 5 625
Wie kann die Potenz in einer 
rekursiven Methode 
berechnet werden?
Zur Übung!
© Prof. Dr. Steffen Heinzl
Cosinus‐Berechnung 
als Beispiel zur Berechnung 
mathematischer Funktionen

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
 Der Cosinus lässt sich durch folgende Reihe berechnen:

: → 1,1

≔ 1
2 !

 Welche Parameter und welchen Rückgabewert hat die Methode?

public static double cos(double x)

 Wie sehen die ersten fünf Glieder aus?

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
 Die ersten 5 Reihenglieder sehen wie folgt aus:

cos 1 ∓⋯
2! 4! 6! 8!

 Wie kann ein Algorithmus (eine Rechenvorschrift) aussehen, 
die den Cosinus berechnet?
 Wir schauen zunächst, wie sich Zähler und Nenner in jedem 
Schritt verändern.

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;

Wir belegen den 
ersten Summanden vor!

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;

for (int i = 2;        ;     )
Wir belegen den  {
ersten Summanden vor!
Starten die Schleife 
beim 2. Summanden

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;

for (int i = 2;        ;     )
{
Der Zähler berechnet 
zaehler = zaehler * x * x * (‐1);
sich, indem man den 
alten Zähler mit x2
multipliziert (und das 
Vorzeichen ändert).

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;

for (int i = 2;        ;     )
{
Der Nenner berechnet 
zaehler = zaehler * x * x * (‐1);
sich, indem man den  nenner = nenner * i * (i‐1);
alten Nenner mit dem 
Laufindex i und i‐1 
multipliziert.

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;
double summand;
for (int i = 2;        ;     )
{
Aufaddieren!
zaehler = zaehler * x * x * (‐1);
nenner = nenner * i * (i‐1);
summand = zaehler/nenner;
summe = summe + summand;
}

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;
double summand; 
i=i+2
for (int i = 2;        ;     )
{
Um wie viel muss i 
zaehler = zaehler * x * x * (‐1);
erhöht werden? nenner = nenner * i * (i‐1);
summand = zaehler/nenner;
summe = summe + summand;
}

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;
double summand; 
for (int i = 2;        ;i=i+2)
{
Wie wählen wir die 
zaehler = zaehler * x * x * (‐1);
Laufbedingung? nenner = nenner * i * (i‐1);
summand = zaehler/nenner;
summe = summe + summand;
}

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;
double summand = 1; 
for (int i = 2; summand > 1E‐15 ||       
summand < ‐1E‐15; i=i+2)
Wie wählen wir die 
{
Laufbedingung? zaehler = zaehler * x * x * (‐1);
nenner = nenner * i * (i‐1);
summand = zaehler/nenner;
summe = summe + summand;
}

© Prof. Dr. Steffen Heinzl
Methode zur Berechnung des Cosinus
public static double cos(double x)
{
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;
double summand = 1; 
for (int i = 2; summand > 1E‐15 ||       
summand < ‐1E‐15; i=i+2)
Rückgabewert ergänzen!
{
zaehler = zaehler * x * x * (‐1);
nenner = nenner * i * (i‐1);
summand = zaehler/nenner;
summe = summe + summand;
}
return summe;
}
© Prof. Dr. Steffen Heinzl
Methodendokumentation
/**
* Berechnet den Kosinus von der übergebenen Zahl x.
* @param x reelle Zahl (in RAD), von der der Kosinus berechnet werden soll.
* @return Ergebnis des Kosinus; reelle Zahl zwischen ‐1 und 1 (beide inklusive)
*/
public static double cos(double x) Wenn andere die Methode 
{ verwenden sollen, sollten 
double zaehler = 1.0;
double nenner = 1.0; wir sie entsprechend 
double summe = 1.0; dokumentieren!
double summand = 1;
for (int i = 2; summand > 1E‐15 || summand < ‐1E‐15; i = i + 2)
{
zaehler = zaehler * x * x * (‐1);
nenner = nenner * i * (i ‐ 1);
summand = zaehler / nenner;
summe = summe + summand;
}
return summe;
} © Prof. Dr. Steffen Heinzl
Anderen Methoden zur Verfügung stellen
package de.fhws;
public class MyMath {
/**
* Berechnet den Kosinus von der übergebenen Zahl x.
* @param x reelle Zahl (in RAD), von der der Kosinus berechnet werden soll.
* @return Ergebnis des Kosinus; reelle Zahl zwischen ‐1 und 1 (beide inklusive)
*/
public static double cos(double x) {
double zaehler = 1.0;
double nenner = 1.0;
double summe = 1.0;
double summand = 1;
for (int i = 2; summand > 1E‐15 || summand < ‐1E‐15; i = i + 2) {
zaehler = zaehler * x * x * (‐1);
nenner = nenner * i * (i ‐ 1);
summand = zaehler / nenner;
summe = summe + summand;
}
return summe;
} © Prof. Dr. Steffen Heinzl
}
Methoden einbinden

Um die Methode aufrufen zu können, 
muss die Klasse MyMath auf dem 
Klassenpfad liegen.

© Prof. Dr. Steffen Heinzl
Mathematische Funktionen
 Die Klasse java.lang.Math stellt eine Menge an geläufigen mathematischen 
Konstanten und Funktionen zur Verfügung:

Mathematische Funktion oder Konstante Methode oder Konstante in Java
double Math.E
double Math.PI
double Math.abs(double x)
cos double Math.cos(double x)
sin double Math.sin(double x)
double Math.sqrt(double x)
double Math.pow(double x, double y)
gibt Zufallszahl x mit  ∈ 0,1 zurück double Math.random()

© Prof. Dr. Steffen Heinzl
Finch

Methoden von anderen benutzen

© Prof. Dr. Steffen Heinzl
Finch

source: http://www.finchrobot.com/sites/default/files/BirdBrain1010‐0005.jpg

 Lichtsensor
 Temperatursensor
 Sensor für Hindernisse
 Beschleunigungsmesser
 Motoren
 Buzzer
 RGB “Schnabel”‐LED
 Stiftbefestigung (zum Malen)
 Strom über USB Kabel

source: http://www.finchrobot.com/sites/default/files/finchie.jpg

© Prof. Dr. Steffen Heinzl
Finch einrichten
 von http://www.finchrobot.com/downloads Eclipse package herunterladen!
 FinchJava.zip entpacken
 Ordner FinchSoftware muss nachher zu sehen sein.

 In Eclipse:
 Neues Projekt anlegen
 Finch Software\SourceFiles\Code nach src kopieren 
 Finch Software\javadoc in das Projekthauptverzeichnis kopieren
 civil.dll, finch.jar kopieren in das Projekthauptverzeichnis
 finch.jar dem Klassenpfad hinzufügen (Rechtsklick auf finch.jar ‐> Build Path ‐> 
Add to Build Path

© Prof. Dr. Steffen Heinzl
Javadoc einrichten
 Um die Hilfe zu den Methoden zu sehen, 

muss das JavaDoc eingerichtet werden.

© Prof. Dr. Steffen Heinzl
Javadoc einrichten
 Rechte Taste auf finch.jar ‐> Properties
 Unter JavaDoc URL folgendes eintragen:
 file:/<absoluter Pfad zum Eclipse Workspace>/Finch2/javadoc/ 
 z.B.
 file:/C:/W/WorkspaceProgrammierenI/Finch2/javadoc/ 

© Prof. Dr. Steffen Heinzl
Finch testen
 Finch per USB an den Rechner anschließen
 Dance.java in Eclipse starten 

© Prof. Dr. Steffen Heinzl
Switch‐Statement

© Prof. Dr. Steffen Heinzl
switch‐Statement
 Ein switch‐Statement ist eine Kontrollstruktur, die i.d.R. alternativ 
zu einer if‐Anweisung mit mehreren else‐ifs eingesetzt wird.
 Das switch‐Anweisung nimmt 
 eine ganze Zahl (byte, char, short, int, aber kein long), 
 einen String
 oder einen Enum (später dazu mehr)
entgegen.
int zahl = (int) (Math.random() * 6 + 1);
switch (zahl) {

}
© Prof. Dr. Steffen Heinzl
switch‐Statement
 Die switch‐Anweisung beinhaltet verschiedene case‐Labels.
int zahl = (int) (Math.random() * 6 + 1);
switch (zahl) {
case 1:
System.out.println("Es wurde eine 1 gewürfelt.");
break;
case 3:
System.out.println("Es wurde eine 3 gewürfelt.");
case 4:
System.out.println("Es wurde eine 3 oder 4 gewürfelt.");
break; Im case muss ein konstanter 
} Ausdruck vom Typ der Variablen 
Es wird der case betreten, der mit zahl übereinstimmt.  im switch stehen
Von dort werden alle Anweisungen bis zum nächsten 
break oder dem Ende des switch‐Blocks ausgeführt. © Prof. Dr. Steffen Heinzl
switch‐Statement
 Die switch‐Anweisung beinhaltet verschiedene case‐Labels.

int zahl = (int) (Math.random() * 6 + 1);
switch (zahl) {
case 1:
System.out.println("Es wurde eine 1 gewürfelt.");
break;
case 3:
case 4:
System.out.println("Es wurde eine 3 oder 4 gewürfelt.");
break;
default:
System.out.println("Es wurde keine 1, 3 oder 4 gewürfelt.");
}

 Trifft kein case zu, wird die default‐Anweisung ausgeführt.© Prof. Dr. Steffen Heinzl
public static int tageImMonat(int monat) {
int tage;
switch(monat) {
case 1:
case 3: Methode zur Zuordnung 
case 5:
case 7: der Anzahl Tage in einem 
case 8:
case 10: Monat
case 12:
tage = 31;
break;
case 2:
tage = 28;
break;
case 4:
case 6: The local variable tage may not have
case 9: been initialized
case 11:
tage = 30;
break;
}
return tage;
© Prof. Dr. Steffen Heinzl
}
public static int tageImMonat(int monat) {
int tage = ‐1;
switch(monat) {
case 1:
case 3: Methode zur Zuordnung 
case 5:
case 7: der Anzahl Tage in einem 
case 8:
case 10: Monat
case 12:
tage = 31;
break;
case 2:
tage = 28;
break;
case 4:
case 6:
case 9:
case 11:
tage = 30;
break;
}
return tage;
© Prof. Dr. Steffen Heinzl
}
public static int tageImMonat(int monat) {
int tage;
switch(monat) {
case 1:
case 3:
case 5:
Methode zur Zuordnung 
case 7:
case 8:
der Anzahl Tage in einem 
case 10:
case 12:
Monat
tage = 31;
break;
case 2:
tage = 28;
break;
case 4:
case 6:
case 9:
case 11:
tage = 30;
break;
default:
tage = ‐1;
}
return tage; © Prof. Dr. Steffen Heinzl
}
public static int tageImMonat(int monat) {
int tage;

switch(monat) {
case 2:
Methode zur Zuordnung 
tage = 28;
break;
der Anzahl Tage in einem 
case 4: Monat
case 6:
case 9:
case 11:
tage = 30;
break;
default:
tage = 31;
}
return tage;
}
Was passiert bei monat < 1 oder monat > 12 ?

© Prof. Dr. Steffen Heinzl
public static int tageImMonat(int monat) {
int tage;
if (monat > 12 || monat < 1) return ‐1;
switch(monat) {
case 2:
Methode zur Zuordnung 
tage = 28;
break;
der Anzahl Tage in einem 
case 4: Monat
case 6:
case 9:
case 11:
tage = 30;
break;
default:
tage = 31;
}
return tage;
}
Was passiert bei monat < 1 oder monat > 12 ?

© Prof. Dr. Steffen Heinzl
public static int tageImMonat(String monat)
{
int tage;
switch(monat)
{ Methode zur Zuordnung 
case "Februar":
tage = 28; der Anzahl Tage in einem 
break;
case "April": Monat
case "Juni":
case "September":
case "November":
tage = 30;
break;
default:
tage = 31;  
}
return tage;
}

© Prof. Dr. Steffen Heinzl
Was ist der Wert von routeNumber nach dem switch‐Block?

String zipCode = "93705";
int routeNumber;
switch (zipCode)
A: 0
{
case "93705":
case "93706":
routeNumber = 1;
B: 1
break;
case "93710":
case "93720":
routeNumber = 2;
break;
C: 2
}
default:
routeNumber = 0;
break;
D: nicht definiert

© Prof. Dr. Steffen Heinzl

Das könnte Ihnen auch gefallen