210 likes | 370 Views
Einführung in die Programmierung mit Java. 10. Vorlesung WS 2002/2003. Übersicht. Besprechung der Hausaufgabe Zugriffsspezifikationen (public, private,...) Polygon: umfangreicheres Beispiel Allgemeine Listen/Suchstrukturen. Hausaufgabe.
E N D
Einführung in die Programmierung mit Java 10. Vorlesung WS 2002/2003
Übersicht • Besprechung der Hausaufgabe • Zugriffsspezifikationen (public, private,...) • Polygon: umfangreicheres Beispiel • Allgemeine Listen/Suchstrukturen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Hausaufgabe • Schreibt ein Programm, das die Reihenfolge der Elemente in einer beliebigen LinkedList umdreht und das Ergebnis in einer neuen LinkedList speichert. Testet das Programm mit geeigneten Elementen. G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Lösung: import java.util.*; ..... LinkedList ll = new LinkedList(); // Liste mit Werten füllen: ll.add(new Person()); ll.add(new Professor()); //Neue Liste für umgekehrte Reihenfolge LinkedList lNeu = new LinkedList(); //Liste Durchlaufen und andere füllen: Iterator it = ll.iterator(); while(it.hasNext()) { Object o = it.next(); lNeu.addFirst(o); } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Zugriffsspezifikationen I • Zugriffsspezifikation regeln welche Klassen, Attribute und Methoden wo verwendet werden können. • Schlüsselwörter public, protected, private • wird keine Zugriffsspezifikation angegeben, gilt der default-Modus friendly • Differenziert für Klassen, Methoden, und Attribute • Wichtiges Konzept der Objektorientierung: Geheimnisprinzip: Verbergen von Details der Implementierung, Zugriff nur über klar definierte Schnittstellen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Zugriffsspezifikationen II • public: Zugriff von allen Klassen • protected: Zugriff von Klassen im selben Paket, auch Zugriff von Unterklassen in anderen Paketen • friendly oder keine Spezifikation: Zugriff von Klassen im selben Paket, Zugriff nicht von Unterklassen in anderen Paketen • private: Zugriff nur innerhalb derselben Klasse geheimer G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Beispiel: Klasse Punkt public class Punkt{ private double xKoordinate; //Attribut private double yKoordinate; //Attribut public Punkt(){ xKoordinate = 0.0; yKoordinate = 0.0;} public Punkt( double x, double y ){ xKoordinate = x; yKoordinate = y;} public double x_Koordinate() {return xKoordinate;} public double y_Koordinate() {return yKoordinate;} public boolean equals(Punkt p){ if( p.xKoordinate == xKoordinate & p.yKoordinate == yKoordinate) return true; else return false;} public double abstand(Punkt p){ double a = Math.sqrt(Math.pow(xKoordinate - p.xKoordinate,2.0) + Math.pow(yKoordinate - p.yKoordinate,2.0)); return a;}} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Umfangreicheres Beispiel: Polygone p1 p2 p5 p3 p4 G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Umfangreicheres Beispiel: Polygone • Anwendung von Listen • Anwendung von Zugriffsspezifikationen • Kapselung • Funktionalität von Polygonen: • Hinzufügen eines Punkts • Berechnung des Umrings • Berechnung des Flächeninhalts G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Polygon: UML-Diagramm Punkt Polygon 1 hat_im_Umring 3..* -x: double-y: double {ordered} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Klasse "Polygon": Attribute und Konstruktoren public class Polygon{ public LinkedList punktliste; public Polygon(Punkt p1, Punkt p2, Punkt p3) { punktliste = new LinkedList(); punktliste.add(p1); punktliste.add(p2); punktliste.add(p3); } public Polygon(double [] x_Koord, double [] y_Koord) { punktliste = new LinkedList(); for(int i = 0 ; i < x_Koord.length; i = i+1) { Punkt p = new Punkt(x_Koord[i],y_Koord[i]); punktliste.add(p); } }} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Klasse "Polygon": Benutzung //von Außen: .... Punkt p1 = new Punkt(1,1); Punkt p2 = new Punkt(1,2); Punkt p3 = new Punkt(2,1); Polygon poly1 = new Polygon(p1, p2, p3); double [] xArray = {1,1,3,2}; double [] yArray = {1,2,3,1}; Polygon poly2 = new Polygon(xArray, yArray); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Berechnung des Umfangs: Idee p1 p1.abstand(p2) p5.abstand(p1) p2 p2.abstand(p3) p5 p3 p4.abstand(p5) p3.abstand(p4) p4 G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Übungsaufgabe Schreibt ein Programm (in einer "main"), das den Umfang eines Polygons berechnet. Hinweise: • Klasse Polygon:public class Polygon{ public LinkedList punktliste; ...} • nutzt die Methode "abstand" von "Punkt" • Eine LinkedList kann mehrere Iteratoren haben G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Berechnung des Umfangs public static void main(String args[]) { Polygon poly = new Polygon(new Punkt(1,1), new Punkt(1,2), new Punkt(2,1)); double umfang = 0; Iterator ersterIt = poly.punktliste.iterator(); Iterator zweiterIt = poly.punktliste.iterator(); zweiterIt.next(); Punkt ersterPunkt; Punkt zweiterPunkt; while(zweiterIt.hasNext()) { ersterPunkt = (Punkt) ersterIt.next(); zweiterPunkt = (Punkt) zweiterIt.next(); umfang = umfang + ersterPunkt.abstand(zweiterPunkt); } ersterPunkt = (Punkt) poly.punktliste.getLast(); zweiterPunkt = (Punkt) poly.punktliste.getFirst(); umfang = umfang + ersterPunkt.abstand(zweiterPunkt); System.out.println(umfang); } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Umfang: Anmerkungen • Berechnung des Umfangs (Fläche,..) ist einfacher, wenn erster Punkt in Liste am Ende wiederholt wird • Dann ist aber Einfügen von Punkten (am Ende oder Anfang) schwieriger (Konsistenz, erster == letzter) • Wiederholung des ersten Punkts am Ende ist Implementierungsdetail (wie Frage Array oder Liste) • verbergen dieser Details vor Nutzer des Polygons • Atttribut punktliste nicht public • Umfang als Methode • klar definierte, nutzerfreundliche Schnittstelle zu Polygon • Kapselung G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Klasse "Polygon": Attribute und Konstruktoren public class Polygon{ protected LinkedList punktliste; public Polygon(Punkt p1, Punkt p2, Punkt p3){...} public Polygon(double [] x_Koord, double [] y_Koord) {...} public double umfang() { double umfang = 0; Iterator ersterIt = punktliste.iterator(); Iterator zweiterIt = punktliste.iterator(); zweiterIt.next(); Punkt ersterPt, zweiterPt; while(zweiterIt.hasNext()) { ersterPt = (Punkt) ersterIt.next(); zweiterPt = (Punkt) zweiterIt.next(); umfang = umfang + ersterPt.abstand(zweiterPt); } ersterPt = (Punkt) punktliste.getLast(); zweiterPt = (Punkt) punktliste.getFirst(); umfang = umfang + ersterPt.abstand(zweiterPt); return umfang;} } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
AbstractMap Map TreeMap HashMap sortiert Listen und Mengen: vordefinierte Klassen Einfache Container-Datenstrukturen Assoziative Datenstrukturen AbstractCollection keine Duplikate Set LinkedList ArrayList TreeSet HashSet sortiert G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
Klasse Einfügen/Löschen Suchen Suchen mit Key LinkedList/ArrayList const. O(n) TreeSet O(log n) O(log n) HashSet const. const. (mittel) TreeMap O(log n) O(log n) HashMap const. const.(mittel) Laufzeiten / Komplexität G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
HashMaps • Speichern Objekte (Klasse Object) in Struktur • Zuordnung eines (Such-)Schlüssel zu Objekt(Key-Value-Pair) • effizientes Suchen über Schlüssel • Methoden: • put(Object Key, Object value) //Einfügen • Object get(Object Key) //Suchen • void clear() • int size() • Weitere Methoden: JavaDoc G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
5 1 S F = (xk - xk+1)(yk + yk+1) 2 k = 1 Hausaufgabe Schreibt eine Methode der Klasse Polygon, die den Flächeninhalt eines Polygons berechnet. Hinweise: • Orientiert euch an der Methode "Umfang" • Formel zur Berechnung des Flächeninhalts (Gaussche Flächenformel) in Diskreter Mathe, Vorlesung 2: G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03