PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene...

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

Transcript of PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene...

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;

}

}