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

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Zusammenfassung der Vorwoche
Kritische Betrachtung
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Rekursion Was ist Rekursion? Was sind rekursive Methoden?
Java: Objektorientierte Programmierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Einführung in die Programmierung mit Java
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
Programmieren mit JAVA
Praxis-Repetitorium JAVA zusätzliche, ergänzende Lehrveranstaltung
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher bekannt: Einfache Typen (z.B. int, char, boolean) Zusammengesetzte Typen (Felder, auch String) Operatoren.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher bekannt: Einfache Variable Feld Vereinbarung Zuweisung Block while-Schleife Bedingte Anweisung (if) Typ.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0);
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Einführung in Java1 Einführung in JAVA.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Einführung in die Programmierung Anweisungen und Datentypen
Einführung in die Programmierung Klassendefinition und Objekte
Thema: Fibonacci-Zahlen
Bestimmung des ggT zweier Zahlen
Verzweigung.
Vererbung Einfache Vererbung – Erben von abstrakten Klassen – Implementieren eines Interfaces.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Rekursive Funktionen (Fakultät)
IT2 – WS 2005/20061Oct 10, 2005 Externes Verhalten – Quelltext (source code) Durch Aufrufe der Konstruktoren und Methoden kann das externe Verhalten (=die.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
2.4 Rekursion Klassifikation und Beispiele
Die Grundidee Funktionsaufruf Funktionsname (Kopf) Code der Funktion
Unterprogramme in JAVA
Aufruf einer Methode eines Objektes vom Typ „Bruch“
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
Analyseprodukte numerischer Modelle
Programmiervorkurs WS 2014/15 Methoden
Programmiervorkurs WS 2014/15 Schleifen
Programmiervorkurs WS 2014/15 Instanzmethoden
Programmiervorkurs WS 2014 Referenzdatentypen
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Natürliches Programmieren
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
© 2004 Pohlig Informatik Kurse © 2004 Pohlig Informatik Kurse Der Tramp tanzt die Rekursion zünderUntersuchen(…) Basisfall Rückmeldung:
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Nksainf.ch/oinf.
Von Cem, Maurice und lars
Implementieren von Klassen
 Präsentation transkript:

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/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

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!

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?

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)

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?

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!

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; }

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; }

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; }

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

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

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

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

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?

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+ ); } }

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

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+ ); }

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+ ); }

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+ ); }

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+ ); }

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+ ); }

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+ ); }

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+ ); }

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!

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)

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

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

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

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!

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!

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!

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; }