29.05.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.

Slides:



Advertisements
Ähnliche Präsentationen
Ziele von EINI I + II Einführen in „Informatik“
Advertisements

Klassen - Verkettete Liste -
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Claudio Moraga; Gisbert Dittrich
Kritische Betrachtung
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
Java: Dynamische Datentypen
Algorithmentheorie 04 –Hashing
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
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
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 5 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
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
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
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 12 Claudio Moraga, Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
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
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
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 11 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 Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
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 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 im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
DVG Klassen und Objekte
Planung einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text.
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
20:00.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Tutorium Software-Engineering SS14 Florian Manghofer.
 Präsentation transkript:

Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure II Prof. Dr. Gisbert Dittrich

19 -2 Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Ziel 1 Weitere Beiträge zur Wiederverwendbarkeit von Code --> Einführung an Beispielen. Frage: Wie kann man das Hashen von Integern für das Hashen von - komplexen Zahlen- Wörtern - Beschäftigten-... effizient verwenden?

19 -3 Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Ziel 2 Antwort: Verwendung von Templates/Schablonen (bedeutet: Klassen können als Parameter in Klassen (-schablonen) zur Erzeugung von Klassen verwendet werden.) Durchgeführt für Beispiele.

19 -4 Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Gliederung 1 Neuer Anwendungsbereich Klasse komplexe Zahlen Einführung in Templates/Schablonen 1. Am Beispiel (einfache) Liste: – Schablone für (einfache) Liste. – Beispielanwendungen: Einfache Liste für komplexe Zahlen Einfache Liste für Integer Einfache Liste für Beschäftigte Konsequenzen – Detail: Erzeugung anonymer Klassen

19 -5 Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Gliederung 2 2. Beispiel: Hashing allgemein – Annahmen – Liste(nschablone) – Schablone Hashtafel – Vergleich : int Nutzinfo * – Methoden dazu – Beispielanwendungen: Hashing für komplexe Zahlen Hashing für Integer Hashing für Wörter Hashing für Beschäftigte nach Klassenzugehörigkeit Hashing für Beschäftigte nach Verdienststufe

19 -6 Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Klasse: KomplexeZahl class KomplexeZahl { private: int Re, Im; public: KomplexeZahl (int r, int i) { Re = r; Im = i;} KomplexeZahl * Plus (KomplexeZahl * p); KomplexeZahl * Minus (KomplexeZahl * p); KomplexeZahl * Minus (); KomplexeZahl * Mal (KomplexeZahl * p); void Druck(); bool Gleich (KomplexeZahl * p); }; Liste kompl Zahlen

19 -7 Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Komplexe Zahlen Deute (a, b) als a + i*b. Operationen sind dann klar. Beispiel: Multiplikation, Methode Mal KomplexeZahl * Mal (KomplexeZahl * p) { int r, i; r = Re * p->Re - Im * p->Im; i = Im * p->Re + Re * p->Im; return new KomplexeZahl(r, i);} [(a+ib)*(c+id) = (ac-bd) + i(ad + bc) ; ]

19 -8 Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Nun aber Suchverfahren für komplexe Zahlen. Binäre Suchbäume: nicht möglich, denn – auf der Menge der komplexen Zahlen ist keine Ordnung (direkt) definiert.

