Informatik 2 - Universität Konstanz

Werbung
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
Herunterladen