Einleitung Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 1 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät für Angewandte Wissenschaften Albert-Ludwigs-Universität Freiburg Literatur Ottmann, Widmayer: Algorithmen und Datenstrukturen, Spektrum Akademischer Verlag, Heidelberg, Berlin; ISBN: 3-8274-1029-0, 4. Auflage, 2002 Saake, Sattler: Algorithmen und Datenstrukturen: eine Einführung mit Java, dpunktVerlag, Heidelberg, 2002; ISBN: 3-89864-122-8 Cormen, Leiserson, Rivest, Stein: Introduction to Algorithms, Second Edition, MITPress and McGraw Hill, 2002 Sedgewick: "Algorithms in Java (parts 1-4)", Addison-Wesley, ISBN: 0-201-36120-5 Kleinberg, Tardos: Algorithm Design, Pearson/Addison Wesley, ISBN 0-321-29535-8, 2005 Baase, Van Gelder: Computer Algorithms – Introduction to Design & Analysis, Addison-Wesley; ISBN: 0-201-61244-5, Third Edition, 1999 Goodrich, Tamassia : Data Structures and Algorithms in Java, John Wiley & Sons; ISBN: ISBN: 0-471-73884-0 , 4th Edition, 2006 Zahlreiche weitere Bücher von : D. Knuth, S.Baase, Nievergelt / Hinrichs, Güting/Dieker, Heun, A. Drozdeck, Th. Standisch, Kruse, Wood, u.v.a. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 2 Lernziele Algorithmen für wichtige Probleme : Sortieren, Suchen, Wörterbuch-Problem, Berechnung kürzester Pfade, . . . Datenstrukturen : Listen, Stapel, Schlangen, Bäume, Hash-Tabellen, . . . Problemlösetechniken : Divide-and-Conquer, Greedy, vollständige Aufzählung, Backtracking, ... Ziele: Finden effizienter Algorithmen für Instanzen von Problemen aus einem gegebenen Bereich Fähigkeit zur Beurteilung von Algorithmen aufgrund präziser Kriterien (Korrektheit, Effizienz) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 3 Beschreibung und Analyse von Algorithmen Sprache zur Formulierung von Algorithmen Natürliche Sprache, Flussdiagramme, Programmiersprache (Java, C, ...) Pseudocode Mathematisches Instrumentarium zur Messung der Komplexität (Zeitund Platzbedarf): Groß-O-Kalkül (Landausche Symbole) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 4 Pseudocode Abstrakte Beschreibung eines Algorithmus Strukturierter als Beschreibung mit normalem Sprachvokabular Weniger detailliert als ein Programm Bevorzugte Notation zur Beschreibung eines Algorithmus Versteckt Programmentwurfsprobleme Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann Beispiel : Finden des größten Elements in einem array Algorithmus arrayMax(A,n) Input array A mit n Integern Output größtes Element von A currentMax = A[0] for i = 1 to n – 1 do if A[i] > currentMax then currentMax = A[i] return currentMax 5 Pseudocode Details Kontrollfluss Methodenaufruf - if … then … [else …] var.method(arg[,arg…]) - while … do … Rückgabewert - repeat … until … return Ausdruck - for … do … Ausdrücke - Einrücken ersetzt Klammern Zuweisung Deklaration von Methoden (wie = in Java) Algorithm method(arg[, arg…]) = Gleichheitstest Input … (wie == in Java) Output … n² Superscripts und andere mathematische Formatierungen sind erlaubt Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 6 Exkurs: Kurze Java Einführung • • • • Was ist Java? Was ist Objekt-Orientierte Programmierung? Ein erstes Objekt: das ”Hello World!”-Applet Variablen in Java: Datentypen, Deklaration und Zuweisung • Operatoren in Java • Anweisungen in Java (Folgt dem Kurs von M. Bader, TUM) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 7 Was ist Java Definition: (aus ”The Java Language: A Whitepaper“/SUN) Java: A simple, object-oriented, distributed, interpreted, robust, secure, architecture neutral, portable, highperformance, multi-threaded, and dynamic language. einfach objekt-orientiert interpretiert (”Java Virtual Machine“) robust, sicher verteilt, multithread-fähig, dynamisch architekturunabhängig, portabel Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 8 Was ist ein Objekt? Definition: ”An object is a software bundle of variables and related methods.“ Ein Objekt ist charakterisiert durch seine Identität, seinen Zustand und sein Verhalten: • die Identität unterscheidet es von allen anderen Objekten; • der Zustand ist durch die Werte seiner Variablen gegeben; • das Verhalten eines Objekts ist durch seine ”Methoden“ (Funktionen, Prozeduren) gegeben Objekte können real existierende Komponenten wiedergeben, die Teil der Problemstellung sind. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 9 Was ist eine Klasse? Definition: ”A class is a blueprint that defines the variables and the methods common to all objects of a certain kind.“ Objekte vs. Klassen: • Klassen werden vom Programmierer definiert (”Konstruktionsplan“) - Objekte werden während des Programmablaufs erzeugt • Objekte sind Instanzen einer Klasse • alle Objekte einer Klasse besitzen die gleichen Methoden, zeigen daher gleiches Verhalten • alle Objekte einer Klasse haben die gleichen Variablen (”Member“), aber mit unterschiedlichem Inhalt (Zustand) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 10 Merkmale objekt-orientierter Programmierung • • • • • Abstraktion Kapselung Modularität Vererbung Polymorphismus Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 11 Was ist Abstraktion? Konzentration auf die wesentlichen Eigenschaften • ignoriere Details • Programmdesign mittels Objekten und Klassen (anstelle von Variablen/Speicherzellen) • ”Was tut ein Objekt?“ anstelle von ”wie wird es das tun?” • top-down Ansatz • lege erst Schnittstellen (Interaktion der Objekte) fest, implementiere später Abstraktion ist Teil objektorientierten Designs (Programmentwurf). Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 12 Was ist Kapselung u. Information Hiding? Kapselung: • Objekte enthalten alle benötigten Variablen sowie die darauf arbeitenden Funktion (”Methoden“) • Ziel: Wissen über Implementierung einer Klasse für andere Klassen nicht nötig Information Hiding: • Implementierung einer Klasse wird vor anderen Klassen verborgen Zugriff auf private Variablen oder Methoden wird verboten • Modifikation eines Objekts nur über öffentliche Methoden (und Variablen) möglich • Ziel: Implementierung einer Klasse für andere Klassen nicht sichtbar Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 13 Was ist Vererbung? Vererbung: eine Klasse kann Eigenschaften einer Oberklasse übernehmen. Ziele: • Wiederverwendung existierender (funktionierender, fehlerfreier) Klassen • definiere generisches Verhalten in einer Oberklasse, das dann von verschiedenen (verwandten) Klassen geerbt werden kann Beispiel: Fahrzeug (= Oberklasse) • mögliche Unterklassen: Auto, Motorrad, Pferdekutsche, . . . • Unterklassen von Auto: Cabrio, Kombi, Limousine, . . . Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 14 Ein erstes Programm: Hello World /*Die HelloWorld Klasse implementiert eine Applikation, die "Hello World!" auf der Standardausgabe ausgibt. */ public class HelloWorld { public static void main(String[] args) { // Ausgabe des strings "Hello World" System.out.println("Hello World!"); } } Diesen Text in einem File mit Namen HelloWorld.java ablegen! Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 15 Übersetzen und ausführen Übersetzen/Compilieren javac HelloWorld.java Wenn die Compilation erfolgreich ist, wird eine Datei HelloWorld.class erzeugt. Ausführen des Programms java HelloWorld Das Programm wird von dem Java-Interpretierer (JVM) ausgeführt. Hierbei ist zu beachten, daß der Name der Klasse, die die Methode main enthält, mit dem Dateinamen übereinstimmen muß. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 16 Hello World Application (1) public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } public static void main(String[] args): • definiere Methode main • main ist öffentlich und ”statisch“ (Klassenmethode, greift nicht auf Membervariablen der Klasse zu) • main hat Parameter args (die Kommandozeilenparameter als Feld von Strings) • Programmausführung besteht aus Aufruf von main Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 17 Hello World Application (2) public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } System.out.println("Hello World!"); • • • • gib die Zeichenkette "Hello World!" auf der ”Standardausgabe“ aus (i.d.R. Terminalausgabe) System.out modelliert das Objekt ”Standardausgabe“ println ist eine Methode dieses Objekts: ”gebe eine Zeichenkette aus“ Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 18 Parameter von der Kommandozeile Programmbeispiel: alle Kommandozeilenparameter ausdrucken public class Echo { public static void main(String[] args) { for(int i=0;i<args.length;i++) System.out.println(args[i]); } } Eingabe von Zahlen: Umwandlung über Integer, Double, etc. double a = (new Double(args[0])).doubleValue(); int b = (new Integer(args[1])).intValue(); int c = Integer.parseInt(args[2]); Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 19 Applications vs. Applets Applet: Application: •ist letztlich ein Objekt •eingebettet in Viewer/Browser •Sicherheitsbeschränkungen: •eigenständiges Programm (innerhalb JVM) •GUI vollständig zu programmieren •Lesen und Schreiben von Dateien möglich •voller Zugriff auf Komponenten des Systems –Filezugriff eingeschränkt (bes. schreiben/löschen von Dateien verboten) –keine zusätzlichen Programme oder Threads startbar –keine externen Netzverbindungen Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 20 Alternative: ein Java Applet Ein ”Java Applet“ ist typischerweise Teil einer Webseite • der Programmierer entwirft eine Klasse • der Webbrowser erzeugt (und ”startet“) ein Objekt dieser Klasse Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 21 Hello World als Applet (1) Java Quellcode: HelloApp.java Import java.applet.*; import java.awt.*; public class HelloApplet extends Applet { public void paint(Graphics g) { g.drawString("Hello World!",50,50); } //public void paint(Graphics g) { //g.drawString("Hello World!",50,50); //} } Compilieren: javac HelloApp.java Ausführen: appletviewer HelloApp.html Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 22 Hello World als Applet (2) Der Java-Bytecode wird in eine HTML-Datei namens HelloApp.html eingebettet: <HTML> <HEAD> <TITLE> Applettester </TITLE> </HEAD> <BODY> <APPLET CODEBASE="." CODE="HelloApp.class" HEIGHT=100 WIDTH=200> </APPLET> </BODY> </HTML> Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 23 Programme ausführen: Scheme vs. Java Scheme benötigt DrScheme als Laufzeitumgebung ist interaktiv: Benutzer gibt Ausdrücke ein, DrScheme berechnet Ergebnis ist deklarativ: Funktionen können wie in der Mathematik definiert werden Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann Java ”Compiler“ übersetzt Quelltext in Java Bytecode Java Virtual Machine führt Bytecode aus nicht interaktiv: Änderung des Quelltexts erfordert erneutes Compilieren. imperativ: Ein-/Ausgabe explizit programmiert; Abarbeitung der Instruktionen vom Programm vorgegeben. 24 Eclipse Eclipse: • Programmierumgebung für Java • übernimmt bzw. unterstützt Eingeben und Editieren des Java-Quelltexts • Übersetzen des Java-Quelltexts • Erzeugen und Austesten der programmierten Objekte • Ausführen der übersetzen Programme und Applets Zu finden unter http://www.eclipse.org/ Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 25 Scheme vs. Java Variablen Scheme •Ausdrücke enthalten Variablen (Platzhalter) •Auswertung von Ausdrücken: Anwenden von Funktionen auf Argumente, Rekursion •Wichtigster Datentyp: Listen, Java •Variablen sind einfache Datentypen oder ”Objekte“ •enthalten bestimmten Variablentyp (ganze Zahl, Graphics-Objekt, . . . ) •Variablentyp wird im Voraus festgelegt •Objekte bündeln einfache Datentypen bzw. andere Objekte Fundamental unterschiedliche Konzepte bzgl. Variablen! Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 26 Variablen in Java (1) Variablen • spiegeln die Architektur eines von Neumann Rechners wieder • sind symbolische Namen für Speicherzellen des Rechners • müssen explizit (durch Anweisungen) mit Werten gefüllt und verändert werden Die Gesamtheit aller Variablenwerte repräsent den Zustand des Rechners (zu einem bestimmten Zeitpunkt) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 27 Variablen in Java (2) • Variablen müssen stets deklariert werden (Typ festlegen) bevor sie verwendet werden • es gibt verschiedene Variablentypen • eine Variable eines bestimmten Typs kann nur Information dieses Typs enthalten. • einfache Variablen enthalten Werte (Zahlen, Zeichen, true/false), keine Terme oder Ausdrücke • Variablen für komplexe, logische Datenstrukturen (Listen, Mengen, etc.) sind vom Programmierer zu implementieren (Klassen). • Felder können aus einfachen Variablen und aus Objekten gebildet werden Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 28 Einfache Datentypen in Java Typ Inhalt Platz ---------------------------------------------------boolean true oder false 1 bit char Unicode Zeichen 16 bit byte Integer {−128, . . . , 127} 8 bit short Integer{−32768, . . . , 32767} 16 bit int Integer {−2147483648, . . . , 2147483647} 32 bit long 64-bit Integer 64 bit float IEEE 754 Gleitkommazahl 32 bit double IEEE 754 Gleitkommazahl 64 bit ----------------------------------------------------------------------------------------------Mit final lassen sich Konstanten definieren, z.B. final int, final double, etc. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 29 Variablen Deklarieren und Initialisieren Beispiele: int i; int j=0; float e=2.7182f, pi=3.14159f; final double PI=3.14159265; char c=’A’; • falls nicht explizit initialisiert wird, erfolgt implizite Initialisierung (i.d.R. zu 0) • Variablen dürfen (beinahe) überall deklariert werden • beachte Typkorrektheit! Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 30 Zuweisung Elementare Grundoperation Imperativer Sprachen int i; float e; double pi = 3.14159265; i = 3; e = (2.7182f * i) - 1.5f; pi *= 2.0; • beachte das ’=’ (’:=’ gibt es in Java nicht!) • das Semicolon schließt die Zuweisung ab • alle Operationen müssen typ-korrekt sein (float double) (beachte implizite Typumwandlungen beim Rechnen!) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 31 Arithmetische Operatoren + * / Addition Subtraktion Multiplikation Division; für int (etc.) ist die Division ganzzahlig % modulo-Rechnung (”Rest“ bei der Division) Vorrangrelationen: • ”Punkt vor Strich“: *,/,% vor +,• Plus/Minus als Vorzeichen vor *,/,% • Klammern heben Vorrang auf Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 32 Typumwandlung bei „Zahlentypen“ Implizite Umwandlungen: • Regel: ”niedrigerer“ Typ wird in ”höheren“ Typ umgewandelt • Hierarchie: byte → short → int → long → float → double • Beispiel: 3.0 / 5 Explizite Umwandlungen: (<type>) <expression> • • • • auch entgegen der Hierarchie Genauigkeitsverlust möglich ggf. Fehler wegen anderem Wertebereich Beispiel: (float) 3 / 5 Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 33 Anweisungen in Java Zusammenfassung: • Zuweisungen und Methodenaufrufe sind Anweisungen • Blockanweisungen: { ... } • bedingte Anweisungen: if ... else, switch ... case • Schleifen: while, do ... while, for; • innerhalb Schleifen: break, continue • Anweisungen zur Ausnahmenbehandlung: try ... catch ...finally Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 34 Grundkonstrukte imperativer Sprachen Variablen als Namen für Speicherzellen Anweisungen: • Zuweisung als elementare Anweisung • Komplexe Anweisungen: Composition Selektion Iteration • Funktionen und Prozeduren/Methoden Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 35 Zuweisungen sind Anweisungen Beispiele: i = j = 0 ; e += 3.71 ; i--; --i; i++; ++i; Zuweisungsoperatoren: = +=, -=, *=, /=, %= ++ -i++, i-++i, --i Zuweisung i+=3 Abkürzung für i=i+3, etc. inkrementieren dekrementieren i nach Auswertung erhöhen/erniedrigen i vor Auswertung erhöhen/erniedrigen Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 36 Anweisungen Zusammenfassen: Blockanweisung Syntax: { <statement> <statement> <statement> ...} Beispiel: { int a=2,b=3; { g.drawString("a = "+a, 50,50); g.drawString("b = "+b, 50,100); } g.drawString("a + b = "+(a+b), 50,150); } • Beachte: Der Strichpunkt trennt nicht Anweisungen, er ist Bestandteil bestimmter Anweisungen! • Wozu sind Blockanweisungen sinnvoll? if, for, while, . . Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 37 Bedingte Anweisungen Syntax: • if ( <expression> ) <statement> • if ( <expression> ) <statement> else <statement> Beispiele: if ( a != 0 ) b /= a; if ( x > -1 && x < 1 ) { if ( x < 0 ) erg = 1+x; else erg = 1-x; } else erg = 0; Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 38 Boolesche Operatoren ==, != <, <= >, >= && || ! gleich/ungleich kleiner (oder gleich) größer (oder gleich) logisches UND logisches ODER logisches NICHT (einsteliger Operator) Vorrangrelationen: && vor || != und == vor && und || ! vor !=, ==, &&, und || Klammern heben Vorrangrelationen auf klug einsetzen! Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 39 Bedingte Anweisungen: Beispiele Bedingungen in bedingten Ausdrücken müssen vom Typ boolean sein! entweder Ausdruck mit boolschen Operatoren: if ( a != 0 ) b /= a; if ( x >= 0 ) abs = x; else abs = -x; if ( x < -1 || x > 1 ) erg = 0; oder Variable vom Typ boolean: boolean c = ( a != 0); if ( c ) b /= a; Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 40 While Anweisung Syntax: while (<expression>) <statement> Beispiele: while (a >= b) a -= b; i = 1; while (a >= 1) { a /= 2; i++; } • führe <statement> solange aus bis <expression> falsch ist • <statement> wird u.U. nie ausgeführt Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 41 Do-While Anweisung Syntax: do <statement> while (<expression>); Beispiel: a = 1.0; do { a *= 2.0; i--; } while(i>0); • führe <statement> solange aus bis <expression> falsch ist • <statement> wird mindestens einmal ausgeführt! Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 42 For Anweisung Syntax: for(<expression>; <expression>; <expression>) <statement> Beispiele: for(i=1;i<=10;i++) a *= 2.0; a = 17; for(int i=1;a>=1;i++) a /= 2.0; • 1. Ausdruck: Initialisierung • 2. Ausdruck: Fortsetzungsbedingung • 3. Ausdruck: ”Schleifenzähler“ Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 43 Referenzvariablen Neben den einfachen Datentypen (int, float, etc.) kennt Java noch die sog. Referenztypen. Zu diesen gehören: alle Arten von Feldern (int[], float[][], . . . ) alle Objekttypen (String, Graphics, . . . ) Aus Effiziengründen enthalten diese Variablen nicht das Feld/Objekt selbst, sondern nur einen Verweis (Referenz) auf das Objekt. Sonderfall: null hat eine Referenz den Wert null, verweist sie auf kein Objekt Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 44 Objekte erzeugen und vernichten Objekte müssen explizit vom Programmierer erzeugt werden. Objekte werden mit dem Befehl new erzeugt: String leer = new String(); Double pi = new Double(3.14159265); Die Parameter richten sich nach den definierten Konstruktoren Wie werden Objekte wieder gelöscht? • vom Programierer gar nicht • nicht mehr benötigte (zugreifbare) Objekte werden von Java automatisch gelöscht (”Garbage Collection“) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 45 Feldvariablen (Arrays) Felder (Arrays) können von jedem Datentyp angelegt werden. Beispiele: char[] alphabet; String[] informatikStudenten; Feldvariablen kann man bei der Definition mit einem Feld vorbelegen. Beispiele: int[] primes = {2,3,5,7,11,13,17,19,23,29,31}; int[][] matrix = { {1,0,0}, {0,1,0}, {0,0,1} }; Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 46 Felder anlegen • Dynamisch werden Felder mittels new angelegt: char[] alphabet = new char[26]; double[][] matrix = new double[10][10]; String[] physikStudenten = new String[200]; • • • • • als Feldgröße darf ein beliebiger Ausdruck (Variable) eingesetzt werden zwei- oder mehrdimensionale Felder sind Felder von Feldern (von Feldern . . . ) die Feldgröße läßt sich über die ”Membervariable“ .length ermitteln, z.B. alphabet.length, matrix.length, insbes. matrix[2].length Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 47 Wie wird auf Felder zugegriffen? Beispielprogramm: public void paint(Graphics g) { int[] primes = {2,3,5,7,11,13,17,19,23,29,31}; for(int i=0;i<primes.length;i++) g.drawString(i+"-te Primzahl ist "+primes[i], 50,50+20*i); } Nicht vergessen: • Feldindizes beginnen bei 0 • Feldgröße liefert Zahl der Elemente • Java liefert Exception bei falschen Indizes Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 48 Felder sind Referenzvariablen Beispiel: int[] a = {1,2,3,4,5}; int[] b = a; b[3] = 0; Welchen Wert enthält b[2]? ) Antwort: 3 (!!!) Welchen Wert enthält a[3]? ) Antwort: 0 (!!!) a und b sind Referenzen auf das selbe Feld Änderungen der Elemente von a wirken sich genauso auf b aus (und umgekehrt) gilt analog für alle Objektvariablen! Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 49 Methoden in Java Jede Java-Klasse besteht aus den Membervariablen und aus den Methoden, die auf diesen arbeiten. Jede Java-Methode ist Teil einer Klasse: • Methoden modifizieren den Zustand (= die Variablen) eines Objekts • Methoden geben Auskunft über den Zustand (= die Variablen) eines Objekts • (private) Hilfsmethoden führen bestimmte Teilaufgaben aus • es gibt keine ”lokalen“ Methoden Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 50 Methoden definieren Allgemeine Syntax: <public|private|...> typ <name>([parameterliste]) { <methodenrumpf> } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 51 Offentliche und private Methoden/Variablen Java erlaubt verschiedene Einschränkungen bzgl. des Zugriffs auf dieVariablen und Methoden eines Objekts, v.a.: public: auf öffentliche Variablen/Methoden darf von allen Klassen aus zugegriffen werden. private: auf private Variablen/Methoden darf nur innerhalb der eigenen Klasse zugegriffen werden. protected: auf geschützte Variablen/Methoden darf nur von Unterklassen aus zugegriffen werden (s. Vererbung). Kapselung von Daten, ”information hiding“ Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 52 Rückgabewerte von Funktionen • • • • Java-Methoden können Werte liefern Typ des Rückgabewerts steht vor dem Funktionsnamen Funktionen ohne Rückgabewert: void Rückgabebefehl: return <expression>; Beispiel: Matrixklasse public class Matrix { private double[][] elems; public double getElem(int i, int j) { return elems[i][j]; } } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 53 Objekte erzeugen mit Konstruktoren Konstruktoren sind Methoden die beim Anlegen von Objekten (mittels new) aufgerufen werden: • sie haben keinen Rückgabewert und heißen wie ihre Klasse • sie initialisieren Membervariablen • sie legen dabei ggf. Unterobjekte oder Felder an Beispiel: Aufruf Matrix a = new Matrix(10); public class Matrix { private double[][] elems; public Matrix(int size) { elems = new double[size][size]; } } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 54 Methoden überladen Definition: eine Methode heißt überladen, wenn in der selben Klasse gleichnamige Methoden mit unterschiedlicher Signatur existieren. unterschiedliche Implementierung Auswahl gemäß Art und Zahl der aktuellen Parameter Anwendung: • Methoden, die gleiches oder sehr ähnliches Verhalten haben, aber unterschiedliche Parameter erfordern: z.B. java.io.PrintStream.println(...) • Konstruktoren Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 55 Lokale Variable, Blockstruktur Definition: Jede innerhalb einer Methode oder einer Blockanweisung deklarierte Variable heißt lokale Variable. Eigenschaften: • eine lokal Variable ist nur innerhalb des Blocks definiert, in dem sie • deklariert wurde (ebenso in allen ”Unterblöcken“) • eine lokale Variable überschattet eine gleichnamige Variable (ebenso Parameter oder Membervariable) eines äußeren Blocks • eine lokale Variable verliert ihre Gültigkeit sobald ”ihr“ Block beendet wird • in rekursiven Methoden hat jeder Funktionsaufruf einen separaten Satz lokaler Variablen (ebenso Parameter) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 56 Lokale Variablen: Beispiel Einsatz in Konstruktoren: public class Complex { double real; double imag; public Complex(double real, double imag) { this.real = real; this.imag = imag; } } Die Membervariablen real und imag werden von den gleichnamigen Parametern überschattet Umweg über this Ziel: ”sprechende“ Parameternamen Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 57 Globale Variablen Java kennt keine globalen Variablen: Jede Variable ist entweder lokal oder Teil einer Klassendefinition. Ersatzkonstruktion: Klassen-Variablen (static) • einer Klasse zugeordnet • existiert während der gesammten Programmlaufzeit • sofern public deklariert, global zugreifbar • Beachte: Änderung des Wertes möglich bzw. erwünscht? • read-only für andere Klassen private Klassenvariable mit öffentlicher Zugriffsmethode Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 58 Eigene Klassen definieren Definition: ”A class is a blueprint that defines the variables and the methods common to all objects of a certain kind.“ Variablen: • Membervariablen (Objektvariablen) sind einem Objekt zugeordnet • statische Variablen sind der gesamten Klasse zugeordnet Methoden: • Objektmethoden sind einem Objekt zugeordnet • Klassenmethoden (statische Methoden) sind der gesamten Klasse zugeordnet kein this Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 59 Klassendefinition in Java Beispiel: Polynomfunktionen public class Polynomial { private double[] coeff; /* Membervariable für Koeffizienten */ public final static int maxGrad = 100; /*Klassenvariable */ public Polynomial(double[] coeff) { this.coeff = (double[]) coeff.clone(); } public double value(double x) { /* Objektmethode: Funktionswert an der Stelle x */ } public static Polynomial id() { /* Klassenmethode: liefert Funktion f(x)=x */ } } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 60 Zugriff auf Klassen- und Objektmethoden • Objektmethoden: <objektvariable>.<methode> • Klassenmethoden: <klassenname>.<methode> analog für Klassen- und Objektvariablen Beispiel: Polynomfunktionen double[] coeff = {1.0,0.0,1.0}; Polynomial a,b; a = Polynomial.id(); b = new Polynomial(coeff); g.drawSting("Max. Polynomgrad ist “ +Polynomial.maxGrad,0,0); double result = b.value(1.5); Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 61 Was ist Vererbung? Vererbung: ”Klasse kann Eigenschaften einer Oberklasse übernehmen“ Ziele: • Wiederverwendung existierender (funktionierender, fehlerfreier) Klassen • definiere generisches Verhalten in einer Oberklasse, das dann von verschiedenen (verwandten) Klassen geerbt werden kann Beispiel: Applets • Java stellt generische Applet-Klasse zur Verfügung • Programmierer erweitert generische Klasse um spezifisches Verhalten. • implementiert generische Methoden (init(), paint(), etc.) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 62 Vererbung in Java Syntax: class UnterKlasse extends Oberklasse { ... } Unterklasse erbt: • alle Objekt- und Klassenvariablen • alle Objekt- und Klassenmethoden Einschränkungen: • Ableitung nur von einer einzigen Klasse (Ausnahme: Schnittstellen) • nur auf public- und protected-Variablen der Oberklasse zugreifbar. • nur public- und protected-Methoden der Oberklasse aufrufbar. • Sichtbarkeitseinschränkungen bleiben erhalten (keine ”private Vererbung“) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 63 Abstrakte Klassen und Methoden Abstrakte Methode: eine abstrakte Methode hat keine Implementierung, nur ihre ”Signatur“ ist festgelegt. Abstrakte Klasse: eine abstrakte Klasse hat mindestens eine abstrakte Methode; es können keine Objekte dieser Klasse erzeugt werden! Beispiel: public abstract class Matrix { /* .. Member, etc. .. */ abstract double getElem(int i, int j); double frobeniusNorm() { /* Implementierung basierend auf getElem() */ } } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 64 Schnittstellen Definition: Eine Schnittstelle (in Java) ist eine abstrakte Klasse, die ausschließlich abstrakte Methoden besitzt (insbes. keine Variablen). Einsatz von Schnittstellen: • modelliere Verhalten von Klassen, ohne Implementierung festzulegen • erzwinge komplette Implementierung der Schnittstellenfunktionen im Verbund mit Polymorphismus: • Zugriff von anderen Klassen aus nur über Schnittstellenmethoden • „mehrfache Vererbung“: eine Klasse darf mehrere Schnittstellen imlementieren, darf aber nur von einer einzigen Klasse abgeleitet sein Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 65 Schnittstellen in Java Schlüsselwort: interface (statt abstract class) Methoden werden nicht extra als abstract deklariert. Beispiel: Funktionen public interface Function { public double value(double x); } • Schnittstellen gehören wie Klassen in eine eigene Datei, also z.B. Function.java • müssen genauso compiliert werden Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 66 Schnittstellen implementieren: implements Schlüsselwort: implements Beispiel: public class Polynomial implements Function { /* ... Implementierug ...*/ } • alle Methoden der Schnittstelle müssen implementiert werden (ansonsten bleibt die Klasse abstrakt) • Klasse darf mehrere Schnittstellen implementieren; Syntax: implements Klasse1, Klasse2, ... Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann 67