Informatik Seite 1
Funktion Mathematik: Zuordnung Argumentwert(e) => Ergebniswerte Beispiel: f(x,y) = 2*x+y Informatik / Programmierung: Zusammenfassung von Anweisungen die von Argumentwerten abhängen (können) und einen Ergebniswert produzieren (können) oft zur Berechnung mathematischer eingesetzt Beispiele: static double mal2(int x) { return x*2; static int max(int x, int y) { return x > y? x : y; Seite 2
Name Funktionsdefinition Funktions-Kopf Kopf Funktions-Name Funktions-Parameter, (auch formale Funktions-Argumente) Funktions-Körper Funktions-Ergebnis Parameter static double mal2(int x) { return x*2; Ergebnis Körper Funktionsdefinition Funktionsanwendung, Funktionsaufruf Funktions-Name Name Funktions-Argumente, (auch aktuelle Funktions-Parameter) Argument x = mal2(5) Funktionsverwendung (Aufruf) Seite 3
Beispiel Bestimmung des größten von drei Werten a, b, c package hallo; import javax.swing.joptionpane; public class Maximum { static double max(double x, double y, double z) { double max = x > y? x: y; max = z > max? z : max; return max; public static void main(string[] args) { String as = JOptionPane.showInputDialog("Bitte 1-te Zahl eingeben"); String bs = JOptionPane.showInputDialog("Bitte 2-te Zahl eingeben"); String cs = JOptionPane.showInputDialog("Bitte 3-te Zahl eingeben"); double a = Double.parseDouble(aS); double b = Double.parseDouble(bS); double c = Double.parseDouble(cS); JOptionPane.showMessageDialog(null, "Maximum: " + max(a,b,c)); Seite 4
Funktion max als Gehilfe von main Eingabedaten Ausgabedaten String as = JOptionPane.showInputDialog("Bitte 1-te Zahl eingeben"); String bs = JOptionPane.showInputDialog("Bitte 2-te Zahl eingeben"); double a = Double.parseDouble(aS); double b = Double.parseDouble(bS); JOptionPane.showMessageDialog(null, "Maximum: " + max(a,b)); aktuelle Aktion static int max(int x, int y) { return x > y? x : y; x y 3 5 as bs 3 5 a b Los max, jetzt bist Du dran! rrrzzz, rrrzzzzz 3 5 Parameter Ergebnis max main Seite 5
Lokale Variablen und Anweisungen Eine Funktion kann beliebig viele Variablendefinitionen und Anweisungen enthalten. Mit return oder der letzten Anweisung endet sie. static double max(double a, double b, double c, double d) { double max1 = a; double max2 = c; if ( a < b) { max1 = b; if ( c < d ) { max2 = d; return max1 > max2? max1 : max2; Funktionsdefinition mit lokalen Variablen und Anweisungen Seite 6
Überladung: mit unterschiedlichen Parametern dürfen den gleichen Namen tragen Ein Funktionsname kann mit mehreren Bedeutungen überladen werden. Die werden an Hand ihrer Parameter unterschieden. Sie sollten ähnliche Wirkungen haben. static double max(double a, double b) { return a > b? a : b; static double max(double a, double b, double c) { return max(a, max(b, c)); static double max(double a, double b, double c, double d) { return max(a, max(b, c, d)); Mehrere Maximum- Seite 7
Überladung: mit unterschiedlichen Parametern dürfen den gleichen Namen tragen Die werden anhand ihrer Parameter unterschieden. static double max(double a, double b) { return a > b? a : b; static double max(double a, double b, double c) { return max(a, max(b, c)); static double max(double a, double b, double c, double d) { return max(a, max(b, c, d)); Unterscheidung der Seite 8
ohne Ergebnis und/oder ohne Argumente Kein Ergebnis: Kein Argument: Funktion gibt Daten aus Funktion liest Daten ein package hallo; Kein Argument Kein Ergebnis import javax.swing.joptionpane; public class Blubber { static double lieszahlwert() { String zahlstring = JOptionPane.showInputDialog("Bitte Wert eingeben"); return Double.parseDouble(zahlString); static void gibwertaus(double wert) { JOptionPane.showMessageDialog(null, wert); static double f(double x, double y) { return 2*x+y; public static void main(string args[]) { double x = lieszahlwert(); double y = lieszahlwert(); gibwertaus(f(x,y)); Seite 9
zur Strukturierung von Programmen einsetzen! Durch den Einsatz von kann ein Programm in unabhängig von einander planbare, verstehbare, testbare Teile aufgegliedert werden Seite 10
Rekursion können sich selbst aufrufen. Das Prinzip ist aus der Mathematik bekannt. Beispiel : Fakultätsfunktion n! = 1 (n-1)!*n falls n = 0 falls n > 0 oder fak(n) = 1 fak(n) = fak(n-1)*n falls n = 0 falls n > 0 Seite 11
Rekursion Beispiel : Fakultätsfunktion in Java static int fak(int x) { return x == 0? 1 : fak(x-1)*x; oder static int fak(int x) { if (x == 0) { return 1; else { return fak(x-1) * x; Seite 12
Indirekte Rekursion Funktion ruft sich selbst indirekt über eine andere auf Beispiel : Gerade / Ungerade static boolean odd(int n) { return (n == 0)? false : even(n-1); static boolean even(int n) { return (n == 0)? true : odd(n-1); Seite 13
Programmentwurf mit : Schrittweise Verfeinerung Schrittweise Verfeinerung Programmentwicklung durch systematisches Ausarbeiten (Verfeinern) von Teilaufgaben. Prinzip: Schreibe zuerst den Aufruf + Spezifikation einer benötigten Funktion dann die Definition dieser Funktion Wobei innerhalb von dieser (eventuell) weitere zuerst aufgerufen und dann später definiert werden. Seite 14
Programmentwurf mit : Schrittweise Verfeinerung Schrittweise Verfeinerung Beispiel: Primfaktorzerlegung static void faktorisiere(int n) { for (int i = 2; i < n; i++) { if (teilt(n, i) && prim(i)) { System.out.println(i); Start: Beginne mit einer Funktion, delgiere Aufgaben an noch zu schreibende. static boolean prim(int n) { return //? ist n eine primzahl?; Spezifikation (Plan) der noch zu schreibenden static boolean teilt(int x, int y) { return //? ist y ein Teiler von x?; Seite 15
Programmentwurf mit : Schrittweise Verfeinerung Schrittweise Verfeinerung Beispiel: Primfaktorzerlegung static boolean prim(int n) { if (n == 2) { return true; for (int i=2; i<n; i++) { if (teilt(i, n)) { return false; return true; Verfeinerung von prim static boolean teilt(int x, int y) { return x % y == 0; Verfeinerung von teilt Seite 16
Programmentwurf mit : Schrittweise Verfeinerung Schrittweise Verfeinerung Beispiel: Primfaktorzerlegung package hallo; import javax.swing.joptionpane; public class Faktorisierung { static boolean prim(int n) { if (n == 2) { return true; for (int i = 2; i < n; i++) { if (teilt(i, n)) { return false; return true; static boolean teilt(int x, int y) { return x % y == 0; static void faktorisiere(int n) { System.out.println("primfaktoren von "+n); for (int i = 2; i < n; i++) { if (teilt(n, i) && prim(i)) { System.out.println(i); public static void main(string[] args){ String zahlstring = JOptionPane.showInputDialog("Bitte Wert eingeben"); int zahl = Integer.parseInt(zahlString); faktorisiere(zahl); Seite 17
Programmentwurf mit : Schrittweise Verfeinerung Schrittweise Verfeinerung Top-Down Verfahren der Programmentwicklung Vom Gesamtplan Leite Pläne für Komponenten ab: Spezifikation von Verknüpfe Komponenten: Schreibe Algorithmen die diese nutzen Verfahre genauso mit den Komponenten Verfeinere die spezifizierten Seite 18
Programmentwurf Zwei Grundverfahren der Programmentwicklung Top-Down Von einem exakten Plan des Gesamtsystems leite exakte Pläne der Komponenten ab. Tue dies so lange bis alle Komponenten einfach sind und implementiert werden können. Bottom-up Von einem vagen Plan des Gesamtsystems leite Pläne von Komponenten ab und implementiere diese. Konstruiere das Gesamtsystem aus den Komponenten wenn möglich, ansonsten modifiziere Komponenten / Plan des Gesamtsystems. Beide Verfahren werden nicht in Reinform eingesetzt sondern nach Bedarf und Möglichkeiten gemischt. (Top-Down, wenn möglich, Bottom-up wenn nötig) Seite 19
Programmentwurf Komponenten = Schnittstelle / Spezifikation + Implementierung Entwurf Strukturierung eines (Software-) Systems in Komponenten Komponenten-Gedanke Komponenten sind Entwicklungs- und Wartungseinheiten Sie haben Entwickler / Betreuer und Kunden / Benutzer (Entwickler anderer Komponenten) Schnittstelle / Spezifikation und Implementierung Entwickler beschäftigen sind mit der Schnittstelle / Spezifikation und der Implementierung Kunden / benutzer wollen / sollen sich nur mit der Schnittstelle / Spezifikation auseinandersetzen. sind der älteste und immer noch ein extrem wichtiger Komponenten-Typ in der Software-Entwicklung. Seite 20
Programmentwurf : Spezifikation + Implementierung : Spezifikation und Implementierung Beispiel: Komponente /** * Stellt fest ob eine Zahl ist. * @param n : die zu untersuchende Zahl * @return ist n eine Primzahl */ static boolean prim(int n) { Schnittstelle / Spezifikation Implementierung if (n == 2) { return true; for (int i = 2; i < n; i++) { if (teilt(i, n)) { return false; return true; Die Komponente wird durch einen strukturierten Kommentar beschrieben (spezifiziert). Dies erlaubt es ihren Benutzern - sie korrekt zu verwenden - ohne langwierig die Implementierung studieren zu müssen. Seite 21
Programmentwurf : Spezifikation + Implementierung : Spezifikation und Implementierung Beispiel: /** * Faktorisierung einer Zahl. * Diese Funktion gibt alle Primfaktoren einer übergebenen Zahl aus. * @param n : die zu zerlegende Zahl */ static void faktorisiere(int n) { System.out.println("primfaktoren von "+n); for (int i = 2; i < n; i++) { if (teilt(n, i) && prim(i)) { System.out.println(i); Die Definition geeigneter Komponenten und deren Spezifikation ist ein zentrales Anliegen des Software-Engineerings. Seite 22