19 -9 Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Hashing: im Prinzip möglich Muß also: – Klasse KomplexList zur Formulierung verketteter Listen für komplexe Zahlen definieren, – das Hashing-Verfahren anpassen. Das ist LANGWEILIG, da i.w. Gleichförmiges wiederholt wird. Alternative ? --> Klassen als Parameter Nun aber (Forts.)

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Integer_Hashing: Analyse 1 class IntListenEl { public: int Element; IntListenEl * weiter; void NutzinfoDruck()}; class IntListe { protected: IntListenEl * DieIntListe; bool IstDa(IntListenEl *, int); IntListenEl * WegDamit (IntListenEl *, int); void DieserDruck(IntListenEl *);

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Integer_Hashing: Analyse 2 // class IntListe Fortsetzung public: IntListe() IntListe(int r) bool Testen(int r) void Entfernen(int r) void Einfuegen(int) void Druck()};.... bool IntListe:: IstDa (IntListenEl * Liste, int r) { else { if (Liste->Element == r) Gleichheit ???!!! Int-Hash: Analyse 3

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Analyseergebnis Analyse der Rolle der int -Größe (vorige Folien) Ganze Zahlen gehen bei der Klasse IntListe nur insofern ein, als – die Komponente Element vom Typ int war, – beim Testen die Gleichheit ganzer Zahlen benutzt wurde – sie als Parameter in Methoden auftreten --> Diese Stellen müssen bei einer abstrakteren Behandlung ("Parametrisierung") auf Änderung überprüft werden.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Aufgabe: Abstrakte Formulierung Listentyp definieren, der diese beiden Angaben (Typ, Gleichheit) als Parameter hat: – ganze Zahlen als Typparameter, – die Gleichheit als Funktionsparameter (Das geht mit Hilfe rein virtueller Funktionen. Wird zunächst zurückgestellt).

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Dazu zu erledigen: Allgemeine Angaben zu Liste: Annahme über den Typ der Listenelemente, Angabe der Signaturen von Listenmethoden, Angabe – der Implementierung, soweit das möglich ist – der typspezifischen Eigenschaften oder Operationen. Formulierung in C++ [Zunächst Reduktion auf Liste_einfach : – Initialisieren der Liste- Einfügen eines Elements – Drucken der Liste(nelemente) ]

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates class ListenEl { Nutzinfo * Element; ListenEl * weiter; void NutzinfoDruck(){ Element->Druck(); cout << endl;}}; Erste Formulierungen Annahme: Der Typ der Listenelemente ist Zeiger auf Nutzinfo, wobei Nutzinfo beliebige Klasse. Grundtyp also: Nutzinfo *. Nutzinfoweiter Element Nutzinfo Achtung: Setzt Methode Druck() in Nutzinfo voraus !!!

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Erste Formulierungen 2 class Liste { ListenEl * DieListe; void ListenDruck(ListenEl *); Liste() { DieListe = NULL;}; void Einfuegen(Nutzinfo *); void Druck(){ListenDruck(DieListe);}

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Fazit Fast alle Operationen ohne Kenntnisse des zugrundeliegenden Typs Nutzinfo formulierbar. Ausnahmen: der Druck eines Elements evtl: Gleichheit von Elementen (hier (noch ) nicht betrachtet) Im folgenden: Formulierung als Klasse

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Formulierung als Klasse 1 Dazu auch berücksichtigen: Angabe, daß der Typ eine Art Parameter der Listenklasse ist !! Zugriffsspezifikationen ( private, protected, public ) Methoden müssen ausformuliert werden

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Erste Formulierungen (Ausschnitt) class ListenEl { Nutzinfo * Element; ListenEl * weiter; void NutzinfoDruck(){ Element->Druck(); cout << endl; } };

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates class ListenEl { public: Nutzinfo * Element; ListenEl * weiter; void NutzinfoDruck(){ Element->Druck(); cout << endl; } }; Formulierung als Klasse 2 Das ist neu template

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anmerkungen Durch template wird angekündigt, daß die folgende Konstruktion eine Klasse Nutzinfo als Parameter hat. Die nun folgende Klasse ist keine: Sie ist vielmehr das Muster (oder die Schablone) einer Klasse. Aus der Schablone können dann Klassen erzeugt werden (Wie, werden wir gleich sehen). Schablonen können im Hinblick auf Vererbung wie Klassen behandelt werden.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anmerkungen (Forts.) Zugriffsspezifikationen Element; weiter; NutzinfoDruck() als public Komponenten, da wir (nur an dieser Stelle !!) faul sind. Logisch wäre protected oder gar privat e besser. Vgl. Vorgehen in früheren Beispielen.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Erste Formulierungen 2 (Wiederholung) class Liste { ListenEl * DieListe; void ListenDruck(ListenEl *); Liste() { DieListe = NULL;}; void Einfuegen(Nutzinfo *); void Druck(){ListenDruck(DieListe);}

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Formulierung als Klasse 3 template class Liste { protected: ListenEl * DieListe; void ListenDruck(ListenEl *); public: Liste() { DieListe = NULL;}; void Einfuegen(Nutzinfo *); void Druck(){ListenDruck(DieListe);} }; Auch bei Parametern oder lokalen Variablen muß der Typparameter stets mitgeteilt werden.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates ListenEl * neu = new ListenEl ; Realisierung der Methoden 1 template muß muß vor der Definition jeder Methode stehen Der Name des Typparameters muß muß bei der Angabe der Klasse genannt werden void Liste ::Einfuegen(Nutzinfo * r){ template Auch hier: Typparameter neu->Element = r; neu->weiter = DieListe; DieListe = neu;}

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Realisierung der Methoden 2 template void Liste :: ListenDruck(ListenEl * K) { if (K != NULL) { K->NutzinfoDruck(); ListenDruck(K->weiter); } }

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Realisierung der Methoden 3 template void Liste ::Einfuegen(Nutzinfo * r){......} Die Konstruktion müßte jetzt klar sein: Angabe, daß es sich um eine Schablone mit Typparameter Nutzinfo handelt, Nennung des Typparameters bei der Definition der Methode (hier: Einfuegen). Liste_einfach.cpp

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Liste komplexer Zahlen class KomplexL : public Liste { public: KomplexL() : Liste () {};}; int main() { KomplexL * MeineKoZListe = new KomplexL(); for (int i = 0; i< 10;i++){ MeineKoZListe-> Einfuegen(new KomplexeZahl (rand()%100, rand()%100));}; MeineKoZListe->Druck();return 0;} Komplexe ZahlenProgramm Quelltext

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Liste von Integer-Zahlen 1 Erzeuge Klasse zu Integer-Zahlen: class IntegerZahl { public: int i; IntegerZahl (int i1) { i = i1;} void Druck() { cout << i; } int Get_i() {return i;} bool Gleich(IntegerZahl *p) { return (i == p->i);} }; Liste von Integern Hashing von Integern

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates class KomplexL : public Liste { public: KomplexL() : Liste () {};}; Anwendung: Liste komplexer Zahlen Wdh int main() { KomplexL * MeineKoZListe = new KomplexL(); for (int i = 0; i< 10;i++){ MeineKoZListe-> Einfuegen(new KomplexeZahl (rand()%100, rand()%100));}; MeineKoZListe->Druck();return 0;}

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Liste von Integer-Zahlen 2 class IntL : public Liste { public: IntL() : Liste () {};}; int main() { IntL * MeineIntListe = new IntL(); for (int i = 0; i< 10;i++){ MeineIntListe-> Einfuegen(new IntegerZahl (rand()%100));}; MeineIntListe->Druck();return 0;} IntegerProgramm Quelltext

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Liste von Beschäftigten class BeschL : public Liste { public: BeschL() : Liste () {};}; int main() { BeschL * MeineBeschListe = new BeschL();..... MeineBeschListe-> Einfuegen(einBeschaeftigter); MeineBeschListe->Druck();return 0;} Klasse BeschäftigterProgramm Quelltext

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anmerkungen Die neue Klasse entsteht durch Konkretisie- rung des Typparameters. Das geschieht hier mittels Vererbung: class IntL: public Liste { }; Die (konkrete) Klasse Liste entsteht dabei aus der Klasse(nschablone) Liste, indem der Typparameter Nutzinfo durch IntegerZahl substituiert wird.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Konsequenzen Code für Listen wurde nur einmal formuliert Für jeden Typ kann mit dieser Technik eine Liste formuliert werden. Dazu muß lediglich formuliert werden: ein Konstruktor, // die virtuelle Methode ELDruck, die typspezifisch ist. Dies geschieht hier durch Vererbung.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Konsequenzen (Forts.) Für jeden konkreten Typ, der den Typpara- meter ersetzt, wird bei der Ersetzung eine Klasse erzeugt (s.o.). Diese kann im wesentlichen wie jede andere Klasse verwendet werden. Anonyme Klasse Die Ersetzung des Typparameters kann auch dort geschehen, wo Klassen benutzt werden. --> vgl. Beispiel nächste Folien.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates class KomplexL : public Liste { public: KomplexL() : Liste () {};}; Anwendung: Liste komplexer Zahlen UKlasse int main() { KomplexL * MeineKoZListe = new KomplexL(); for (int i = 0; i< 10;i++){ MeineKoZListe-> Einfuegen(new KomplexeZahl (rand()%100, rand()%100));}; MeineKoZListe->Druck();return 0;}

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates /*class KomplexL : public Liste { public: KomplexL() : Liste () {};};*/ Anwendung: Liste komplexer Zahlen anonym int main() { Liste * MeineKoZListe = new Liste ; for (int i = 0; i< 10;i++){ MeineKoZListe-> Einfuegen(new KomplexeZahl (rand()%100, rand()%100));}; MeineKoZListe->Druck();return 0;} Programm

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Gliederung 1 Neuer Anwendungsbereich Klasse komplexe Zahlen Einführung in Templates/Schablonen 1. Am Beispiel (einfache) Liste: – Schablone für (einfache) Liste. – Beispielanwendungen: Einfache Liste für komplexe Zahlen Einfache Liste für Integer Einfache Liste für Beschäftigte Konsequenzen – Detail: Erzeugung anonymer Klassen Erledigt !!

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Gliederung 2 2. Beispiel: Hashing allgemein – Annahmen – Liste(nschablone) – Schablone Hashtafel – Vergleich : int Nutzinfo * – Methoden dazu – Beispielanwendungen: Hashing für komplexe Zahlen Hashing für Integer Hashing für Wörter Hashing für Beschäftigte nach Klassenzugehörigkeit Hashing für Beschäftigte nach Verdienststufe

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Hashing für beliebige Datentypen Hashing (Wiederholung): Bisher formuliert für ganze Zahlen. Zentral: Feld von Listen ganzer Zahlen, in die eingefügt wurde. Feldelement wurde ermittelt durch Hashfunktion.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Idee Hashfunktion (vgl. Kap. 18) Formal: Sei U die (endliche) Menge aller Objekte, für die die Suchoperationen definiert werden sollen. h: U -> {0,..., m-1} sei eine Funktion --> Hash-Fkt. U: Menge aller Elemente, die bereits verarbeitet sind. U(j) := h -1 (j) U : Menge aller Elemente in U, die von h auf j abgebildet werden. Aufgabe: t U schon in U ?

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Bildchen Listen das Feld

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Hashing Verwendung Benutze die verketteten Listen, um: Element t wird in der Liste zu h(t) abgespeichert. Suche t? Schaue in der Liste zu h(t) nach. Lösche t? Lösche t in der Liste zu h(t). Zentral: Hashfunktion h Muß einfach zu berechnen sein Sollte die Elemente (möglichst) gleichmäßig verteilen.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Zur Schablone für Listen mit Typ Nutzinfo Annahmen: Für Objekte des Typs Nutzinfo ist eine Druck- Methode definiert. – Also: für q vom Typ Nutzinfo ist q.Druck() aufrufbar. Objekte des Typs Nutzinfo können verglichen werden: – Für p vom Typ Nutzinfo * und q vom Typ Nutzinfo * ist p->Gleich(q) definiert und gibt true oder false zurück.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Listen- Schablone 1 template class ListenEl { public: Nutzinfo * Element; ListenEl * weiter; void NutzinfoDruck(){ Element->Druck(); cout<<endl; } };

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Listen- Schablone 2 template class Liste { protected: ListenEl * DieListe; bool IstDa(ListenEl *, Nutzinfo*); /* Testet, daß Nutzinfo in Liste */ ListenEl * WegDamit (ListenEl *, Nutzinfo *); /* Entfernt Nutzinfo, falls in Liste enthalten*/ void ListenDruck(ListenEl *);

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Listen- Schablone 3 // class Liste Fortsetzung public: Liste() {DieListe = NULL;}; Liste(Nutzinfo * r) { DieListe -> Element = r; DieListe -> weiter = NULL;}; bool Testen(Nutzinfo * r) { return IstDa(DieListe, r);} void Entfernen(Nutzinfo * r) { DieListe = WegDamit(DieListe, r);} void Einfuegen(Nutzinfo *);

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Listen- Schablone 4 // class Liste Fortsetzung 2 void Druck(){ListenDruck(DieListe);} int Gleich(Nutzinfo * p, Nutzinfo * q){ return p->Gleich(q);} /* In Nutzinfo muß also Gleich(Nutzinfo *)definiert sein.*/ int Laenge();

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Methode IstDa template bool Liste ::IstDa( ListenEl * K, Nutzinfo * r) { if (K == NULL) return false; else { if (Gleich(K->Element, r)) return true; else return IstDa(K->weiter, r); } }

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Methode Einfuegen template void Liste ::Einfuegen(Nutzinfo * r) { if(!Testen(r)) { ListenEl * neu = new ListenEl ; neu->Element = r; neu->weiter = DieListe; DieListe = neu; }} Zu Restlichen vgl. Implementierung im Quelltext Hash-List.cpp

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Integer_Hashing: Analyse 3 class AbstrakteHashTafel { private: IntListe ** hT; protected: int maxBucket; public: AbstrakteHashTafel(int); virtual int h(int) = 0; int Testen(int r) void Einfuegen(int r) void Entfernen(int r) void Druck();}; Int-Hash: Analyse 1

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Integer_Hashing: Analyse 4 class NeueHashTafel : public AbstrakteHashTafel { public: NeueHashTafel(int m) : AbstrakteHashTafel(m) int h(int); }; int main() {//}

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Schablone: Hashtafel 1 template class HashTafelSchablone { private: Liste ** hT; protected: int maxBucket; public: HashTafelSchablone(int); virtual int h(Nutzinfo *q) = 0; int Testen(Nutzinfo *r) { return hT[h(r)]->Testen(r);}

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Schablone: Hashtafel 2 // class HashTafelSchablone Fortsetzung void Einfuegen(Nutzinfo *r) { hT[h(r)]->Einfuegen(r);} void Entfernen(Nutzinfo *r){ hT[h(r)]->Entfernen(r);} void Druck(); int Laenge(int j) { return hT[j]->Laenge(); } };

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Vergleich: int vs. NI* NI = Nutzinfo Bis auf die Signatur gute alte Bekannte.

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Methode: Konstruktor HTSchablone template HashTafelSchablone :: HashTafelSchablone(int m) { maxBucket = m; hT = new Liste *[m]; for (int i = 0; i < m; i++) hT[i] = new Liste (); }

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Methode: Konstruktor Druck template void HashTafelSchablone ::Druck() { int i; for (i = 0; i < maxBucket; i++) { cout << "\nBucket für i = " << i << ":\n"; hT[i]->Druck(); } }

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für komplexe Zahlen 1 Alle Vorbereitungen durchgeführt, jedoch Zwei Schritte noch notwendig: Erzeugen einer Hashtafel für komplexe Zahlen d.h. der Klassenparameter Nutzinfo wird durch KomplexeZahl ersetzt Bestimmung der Hash-Funktion (aus dem Real- und dem Imaginärteil)

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für komplexe Zahlen 2 class KomplexeHashTafel: public HashTafelSchablone { public: KomplexeHashTafel(int k): HashTafelSchablone (k) {}; int h(KomplexeZahl * q) { int hash(int); return hash( hash(q->_re()) hash(q->_im()) + 2 ); } };

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Hashfunktion Verwendet int hash(int k) { return k%maxHash;} Mit maxHash als Primzahl hash ist nicht besonders gut: Beispiel gleich nach dem Hauptprogramm

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Beispiel für main() void main() { KomplexeHashTafel * khT = new KomplexeHashTafel(maxHash); 431 for (int i = 0; i < 431; i++) khT->Einfuegen( new KomplexeZahl(rand(), rand()) ); khT->Druck(); for(i = 0; i < maxHash; i++) *ausgabe Laenge(i) << endl; KoZ-Hash.cpp

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Ein wenig Statistik: KomplexeZahlen

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für IntegerZahlen class IntegerHashTafel : public HashTafelSchablone { public: IntegerHashTafel(int k): HashTafelSchablone (k) {}; int h(IntegerZahl * q) { return (q->Get_i())%maxHash; } }; Integer

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für IntegerZahlen int main() { IntegerHashTafel * InthT = new IntegerHashTafel(maxHash); for (int i = 0; i < 431; i++) InthT->Einfuegen( new IntegerZahl(rand())); InthT->Druck(); for(int i = 0; i < maxHash; i++) *ausgabe Laenge(i) << endl; } Programm Quelltext

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Ein wenig Statistik: IntegerZahlen

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für Wörter 1 #include class Wort { private: char wort[70]; public: Wort (char w[]) { for (int i=0;i<70;i++) wort[i] = w[i]; }

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für Wörter 2 // class Wort Fortsetzung void Druck() { cout << wort;} bool Gleich(Wort *w) { bool b; b=strcmp(wort,w->wort); if (b==0) return true; else return false;} char* Get (){ return wort;}};

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für Wörter 3 class WoerterbuchHashTafel: public HashTafelSchablone { public: WoerterbuchHashTafel(int k): HashTafelSchablone (k) {}; int h(Wort * q) { return hash (q->Get()); } int hash(char *); };

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für Wörter 4 int WoerterbuchHashTafel::hash(char* k) { char c; int z; c=*k; c=toupper(c); if (c 91) z=26; else z=c-65; return z; }

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für Wörter 5 int main() { WoerterbuchHashTafel * Woerterbuch = new WoerterbuchHashTafel(maxHash); // Einlesen der Datei ifstream * EingabeDatei; EingabeDatei = new ifstream ("Beweis.txt"); char gelesen[maxLen]; *EingabeDatei >> gelesen;

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für Wörter 6 // int main() Fortsetzung while (!((*EingabeDatei).eof())) { Woerterbuch->Einfuegen(new Wort (gelesen)); * EingabeDatei >> gelesen; } Woerterbuch->Druck(); for(int i = 0; i < maxHash; i++) *ausgabe Laenge(i) << endl; return 0; } Programm Quelltext

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Ein wenig Statistik: Wörter

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für BeschBesGr 1 class BeschaeftigtenHashTafel: public HashTafelSchablone { public: BeschaeftigtenHashTafel(int k): HashTafelSchablone (k) {}; int h(Beschaeftigter *);}; int BeschaeftigtenHashTafel:: h(Beschaeftigter* B) /* Klassifikation nach Zugehörigkeit zur Besoldungsart*/ { return B->Get_Besoldungsgruppe();}

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für BeschBesGr 2 const int maxHash = 5; ofstream *ausgabe = new ofstream("Ausgabe.doc"); int main() { BeschaeftigtenHashTafel * B_H_Tafel = new BeschaeftigtenHashTafel(maxHash); // Erzeugen der Listeneinträge analog Kap.17 !! B_H_Tafel->Druck(); for(int i = 0; i < maxHash; i++) *ausgabe Laenge(i) << endl; return 0; } Programm Quelltext Beschaeftigter

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Ein wenig Statistik: BeschaftgBesGr

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Anwendung: Hashing für BeschBVerdie 1 class BeschaeftigtenHashTafel: public HashTafelSchablone { // wie vorher int BeschaeftigtenHashTafel:: h(Beschaeftigter* B) // Klassifikation nach Verdiensthöhe { int x = B->Gehalt(); if (x < 2000) return 0; else {if (x < 4000) return 1; else { if ( x < 6000)return 2; else { if (x < 8000)return 3; else return 4;};};};}; Programm Quelltext

Prof. Dr. G. Dittrich EINI II Kap. 19: Schablonen/Templates Ein wenig Statistik: BeschVerdienst