Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste."—  Präsentation transkript:

1 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

2 PKJ 2005/2 Stefan 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

3 PKJ 2005/3 Stefan 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!

4 PKJ 2005/4 Stefan 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?

5 PKJ 2005/5 Stefan 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)

6 PKJ 2005/6 Stefan 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?

7 PKJ 2005/7 Stefan 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!

8 PKJ 2005/8 Stefan 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; }

9 PKJ 2005/9 Stefan 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; }

10 PKJ 2005/10 Stefan 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 PKJ 2005/11 Stefan 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,1 feld

12 PKJ 2005/12 Stefan 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,1 feld f

13 PKJ 2005/13 Stefan 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,1 feld f 99

14 PKJ 2005/14 Stefan 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,1 feld f 99

15 PKJ 2005/15 Stefan 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?

16 PKJ 2005/16 Stefan 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+ ); } }

17 PKJ 2005/17 Stefan Dissmann Rekursive Methoden Was geschieht technisch? rekAusgabe(3) if (i>0) { rekAusgabe(i-1); System.out.print(i+ ); }

18 PKJ 2005/18 Stefan 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+ ); }

19 PKJ 2005/19 Stefan 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+ ); }

20 PKJ 2005/20 Stefan 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+ ); }

21 PKJ 2005/21 Stefan 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+ ); }

22 PKJ 2005/22 Stefan 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+ ); }

23 PKJ 2005/23 Stefan 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+ ); }

24 PKJ 2005/24 Stefan 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+ ); }

25 PKJ 2005/25 Stefan 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!

26 PKJ 2005/26 Stefan 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)

27 PKJ 2005/27 Stefan 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

28 PKJ 2005/28 Stefan Dissmann Rekursive Methoden Ein ernsthaftes Beispiel: Berechnung der Quersumme public static int quersumme(int z) { }

29 PKJ 2005/29 Stefan Dissmann Rekursive Methoden Berechnung der Quersumme: public static int quersumme(int z) { z%10 } Ermitteln der letzten Ziffer!

30 PKJ 2005/30 Stefan Dissmann Rekursive Methoden Berechnung der Quersumme: public static int quersumme(int z) { z%10 + quersumme(z/10); } Rekursion: Problemstellung auf verkleinertes Problem übertragen!

31 PKJ 2005/31 Stefan 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!

32 PKJ 2005/32 Stefan 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!

33 PKJ 2005/33 Stefan Dissmann Rekursive Methoden Berechnung der Quersumme: public static int quersumme(int z) { if (z>10) { return z%10 + quersumme(z/10); } else { return z; }


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

Ähnliche Präsentationen


Google-Anzeigen