Informatik 2 Konzepte der Programmierung (& Programmierkurs 2) Stefan Klinger LS Scholl, Datenbanken und Informationssysteme Universität Konstanz Sommer 2016 Folien basieren teilweise auf früheren Lehrveranstaltungen von M. Scholl und T. Grust. 0 Einleitung 0 · Einleitung 0.1 Das Modul Informatik 2 · 0.1 Das Modul Informatik 2 Zwei Lehrveranstaltungen: Konzepte der Programmierung (KdP) Hier werden hauptsächlich die theoretischen Konzepte vermittelt. Programmierkurs 2 (PK2) Praktische Diskussion und Anwendung der Theorie aus KdP. ⇒ Beide Veranstaltungen bilden eine Einheit! � Man kann nicht nur an PK2 xor KdP teilnehmen. � Massiver Kontakt mit Quellcode auch in der KdP Vorlesung. � PK2 greift auf Stoff aus der KdP Vorlesung zurück und vertieft diesen. Stefan Klinger · DBIS Informatik 2 · Sommer 2016 3 0 · Einleitung Das Modul Informatik 2 · 0.1 Informatik 2 im ersten Semester? Für Erstsemester (= Sommeranfänger) ... � ist diese Veranstaltung möglich, � empfohlen wird i.d.R. Theoretische Grundlagen der Informatik und Informatik 2 im dritten Semester. � KdP und PK2 sind nicht so praxisorientiert wie sich das anhört. � Wer trotzdem möchte, sollte im Brückenkurs Mathematik von Dr. Kosub gewesen sein. Stefan Klinger · DBIS Informatik 2 · Sommer 2016 4 0 · Einleitung Das Modul Informatik 2 · 0.1 Wieviel Arbeit ist Informatik 2 ? Faustregel: Heimarbeit ≈ 2× Vorlesung � Konzepte der Programmierung (KdP): 4c � Programmierkurs 2 (PK2): 5c � Nach ECTS1 gilt: 1c ≡ 30h � Einheit c für Credits. Einheit h für Stunden. Dieses Semester: 14w Einheit w für Wochen. (4c + 5c) · 30 hc h ≈ 19.29 14w w � 4 wh für die Vorlesung KdP (eigentlich nur 3h), plus � 2 wh für die Vorlesung PK2 (eigentlich nur 1.5h), plus � 2 wh für das Tutorium (eigentlich nur 1.5h), plus � 11.29 wh zum Nachbearbeiten und zum Lösen der Übungsblätter. 1 http://de.wikipedia.org/wiki/European_Credit_Transfer_System Stefan Klinger · DBIS Informatik 2 · Sommer 2016 5 0 · Einleitung Das Modul Informatik 2 · 0.1 Literatur � � Umfassendes Folienscript. Zusammen mit PK2-Material vollkommen ausreichend für die Klausur. Bei weiterem Interesse: • Richard Bird, Philip Wadler2 . Introduction to Functional Programming using Haskell. 2. Ausgabe, 1998, Prentice Hall. ISBN 0-13-484346-0. • J. Mitchell. Concepts in Programming Languages. 2002, Cambridge University Press. ISBN 978-0-521-78098-8. 2 nur in der ersten Auflage Stefan Klinger · DBIS Informatik 2 · Sommer 2016 6 0 · Einleitung 0.2 Koordinaten · 0.2 Koordinaten Material https://svn.uni-konstanz.de/dbis/inf2_16s/pub Folien, Übungsblätter, Code. Wird regelmäßig aktualisiert. Vorlesungen immer 15:15–16:45 PK2 Montag, R513 “Hands on” Programmieren. KdP Dienstag, A701 und Mittwoch, R513 Theoretische Konzepte und Einführung in Haskell. ⇒ Beide Veranstaltungen bilden eine Einheit! Tutorien finden Donnerstags und Freitags statt (cf. Seite 10). Stefan Klinger · DBIS Informatik 2 · Sommer 2016 7 0 · Einleitung Koordinaten · 0.2 Subversion � Alle Materialien werden über Subversion3 verwaltet. Siehe Schlüsselqualifikation, 1. Semester. � Aus dem Repository4 sind zwei Unterverzeichnisse für Sie relevant: /pub Materialien aus der Vorlesung und Übungsblätter, wird von uns aktualisiert, Sie haben nur Leserechte. /group/foo Bearbeitung und Abgabe der Lösungen. Jede Übungsgruppe (hier: foo) bekommt ein Unterverzeichnis. Dort die Lösungen zu den wöchentlichen Übungen rechtzeitig eincheken! • Authentifizierung über Uni-ID, also user & passwd wie für Uni-Mail. • Den Namen der Gruppe erfahren Sie nach der Anmeldung für ein Tutorium. ⇒ Weitere Infos auf dem 1. Übungsblatt. 3 http://subversion.apache.org/ 4 https://svn.uni-konstanz.de/dbis/inf2_16s Stefan Klinger · DBIS (Leserechte nur in genannten Unterverzeichnissen) Informatik 2 · Sommer 2016 8 0 · Einleitung Koordinaten · 0.2 Tutorien Termine cf. Seite 10 Inhalt � Tutoren stellen Musterlösungen vor. � Fragen zur eigenen Lösung stellen. � Besprechen von Konzepten, die in der Vorlesung nicht ganz klar geworden sind. � Elaborierte Fragen stellen. � evtl. Tips von den Tutoren zur Lösung der nächsten Aufgaben. � Die Initiative geht von Ihnen aus! Obacht � Voraussetzung: Intensive Auseinandersetzung mit Stoff und Übungsblatt vor dem Tutorium. � Die Übungen lassen sich nicht im Rahmen der Tutorien bearbeiten! Stefan Klinger · DBIS Informatik 2 · Sommer 2016 9 0 · Einleitung Koordinaten · 0.2 Personal Prof. Marc Scholl LS Datenbanken und Informationssysteme (DBIS) web http://dbis.uni-konstanz.de/ office PZ811 Stefan Klinger Ich halte die Vorlesungen KdP und PK2 mail [email protected] office PZ804 Die Tutoren Stefan Erk (A) Do 13:30, E404 [email protected] Denis Gietz (D) Fr 8:15, F428 [email protected] Johannes Fuchs evtl. zwei Tutorien: (B) Do 15:15, F428, und (C) Do 17:00, F428 [email protected] Robert Schmid (E) Fr 10:00, F429 [email protected] Fabian Späh (F) Fr 11:45, G308 [email protected] Der im LSF angegebene Termin G, Fr 15:15 wird nicht angeboten. Stefan Klinger · DBIS Informatik 2 · Sommer 2016 10 0 · Einleitung 0.3 � Prüfung · 0.3 Prüfung Eine gemeinsame Klausur für PK2 und KdP. • Nur bei Bestehen der Klausur werden die ECTS-Punkte für PK2 und KdP gutgeschrieben. � Ein Übungsblatt pro Woche (für PK2 und KdP zusammen). • • • • � Ausgabe am Montag, Abgabe bis jeweils nächsten Montag, 15:00. Blätter werden in 2er-Teams bearbeitet. Klausur am Ende des Semesters bestimmt Note für KdP. Klausurzulassung ⇒ 50% der Übungspunkte erreicht. Ab diesem Semester ist die Prüfungsanmeldung (cf. Seite 12) zwingend notwendig. Stefan Klinger · DBIS Informatik 2 · Sommer 2016 11 0 · Einleitung 0.4 Anmeldung · 0.4 Anmeldung — Wichtig ← das ist nicht zum Spaß rot Prüfungsanmeldung Sie müssen sich innerhalb des Anmeldezeitraums5 via StudIS6 verbindlich zur Prüfung anmelden. Und zwar für beide cf. Info des Fachbereichs Veranstaltungen, KdP und PK2. Diese Woche beschrieben7 . � � Anmeldung per Mail, wie auf dem ersten Übungsblatt Frist: Mittwoch Abend, 18 Uhr Bildung der 2er-Teams für die Übungen, und Verteilung auf die Tutorien. Wenn sie sich frühzeitig anmelden, haben Vorrang bei der Terminwahl: • Eltern mit StEP8 , und • Fachfremde bei nachgewiesener Kollision mit einer anderen Pflichtvorlesung. 5 http://www.informatik.uni-konstanz.de/studieren/studium/pos-pruefungsinformationen/ pruefungsanmeldung/ 6 https://studis.uni-konstanz.de/ 7 https://svn.uni-konstanz.de/dbis/inf2_16s/pub/assignment01.pdf 8 http://www.familie.uni-konstanz.de/programme-fuer-eltern/studieren-mit-kind/ der-studierenden-elternpass/ Stefan Klinger · DBIS Informatik 2 · Sommer 2016 12 0 · Einleitung Anmeldung · 0.4 Noch Fragen zur Organisation? Stefan Klinger · DBIS Informatik 2 · Sommer 2016 13 0 · Einleitung 0.5 Konzepte der Programmierung · 0.5 Konzepte der Programmierung Je nach Zählung gibt es >50 Paradigmen (Konzepte), die sich nicht gegenseitig ausschließen. Eine übliche Einteilung Imperative Sprachen mit prominenten Vertretern: � • Strukturiert: Python, C, C++, Java Beispiel cf. Seite 15 • Objektorientiert: Python, C++, Java � Deklarative Sprachen • Funktionale Sprachen: Haskell, Erlang, JS Beispiel cf. Seite 18 Haskell entstand, um state-of-the-art FPL-Forschung in einer Sprache zusammenzuführen. Prominente Entwickler: Simon Peyton Jones, Philip Wadler, ... • Logische Sprachen: Prolog, Datalog Beispiel cf. Seite 19 Programmation en Logique. Initial: Alain Colmerauer, 1972. Viele Ableger. • Datenbanksprachen wie SQL oder XQuery cf. Modul Datenbanken! Werfen wir einen kurzen Blick auf drei Vertreter... Stefan Klinger · DBIS Informatik 2 · Sommer 2016 14 0 · Einleitung Konzepte der Programmierung · 0.5 Imperativ — Quicksort in Java 1 2 private static void quicksort(int[] a, int from, int to) { if (to - from > 0) { 3 4 int pivot = to; int l = from, r = to - 1; 5 6 while (l < r) { while ((l < r) && (a[l] <= a[pivot])) { l++; } while ((l < r) && (a[r] >= a[pivot])) { r--; } if (l != r) { swap(a, l, r); } else if (a[l] > a[pivot]) { swap(a, l, pivot); } } 7 8 9 10 11 12 13 14 15 16 quicksort(a, from, l - 1); quicksort(a, l + 1, to); 17 18 19 20 21 } } Code aus der KdI-Vorlesung von Dr. Meinl Stefan Klinger · DBIS Informatik 2 · Sommer 2016 15 0 · Einleitung Frage Konzepte der Programmierung · 0.5 Was passiert da? 1. Auswahl eines beliebigen Elements der Liste, sog. Pivotelement p. 2. Verschieben des Pivotlements in der Liste, so dass • alle Elemente links von p kleiner als p sind, und • alle Elemente rechts von p größer oder gleich p sind. ⇒ Damit ist das Pivotelement bereits an seiner endgültigen Position. 3. Rekursives Sortieren der linken und rechten Teilliste. � � Als Pivotelement kann man z.B. das rechteste Element der Liste wählen. Verschieben des Pivotelements: 1. 2. 3. 4. 5. Suche von links nach einem Element xi mit xi > p, suche von rechts nach einem Element xj mit xj < p, und vertausche die beiden Elemente. Solange wiederholen, bis sich i und j treffen. Pivotelement mit Element an Position i vertauschen, falls p < xi . Stefan Klinger · DBIS Informatik 2 · Sommer 2016 16 0 · Einleitung Konzepte der Programmierung · 0.5 Beispiel: � 512 170 61 897 908 87 503 415 512 170 61 897 908 87 503 415 87 170 61 897 908 512 503 415 87 170 61 415 908 512 503 897 Jetzt noch rekursiv die beiden Teillisten links und rechts von 415 sortieren. Grafik aus der KdI-Vorlesung von Dr. Meinl Stefan Klinger · DBIS Informatik 2 · Sommer 2016 17 0 · Einleitung Konzepte der Programmierung · 0.5 Funktional — Quicksort in Haskell 1 quicksort [] = [] 2 3 4 quicksort (x:xs) = quicksort (filter (<x) xs) � ++ [x] ++ quicksort (filter (>=x) xs) Dabei ist • • • • • � [] die leere Liste, (x:xs) die Liste mit erstem Element x und Restliste xs, [x] die Liste mit einem Element x, ++ die Listen-Konkatenation, filter p filtert die Elemente aus einer Liste, die p erfüllen. Benutzung: 1 2 *Main> quicksort [5,7,2,6,8,1,4,3,0,1] [0,1,1,2,3,4,5,6,7,8] Stefan Klinger · DBIS Informatik 2 · Sommer 2016 18 0 · Einleitung Konzepte der Programmierung · 0.5 Logisch — Pfadsuche in Prolog Ein Prolog-Programm besteht aus Fakten und Regeln. Etwa: � Fakten: Eine Datenbank mit Flugverbindungen. gla 1 2 3 4 5 leg(fdh, leg(fra, leg(sin, leg(cgn, leg(gla, cgn). sin). syd). sin). sin). leg(fdh, leg(fra, leg(sin, leg(cgn, fra). cgn). chc). gla). chc cgn sin fdh syd fra � Regeln: Fliegen mit Zwischenstop. 6 7 � route(A, B, []) :- leg(A, B). route(A, B, [X|XS]) :- leg(A, X), route(X, B, XS). Gegen diese Wissensbasis können Anfragen formuliert werden: Über welche Route Q komme ich von Frankfurt nach Singapore? Stefan Klinger · DBIS 1 2 3 4 5 ?- route(fra, sin, Q). Q = [] ; Q = [cgn] ; Q = [cgn, gla] ; false. Informatik 2 · Sommer 2016 19 0 · Einleitung � Konzepte der Programmierung · 0.5 Diese Anfragen können auch mehrere freie Variablen aufweisen: Wohin ab Friedrichshafen mit genau einem Zwischenstopp? 1 2 3 4 5 6 ?- route(fdh, B, B = sin, X = cgn B = gla, X = cgn B = sin, X = fra B = cgn, X = fra false. [X]). ; ; ; ; • Hier steht [X] für eine Liste mit nur einem Element X. Stefan Klinger · DBIS Informatik 2 · Sommer 2016 20 0 · Einleitung Konzepte der Programmierung · 0.5 Erste Beobachtungen � � Die gezeigten Sprachen unterscheiden sich stark: Sie “sehen anders aus”. Auch das Denkmodell ist jeweils ein anderes: Sie verwenden nicht nur andere Worte, sondern ganz andere Konzepte. � In Prolog: wo ist der Algorithmus. . . ? � Deklarative Sprachen bieten sehr kompakte Notation. � (Geordnete) Listen als “eingebaute” Datenstruktur. � Pattern Matching. � Alternative Definitionszweige. Deklarative Programmiersprachen (im Ggs. zu imperativen): Gemeinsam ist allen deklarativen Sprachen, dass die Lösung eines Problems � (eher) auf einer hohen Abstraktionsebene spezifiziert, � als auf einer niedrigen (Maschinen-) Ebene “ausprogrammiert” wird. ⇒ “Was und nicht wie.” Stefan Klinger · DBIS (Offensichtlich ist diese Unterscheidung etwas unscharf.) Informatik 2 · Sommer 2016 21 0 · Einleitung 0.6 � Inhalte der Vorlesung · 0.6 Inhalte der Vorlesung Eine rein funktionale Sprache lernen: Haskell Dadurch: Einen Einblick in verschiedene Konzepte von Programmiersprachen bekommen. � • Neue, Ihnen vermutlich unbekannte Konzepte werden eingeführt. Typinferenz, Funktionen höherer Ordnung, “unendliche” Datenstrukturen ... • Bekannte Konzepte stehen plötzlich nicht mehr zur Verfügung, Zuweisung, Seiteneffekte, unsauberer Umgang mit Typen, ... • oder sind ganz anders ausgeprägt. Auswertestrategie, I/O, Polymorphie... � Wir werden uns meist auf das rein funktionale Paradigma konzentrieren, mit dem Ziel die oben “unscharf” beschriebene Unterscheidung klarer herauszuarbeiten. � Ein wenig die mathematischen Grundlagen von Programmiersprachen beschnuppern. Stefan Klinger · DBIS Informatik 2 · Sommer 2016 22