33
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste und Rumpf werden vereinbart mit diesen Angaben werden aufgerufen mit Namen und Parametern

PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

Embed Size (px)

Citation preview

Page 1: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/1Stefan Dissmann

Zusammenfassung Vorwoche

Methoden

• sind mit einem Namen versehene Programmabschnitte

• besitzen Rückgabetyp, Namen, Parameterliste und Rumpf

• werden vereinbart mit diesen Angaben

• werden aufgerufen mit Namen und Parametern

Page 2: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/2Stefan Dissmann

Zusammenfassung Vorwoche

Vereinbarung:public static int mwstVonBetrag(int betrag) {

return betrag*16/116;}

• Bezeichnung in Vereinbarung:formaler Parameter (hier: betrag)

• Rückgabewert: return

• Sonderfälle:• leere Parameterliste = „leere“ Klammern: ()• kein Rückgabetyp: void

Page 3: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/3Stefan Dissmann

Zusammenfassung Vorwoche

Aufruf:int mwst=0, b=2450;mwst = mwstVonBetrag(b);mwst = mwstVonBetrag(7650);

Bezeichnung in Vereinbarung:aktueller Parameter (hier: b und 7650)

Sonderfälle:• leere Parameterliste = „leere“ Klammern: ()• kein Rückgabewert: keine Zuweisung möglich!

Page 4: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/4Stefan Dissmann

Methoden (Parameter)

Beispiel:public static void main(String[] args) {

int p=5;m(p);System.out.println(p);

}

public static void m(int p) {p = p++;

}

Was wird ausgegeben?

Page 5: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/5Stefan Dissmann

Methoden (Parameter)

Fortsetzung Beispiel 1:public static void m1(int p) {

p = p++;}

Bei einfachen Typen als Parameter wird beim Aufruf ein Wert übergeben: Wertübergabe

Daher wahlweise möglich:Übergabe einer Variablen: mwstVonBetrag(b)

oder eines konstanten Wertes: mwstVonBetrag(7650)

Page 6: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/6Stefan Dissmann

Methoden (Felder als Parameter)

Beispiel (analog zu Beispiel 1):public static void main(String[] args) {

int[] f={5,6,7};m2(f);System.out.println(f[1]);

}

public static void m2(int[] f) {f[1] = 99; // gefährlich!

}

Was wird ausgegeben?

Page 7: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/7Stefan Dissmann

Methoden (Felder als Parameter)

Fortsetzung Beispiel 2:public static void m2(int[] f) {

f[1] = 99;}

Bei Feldern als Parameter wird beim Aufruf auf das Feld verwiesen (und keine Kopie übergeben): Referenzübergabe

Daraus folgt:Methoden mit Feldern als Parameter können Seiteneffekte außerhalb der Methode erzeugen!

Page 8: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/8Stefan Dissmann

Methoden (Felder als Parameter - Beispiel) public static void main(String[] args) { int[] feld={11,4,9,34,6,1}; for (int i=0; i<feld.length; i++) System.out.print(feld[i] + ", "); sort(feld); for (int i=0; i<feld.length; i++) System.out.print(feld[i] + ", "); }

public static void sort(int[] f) { for (int i=0; i<f.length; i++) for (int j=0; j<f.length-i-1; j++) if (f[j]>f[j+1]) { int h=f[j]; f[j]=f[j+1]; f[j+1]=h; } }

Page 9: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/9Stefan Dissmann

Methoden (Felder als Parameter - Beispiel)Frage:

Könnte sort das übergebene Feld auch komplett ersetzen?Etwa in folgender Form:

public static void sort(int[] f) {f = new int[1];f[0] = 99;

}

Page 10: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/10Stefan Dissmann

Methoden (Felder als Parameter - Beispiel)Analyse:

public static void main(String[] args) { int[] feld={11,4,9,34,6,1};

…sort(feld);…

}

public static void sort(int[] f) {f = new int[1];f[0] = 99;

}

Page 11: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/11Stefan Dissmann

Methoden (Felder als Parameter - Beispiel)Analyse:

public static void main(String[] args) { int[] feld={11,4,9,34,6,1};

…sort(feld);…

}

public static void sort(int[] f) {f = new int[1];f[0] = 99;

}

11,4,9,34,6,1feld

Page 12: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/12Stefan Dissmann

Methoden (Felder als Parameter - Beispiel)Analyse:

public static void main(String[] args) { int[] feld={11,4,9,34,6,1};

…sort(feld);…

}

public static void sort(int[] f) {f = new int[1];f[0] = 99;

}

11,4,9,34,6,1feld

f

Page 13: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/13Stefan Dissmann

Methoden (Felder als Parameter - Beispiel)Analyse:

public static void main(String[] args) { int[] feld={11,4,9,34,6,1};

…sort(feld);…

}

public static void sort(int[] f) {f = new int[1];f[0] = 99;

}

11,4,9,34,6,1feld

f 99

Page 14: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/14Stefan Dissmann

Methoden (Felder als Parameter - Beispiel)Aber möglich ist natürlich:

public static void main(String[] args) { int[] feld={11,4,9,34,6,1};

…feld = sort(feld);…

}

public static int[] sort(int[] f) {f = new int[1];f[0] = 99;return f;

}

11,4,9,34,6,1feld

f 99

Page 15: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/15Stefan Dissmann

Rekursive Methoden

In allen Beispielen:Methoden rufen andere Methoden auf!

Besonderer Fall:Eine Methode ruft sich selbst auf!

2 Fragen:•Was geschieht technisch?•Warum sollte man das tun?

Page 16: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/16Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

Beispiel:public static void main(String[] args) {

rekAusgabe(3);}

public static void rekAusgabe(int i) {if (i>0) {

rekAusgabe(i-1);System.out.print(i+“ “);

}}

Page 17: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/17Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

rekAusgabe(3)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

Page 18: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/18Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

rekAusgabe(3)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(2)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

Page 19: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/19Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

rekAusgabe(3)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(2)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(1)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

Page 20: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/20Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

rekAusgabe(3)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(2)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(1)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(0)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

Page 21: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/21Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

rekAusgabe(3)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(2)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(1)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(0)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

Page 22: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/22Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

rekAusgabe(3)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(2)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(1)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(0)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

Page 23: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/23Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

rekAusgabe(3)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(2)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(1)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(0)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

Page 24: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/24Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

rekAusgabe(3)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(2)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(1)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

rekAusgabe(0)

if (i>0) { rekAusgabe(i-1); System.out.print(i+“ “); }

Page 25: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/25Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

public static void rekAusgabe(int i) {if (i>0) {

rekAusgabe(i-1);System.out.print(i+“ “);

}}

Das Beispiel zeigt:• Jede Instanz von rekAusgabe hat ein eigenes i!• Jede Instanz von rekAusgabe hat einen eigenen

„Programmzähler“•Daher arbeiten alle Instanzen voneinander unabhängig!

Page 26: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/26Stefan Dissmann

Rekursive Methoden

Was geschieht technisch?

public static void rekAusgabe(int i) {if (i>0) {

rekAusgabe(i-1);System.out.print(i+“ “);

}}

Das Beispiel zeigt auch:Damit die rekursiven Aufrufe enden,muss die Methode ein Abbruchkreiterium enthalten!(hier: i>0)

Page 27: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/27Stefan Dissmann

Rekursive Methoden

Warum sollte man überhaupt mit rekursiven Methoden programmieren?

• Problemstellung ist vorgegeben!• Lösungsidee löst Teilproblem und

reduziert Restaufgabe auf genau die gleiche Problemstellung:

dann kann die Restaufgabe genauso gelöst werden = erneutes Anwendung der Lösungsidee

Page 28: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/28Stefan Dissmann

Rekursive Methoden

Ein ernsthaftes Beispiel: Berechnung der Quersumme

public static int quersumme(int z) {

}

Page 29: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/29Stefan Dissmann

Rekursive Methoden

Berechnung der Quersumme:

public static int quersumme(int z) {

z%10

}

Ermitteln der letzten Ziffer!

Page 30: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/30Stefan Dissmann

Rekursive Methoden

Berechnung der Quersumme:

public static int quersumme(int z) {

z%10 + quersumme(z/10);

}

Rekursion:Problemstellung auf „verkleinertes“ Problem übertragen!

Page 31: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/31Stefan Dissmann

Rekursive Methoden

Berechnung der Quersumme:

public static int quersumme(int z) { if (z>10) {

return z%10 + quersumme(z/10);

}

}

Festlegen, wann Ergebnis geliefert werden soll!

Page 32: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/32Stefan Dissmann

Rekursive Methoden

Berechnung der Quersumme:

public static int quersumme(int z) { if (z>10) {

return z%10 + quersumme(z/10);

} else {

return z;

}

}

Und festlegen, was bei Abbruch geschehen soll!

Page 33: PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste

PKJ 2005/33Stefan Dissmann

Rekursive Methoden

Berechnung der Quersumme:

public static int quersumme(int z) { if (z>10) {

return z%10 + quersumme(z/10);

} else {

return z;

}

}