Überblick über die Veranstaltung

Werbung
Technische Universität Braunschweig
Institut für Programmierung und Reaktive Systeme
Dr. Werner Struckmann
21. Juli 2014
Programmieren
Übersicht
Programmieren I
Art der Veranstaltung: Wintersemester, Bachelor, 6 LP, 2 VL + 2 UE + Rechnerübung
Kurzbeschreibung: In der Vorlesung »Programmieren I« werden die Grundlagen der imperativen und objektorientierten Programmierung anhand der Programmiersprache »Java«
vermittelt und in der Übung, in der die Teilnehmer kleine Programme selbstständig entwickeln sollen, angewendet.
Stichwörter: Algorithmen und Programme, Programmiersprachen, Grundlagen der imperativen und objektorientierten Programmierung, Java, primitive Datentypen, Referenztypen, Felder und Zeichenketten, Anweisungen, Klassen, Objekte, (statische) Attribute,
(statische) Methoden, Konstruktoren, Vererbung, Schnittstellen, abstrakte Klassen, Beziehungen zwischen Klassen und Objekten, Rekursion, Ausnahmebehandlung, Programmkorrektheit, Test von Programmen, Ein- und Ausgabe.
Termine:
Beginn: Fr. 19. Oktober 2012
Vorlesung: Mo. 15:00–16:30 Uhr PK 15.1
Übung: Do. 08:00–09:30 Uhr PK 15.1
Sprechstunde: Mi. 10:30–11:30 Uhr IZ 244
Programmieren II
Art der Veranstaltung: Sommersemester, Bachelor, 6 LP, 2 VL + 2 UE + Rechnerübung
Kurzbeschreibung: Der zweite Teil der Veranstaltung erweitert und vertieft die im ersten
Semester erworbenen Kenntnisse. In den Übungen werden Datenstrukturen wie Listen,
Bäume und Graphen sowie Such- und Sortierverfahren programmiert. Darüber hinaus
werden die Grundlagen der Parallel- und der Grafikprogrammierung behandelt.
Stichwörter: Strukturierung von Programmen, Vertiefung der objektorientierten Programmierung, Aufzählungstypen, Annotationen, weiterführende Sprachkonzepte von Java, Datenstrukturen, generische Klassen, Listen, Bäume, Graphen, Hashverfahren, Such- und
Sortierverfahren, Parallelprogrammierung, Grafikprogrammierung, Überblick über C und
C++, Zeiger, Mehrfachvererbung, Überladen von Operatoren, Ausblick.
Termine:
Beginn: Di. 15. April 2014
Vorlesung: Di. 08:00–09:30 Uhr SN 19.1
Übung: Fr. 11:30–13:00 Uhr PK 15.1
Sprechstunde: Mi. 10:30–11:30 Uhr IZ 244
Diese Datei wird im Laufe des Semesters wöchentlich aktualisiert!
Gliederung der Veranstaltung
Vorbemerkungen
1 Algorithmus und Programm
1.1 Vom Algorithmus zum Programm
1.2 Programmiersprachen
1.3 Korrektheit, Komplexität und Entscheidbarkeit
1.4 Software-Grundlagen
2 Erste Schritte in Java
3 Java: Grundlagen der Sprache
3.1 Lexikalische Elemente
3.2 Datentypen und Variable
3.3 Ausdrücke
3.4 Speicherung von Werten
3.5 Anweisungen
3.6 Beispiele aus der Praxis
3.7 Ein Blick auf imperatives Programmieren
4 Objektorientierte Programmierung in Java
4.1 Klassen, Objekte und Methoden
4.2 Vererbung
4.3 Modifikatoren
4.4 Klassenvariable und statische Methoden
4.5 Abstrakte Klassen
4.6 Schnittstellen
4.7 Zusammenfassung
5 Rekursion/Funktionale Programmierung
5.1 Einführung und Begriffe
5.2 Beispiele rekursiver Methoden in Java
5.3 Ein Blick auf funktionales Programmieren
6 Zuverlässigkeit von Programmen
6.1 Behandlung von Ausnahmesituationen
6.2 Grundlagen der Programmverifikation
6.3 Die Zusicherungsanweisung
6.4 Testen von Programmen
7 Klassen und Methoden zur Ein- und Ausgabe
–2–
8 Weiterführende Sprachkonzepte von Java
8.1 Lokale und anonyme Klassen
8.2 Weiteres zu den Wrapper-Klassen
8.3 Aufzählungstypen
8.4 Die Klassen String, StringBuffer und StringTokenizer
8.5 Strukturierung von Programmen
8.6 Annotationen
Zwischenstand
9 Java und Datenstrukturen
9.1 Lineare Listen
9.2 Generische Datentypen
9.3 Keller und Schlangen
9.4 Graphen
9.5 Suchen und Sortieren
9.6 Hash-Verfahren
9.7 Persistenz von Daten
9.8 Das Java Collections Framework
10 Parallelprogrammierung in Java
10.1 Das Problem des gegenseitigen Ausschlusses
10.2 Grundlagen und Begriffe
10.3 Verwaltung von Threads
10.4 Kommunikation und Synchronisation
10.5 Die speisenden Philosophen
10.6 Das Concurrent-Paket
11 Grafikprogrammierung in Java
11.1 Grundlagen
11.2 Grafische Grundelemente
11.3 Fensterklassen
11.4 Ereignisse und Widgets
11.5 Applets
11.6 Die Swing-Klassen
12 Ausblick
12.1 Objektorientierte Programmierung: Entwurfsmuster
12.2 Programmierparadigmen und -sprachen
12.3 Gegenstände der Softwaretechnik
Quellenverzeichnis
–3–
A Übungen, Ergänzungen, Fallstudien, Wiederholungen
A.1 Unix-Grundlagen
A.2 Algorithmen: Korrekheit, Komplexität
A.3 Vom Algorithmus zum Programm: Programmentwicklung
A.4 Regeln zur Formatierung von Java-Programmen
A.5 Java-Operatoren
A.6 Felder
A.7 Fallstudie: Komplexität von Algorithmen (1)
A.8 Fallstudie: Objektorientierung (Polynome)
A.9 Abstraktion und Modellierung
A.10 Objektorientierte Konzepte und Fallstudie (Punkte, Geraden)
A.11 Fallstudie: Abstrakte Klassen (Funktionen)
A.12 Berechenbarkeit (1)
A.13 Fallstudie: Komplexität von Algorithmen (2)
A.14 Zwei erste Beispiele für grafische Oberflächen
A.15 Programmtest mit JUnit
A.16 Die Osterformel von Gauß
A.17 Einige Programme des JDK
A.18 Polymorphismus
A.19 Alias-Name, Gültigkeit, Sichtbarkeit und Lebensdauer
A.20 Fallstudie: Graphen, Breitensuche (Zusammenhangskomponenten)
A.21 Algorithmen und Datenstrukturen (Übersicht)
A.22 Abstrakte Datentypen (ADT)
A.23 Fallstudie: Mergesort, Divide-and-Conquer, Generizität
A.24 Fallstudie: Keller (Klammerstrukturen)
A.25 Die Programmiersprache C
A.26 Wiederholung: Paradigmen und Sprachen (Übersicht)
A.27 Wiederholung: Vom Algorithmus zum Programm
A.28 Skriptsprachen, C-Shell, JavaScript
A.29 Fallstudie: Bäume (AVL-Bäume)
A.30 Berechenbarkeit (2)
B Themen der Übungsaufgaben
B.1 1. Übungsblatt
B.2 2. Übungsblatt
B.3 3. Übungsblatt
B.4 4. Übungsblatt
B.5 5. Übungsblatt
B.6 6. Übungsblatt
B.7 7. Übungsblatt
B.8 8. Übungsblatt
B.9 9. Übungsblatt
B.10 10. Übungsblatt
B.11 11. Übungsblatt
B.12 12. Übungsblatt
–4–
B.13 13. Übungsblatt
B.14 14. Übungsblatt
–5–
Vorbemerkungen
Informatik als Wissenschaft; inhaltlicher Überblick über die Vorlesung; organisatorische
Aspekte; Literaturempfehlungen.
1 Algorithmus und Programm
1.1 Vom Algorithmus zum Programm
Algorithmusbegriff; Spezifikation; Eigenschaften von Algorithmen; Algorithmus und Programm; Programmiersprache; programmieren; grundlegende Aspekte der Entwicklung von
Algorithmen: Paradigma, Komplexität, Korrektheit, Verifikation, Berechenbarkeit, Entscheidbarkeit, Church’sche These, Entwurf von Algorithmen, abstrakter Datentyp, Varianten des Algorithmusbegriffs, Hinweis auf Standardalgorithmen; Paradigmen zur Algorithmenbeschreibung: imperativ, funktional, objektorientiert und logisch; weitere Paradigmenbegriffe: prozedural, deklarativ, hybrid; Beispiel eines imperativen Algorithmus; der
Algorithmus von Euklid; Zustand; Zustandstransformation; Datenstrukturen; Typsystem;
natürliche und künstliche Sprachen; Sprachen der Informatik.
1.2 Programmiersprachen
Entwicklung der Programmiersprachen; Definition von Programmiersprachen; lexikalische
Struktur; Syntax; Semantik; Pragmatik; Klassifikation der Programmiersprachen: Maschinensprachen, Assembler und problemorientierte Sprachen; Implementierung von Programmiersprachen: Interpreter, Compiler, Mischverfahren, Just-in-Time-Compiler; Verarbeitung von Java-Programmen.
1.3 Korrektheit, Komplexität und Entscheidbarkeit
Spezifikation; Korrektheit; partielle und totale Korrektheit; Verifikation; Nachweis der partiellen und totalen Korrektheit des Algorithmus von Euklid; Schleifeninvariante; Test; Validation; Komplexität; Komplexität des Algorithmus von Euklid; O-Notation, landausche
Symbole; Entscheidbarkeit; Herleitung der Komplexität eines Sortieralgorithmus; Halteproblem; Nachweis der Unentscheidbarkeit des Halteproblems; Berechenbarkeit; Existenz
nicht berechenbarer Funktionen.
1.4 Software-Grundlagen
Aufbau eines Rechners; Systemsoftware; Anwendungssoftware; Softwarewerkzeuge; Betriebssystem; textuelle und grafische Oberfläche; wichtige Betriebssysteme; Dateiverwaltungssystem; Editor; Programmierwerkzeuge; Programmierumgebungen.
–6–
2 Erste Schritte in Java
Abstraktion; Modellbildung; Beispiel: Kontoverwaltung; Klassen- und Objektdiagramm;
Kommentare; Klasse; Objekt; Attribut; Methode; Parameter; Rückgabewert; Variable;
Konstruktor; Applikation; main-Methode; Hinweis auf Applets; Regeln zur Code-Formatierung; Programmkommentare; der Dokumentationsgenerator javadoc; objektorientierte
Programmiersprachen; der Algorithmus von Euklid als statische Methode; Sprachmerkmale von Java; Entwicklung von Java; einige Java-Konzepte; einige Programme des JDK;
Zusammenfassung der Einführung.
3 Java: Grundlagen der Sprache
3.1 Lexikalische Elemente
Lexik; Lexem; Eingabezeichen; Unicode, Unicode-Transformationsformat; Ausgabe von
Systemeigenschaften; Kommentare; Dokumentationskommentare; Bezeichner (identifier);
Regeln zur Wahl von Bezeichnern; Literale; Wahrheitswerte; Zahlen; Zeichen; Zeichenketten; Null-Literal; Schlüsselwörter; reservierte Wörter; Trennzeichen; Operatoren; Interpunktionszeichen.
3.2 Datentypen und Variable
Struktur von Java-Programmen; Übersicht über die Datentypen; primitive Datentypen:
boolean, char, byte, short, int, long, float, double; Wertebereiche und Literale der primitiven Datentypen; Variable; Instanz- und Klassenvariable; lokale Variable; Deklaration und
Initialisierung von Variablen; Lebensdauer; Sichtbarkeit; Arrays; Deklaration, Allokation
und Initialisierung von Arrays; mehrdimensionale Arrays; Strings; Referenztypen; Erzeugung von Objekten; Zuweisung von Referenztypen; Vergleich von Referenztypen; Garbage
Collector; die Begriffe »statisch«, »dynamisch« und »semidynamisch«; einschränkende und
erweiternde Typkonvertierungen; Typkonvertierungen für primitive Datentypen; impliziter
und expliziter Cast.
3.3 Ausdrücke
Ausdruck; Operand; Operator; Stelligkeit eines Operators; Rückgabewert; Priorität eines
Operators; Linksassoziativität; Rechtsssoziativität; Seiteneffekt; Auswertungsreihenfolge;
arithmetische, relationale und logische Operatoren; ganzzahlige Division; Zuweisungsoperatoren; Fragezeichen-Operator; cast-Operator; weitere Operatoren; Vorrangregeln für Operatoren.
3.4 Speicherung von Werten
Beispiele für fehlerhafte Rechnungen mit einem Java-Programm; Speicherung von Information; Byte Order; big endian, little endian; ASCII- und ISO-Latin-1-Zeichensatz; UnicodeZeichensatz; Unicode-Transformations-Formate (UTF); Speicherung ganzzahliger Daten-
–7–
typen; Zweierkomplement; Gleitkommadarstellung reeller Zahlen und ihre Problematik;
Beispiel; Summe von Zahlen unterschiedlicher Größenordnung; Auslöschung; Vergleich von
Gleitkommazahlen; Java-Beispiel; Pseudoarithmetik; Speicherung von primitiven und Referenztypen; schematisches Speicherbild.
3.5 Anweisungen
Die Java Language Specification; Beispiele aus dem Kapitel zur Syntax; Übersicht über
die Java-Anweisungen; elementare Anweisungen; leere Anweisung; Block; Variablendeklaration; definite assignment; Datenflussanalyse; Ausdruck als Anweisung; If- und SwitchAnweisung; While- und Do-Anweisung; abweisende und nicht abweisende Schleifen; ForAnweisung; erweiterte For-Anweisung; Break- und Continue-Anweisungen mit Marken;
Return-Anweisung; Beispiele: größter Teiler einer Zahl, Primzahlberechnung, Vertauschen
zweier Werte, Maximum zweier Zahlen, Maximum dreier Zahlen, Maximum eines Feldes,
Summe ganzer Zahlen, Summe der Elemente eines Felds; Summe der Elemente einer Matrix; Betrag einer Zahl, Fakultät einer Zahl, Potenz, Fibonacci-Folge.
3.6 Beispiele aus der Praxis
Vertiefung der bisher behandelten Sprachkonzepte an Beispielen aus verschiedenen Gebieten: Berechnung von Zinseszinsen; Teilbarkeit; Darstellung einer natürlichen Zahl zu
einer beliebigen Basis; schnelle Exponentiation; Horner-Schema; Skalarprodukt von Vektoren; Länge eines Vektors; Produkt von Matrizen; Nullmatrix; Beispiel zu Break- und
Continue-Anweisungen mit Marken; Newton-Verfahren zur Nullstellenbestimmung; Bubblesort; Erzeugung von Pseudozufallszahlen mit der linearen Kongruenzmethode.
3.7 Ein Blick auf imperatives Programmieren
Variable; Zustand; Wertzuweisung; Sequenz; Selektion; Iteration; Ein- und Ausgabe; Zustand eines Objekts; Zustand des Programms; der Algorithmus von Euklid in imperativer
Fassung in den Sprachen Java, JavaScript, Pascal, C, Modula-2 und Scheme; Ausblick auf
Konzepte imperativer Programmiersprachen: Funktionen, Prozeduren, Datentypen, Module, Ausnahmebehandlung, Parallelverarbeitung; Algorithmus von Euklid: imperative vs.
funktionale Version, funktionale Variante in Scheme und Haskell.
4 Objektorientierte Programmierung in Java
4.1 Klassen, Objekte und Methoden
Objekt; Zustand; statische und dynamische Eigenschaften; Schnittstelle; Dienst eines Objekts; Nachricht; wert- und identitätsbasierte Objektmodelle; Kapselung und Geheimnisprinzip; Abstraktion und Modellierung; Klasse; Objekt; Instanz; Methode; Membervariable; Instanzvariable; Attribut; Erzeugung und Initialisierung von Objekten; Deklaration von Variablen und Methoden; Zuweisung von Objekten; Semantik von Variablen
und Zuweisungen; Storage-Semantik; Assignment-by-sharing; Parameter einer Methode;
–8–
Aufruf einer Methode; Punktnotation; this-Zeiger; Parameterübergabe; Rückgabewert einer Methode; Überladen von Methoden; Signatur einer Methode; Konstruktoren; DefaultKonstruktor; Verkettung von Konstruktoren; Destruktoren; get-/set-Methoden; toString;
equals; typischer Aufbau einer Klasse; Beispiele: Adresskartei, Horner-Schema, Aufruf von
Methoden, Bubblesort, Newton-Verfahren, Methoden mit einer variablen Parameterzahl;
Fallstudie: Polynomarithmetik.
4.2 Vererbung
Beziehungen zwischen Klassen; Vierecke und ihre Beziehungen; einfache Vererbung; Basisklasse; Oberklasse; abgeleitete Klasse; Unterklasse; Spezialisierung; Generalisierung; Zuweisungen; Polymorphie; Verdecken von Variablen; Überlagern von Methoden; dynamische
Methodensuche; die super-Notation; die Klasse Object; die Methode String toString();
die Methode boolean equals(); die Methode Object clone(); Konstruktoren; der Superklassenkonstruktor; Reihenfolge der Aufrufe von Konstruktoren; finale Klassen; Vererbungshierarchien; Vererbungshierarchien als gerichtete Bäume; mehrfache Vererbung;
Klassendiagramm; Objektdiagramm; Beziehungen zwischen Klassen und Objekten: der
instanceof-Operator; Beziehungen zwischen Objekten: Assoziation, Kardinalität, Multiplizität, Aggregation, Komposition.
4.3 Modifikatoren
Modifikator; die Modifikatoren public, final und abstract für Klassen; die Modifikatoren public, private, protected, static, final und abstract für Variable und Methoden; Bemerkungen zum Einsatz von Modifikatoren; Hinweis auf weitere Modifikatoren.
4.4 Klassenvariable und statische Methoden
Klassenvariable; Deklaration und Zugriff; Beispiel: Objektzähler; Konstante; Klassenmethoden; Deklaration und Zugriff; Beispiele: Objektzähler, Tabelle der Quadratwurzeln; die
Methode main und ihr Argument; statische Konstruktoren; utility class.
4.5 Abstrakte Klassen
Abstrakte und konkrete Methoden; abstrakte und konkrete Klassen; Fallbeispiel für abstrakte Klassen und Polymorphismus: Gehaltsberechnung; polymorphe Methoden in Konstruktoren.
4.6 Schnittstellen
Definition einer Schnittstelle; Implementierung einer Schnittstelle; Beispiel; das Interface
Comparable; Aussage der API über die Methode compareTo; die Klasse String; kleinstes
Element und Bubblesort als Beispiele; Generizität; mehrfache Implementierung; Schnittstellen und Vererbung; Verwendung von Schnittstellen; Konstanten.
–9–
4.7 Zusammenfassung
Wiederholung, Überblick und Zusammenfassung über objektorientiertes Programmieren;
Vorteile der Vererbung; Vorgehensweise beim objektorientierten Programmieren.
5 Rekursion/Funktionale Programmierung
5.1 Einführung und Begriffe
Rekursives Konzept; Fakultät; Motivierendes Beispiel: Berechnung der Quersumme einer natürlichen Zahl durch eine iterative und eine rekursive Methode; partielle und totale Funktionen; Definitionsbereich; Möglichkeiten zur Definition von Funktionen: Tabelle,
Ausdruck; rekursive Definitionen; Ersetzungssystem; Auswertung; Formen der Rekursion:
lineare Rekursion, Endrekursion, Baumrekursion, geschachtelte Rekursion, verschränkte
oder wechselseitige Rekursion; Beispiele: Fakultät, Fibonacci-Folge, Algorithmus von Euklid, schnelle Exponentiation, Summe, Skalarprodukt; dynamische Algorithmen; operationelle und denotationale Semantik einer rekursiven Definition; Innermost-, Outermost- und
Mixed-Auswertung; Ackermann-Funktion.
5.2 Beispiele rekursiver Methoden in Java
Fallbeispiele rekursiver Methoden: Newton-Verfahren, Intervallschachtelung (Bisektion),
Geldwechsel, Türme von Hanoi, das Acht-Damen-Problem; der Fragezeichen-Operator;
for-Anweisungen mit Initialisierungs- und Update-Listen; Wiederholung des BubblesortAlgorithmus; Quicksort; Wrapper-Klassen der primitiven Datentypen; einige Konstruktoren und Methoden der Wrapper-Klassen; Autoboxing und Unboxing.
5.3 Ein Blick auf funktionales Programmieren
Funktionen höherer Ordnung; funktionale Algorithmen; funktionale Programmiersprachen;
Lisp und Scheme; funktionale Version des Algorithmus von Euklid; Haskell; Algorithmus
von Euklid in Scheme und Haskell; Zusammenfassung der Aspekte.
6 Zuverlässigkeit von Programmen
Motivation.
6.1 Behandlung von Ausnahmesituationen
Die Ausnahmen ArithmeticException und ArrayIndexOutOfBoundsException; Behandlung von Ausnahmen; Beispiele für Ausnahmen; grundlegende Begriffe: Ausnahme, Auslösen einer Ausnahme, Behandeln einer Ausnahme; die try-catch-Anweisung; prinzipielle
Vorgehensweise; die Methode parseInt; Beispiel: Zahldarstellung zu verschiedenen Basen;
Fehlerobjekte; Fortsetzen nach einer Ausnahme; mehrere catch-Klauseln; die finallyKlausel; die catch-or-throw-Regel; Weitergabe einer Ausnahme; die throws-Klausel; die
– 10 –
Klassen Throwable, Error, Exception, RuntimeException und ArithmeticException;
die throw-Anweisung; Erzeugen und Auslösen von Ausnahmen; eigene Fehlerklassen; Beispiele; wichtige Javadoc-Markierungen.
6.2 Grundlagen der Programmverifikation
Hoare’sche Logik; Hoare’scher Kalkül; Nachbedingung; Vorbedingung; Schleifeninvariante;
Axiomenschema; Ableitungsregeln; Zustand; partielle und totale Korrektheit; Korrektheit
und relative Vollständigkeit des Kalküls; Beispiele: ganzzahlige Division mit Rest, schnelle
Exponentiation; abessinische Bauernmethode zur Multiplikation ganzer Zahlen.
6.3 Die Zusicherungsanweisung
Die assert-Anweisung; Aufruf des Compilers und des Interpreters; Anwendungen der
assert-Anweisung; Beispiel: ganzzahlige Division mit Rest; Anwendung in öffentlichen
Methoden; Anwendung in privaten Methoden; Nachbedingungen; Vorbedingungen; Schleifeninvariante; Kontrollflussinvariante; komplexe Zusicherungen; Klasseninvariante; bedingte Übersetzung; Ausschalten von Zusicherungen; Seiteneffekte; Einschalten von Zusicherungen.
6.4 Testen von Programmen
Phasen der Software-Entwicklung; Modelle der Software-Entwicklung; Dokumente; Modellierungssprachen; UML; Struktur- und Verhaltensdiagramme; Werkzeuge; Spezifikation; Verifikation; Sicherheits- und Lebendigkeitseigenschaften; Validierung; Test; systematisches Testen; Modultest; Integrationstest; Auswahl der Testdaten; Black- und WhiteBox-Tests; Überdeckungsmaße für White-Box-Tests; JUnit: Einführung mit Beispiel.
7 Klassen und Methoden zur Ein- und Ausgabe
Möglichkeiten zur Ein- und Ausgabe von Daten; Grundlagen; wahlfreier und sequentieller
Zugriff; Streams; Byte- und Character-Streams; Öffnen und Schließen einer Datei; Brückenklassen; die Stream-Basisklassen; die Klasse PrintStream; die Klasse System; die Methode
exit; System.out, System.in und System.err; Properties; Ausgabe auf dem Bildschirm;
Ausgabe in eine Datei; Eingabe von der Tastatur; Lesen aus einer Datei; Pufferung der
Ein- und Ausgabe; die Klasse File; Transaktion; Anlegen und Löschen einer Datei; Zugriff auf den Pfadnamen; Informationen über eine Datei; Ändern von Verzeichniseinträgen;
Beispiel: rekursiver Durchlauf durch ein Verzeichnis; formatierte Ausgabe; Formatstring;
Steuerzeichen; die Klasse Scanner.
– 11 –
8 Weiterführende Sprachkonzepte von Java
8.1 Lokale und anonyme Klassen
Lokale Klassen; Definition und Benutzung lokaler Klassen; Beispiel; statische lokale Klassen; anonyme Klassen; Beispiel; Realisierung von Funktionen höherer Ordnungen durch
Schnittstellen; Beispiel für anonyme Klassen; Erweiterung des new-Operators; Anwendung
lokaler und anonymer Klassen.
8.2 Weiteres zu den Wrapper-Klassen
Wiederholung der Datentypen; Wrapper-Klassen zu den primitiven Datentypen; Konstruktoren der Wrapper-Klassen; Wertrückgabe; parse-Methoden; Konstante und weitere Methoden; die Klasse Integer als Beispiel; Autoboxing und Unboxing.
8.3 Aufzählungstypen
Motivation; Aufzählungstypen; Enum-Klassen; Eigenschaften und Methoden der Aufzählungstypen; selbstdefinierte Methoden in Enum-Klassen; Datenfelder in Enum-Klassen;
Enum-Konstruktoren; Anwendungsmöglichkeiten für Enum-Klassen; Beispiel: Berechnung
des Wochentags eines gegebenen Datums.
8.4 Die Klassen String, StringBuffer und StringTokenizer
Wiederholung und Erweiterung der Klasse String; Konstruktoren; Methoden zur Zeichenextraktion, zum Vergleich, zum Suchen und Ersetzen sowie Konvertierungsfunktionen;
die Klasse StringBuffer; Unterschiede zur Klasse String; Konstruktoren; einige Methoden der Klasse StringBuffer; Beipiel: Effizienzsteigerung bei häufiger Konkatenation; die
Klasse StringTokenizer; Konstruktoren und einige Methoden; Beispiel.
8.5 Strukturierung von Programmen
Programmelemente von Java; Pakete; Applikationen; Applets; Verwendung von Paketen;
qualifizierter und unqualifizierter Import; statischer Import; das Paket java.lang; wichtige
Java-Pakete; Klassen des Pakets java.util; Bedeutung der Paketnamen; Erstellen eigener Pakete; Verzeichnisstruktur der Pakete; das Default-Paket; Zugriffsrechte für Klassen,
Methoden und Variable; die CLASSPATH-Variable.
8.6 Annotationen
Annotation; Metainformation; Annotationsprozessor; reflektive Auswertung; annotierte
Programmelemente; Annotationen vs. Kommentare vs. Modifikatoren; die vordefinierten Annotationen @Deprecated, @Override, @SuppressWarnings, @Retention, @Target,
@Documented und @Inherited; Erstellung von Annotationen; Beispiel.
– 12 –
Zwischenstand:
Kurze Zusammenfassung der bisherigen Inhalte.
Jetzt kommen Anwendungen.
9 Java und Datenstrukturen
9.1 Lineare Listen
Definition und grundlegende Eigenschaften linearer Listen; typische Listenoperationen; „lineare Liste“ als abstrakter Datentyp; Schnittstelle und Implementierung des abstrakten
Datentyps; Strukturinvariante; ausführliche Herleitung der insert-Methode mit Erhaltung der Strukturinvariante; modifizierte Schnittstelle mit zugehöriger Implementierung;
Behandlung von Elementklassen; Implementierung durch Felder; sortierte Listen; alternative Implementierung mit Zeiger auf das erste Element und Zusatzinformationen; Sentinel; Aufzählungen; Implementierung und Anwendung von Aufzählungen; zirkuläre Listen;
die Josephus-Funktion; Implementierung von Datenstrukturen; Wiederholung: die Klasse
Object; die Klasse Class; Kopieren von Objekten; flache und tiefe Kopien; die Methode
clone() der Klasse Object; die Schnittstelle Cloneable; Kopieren einer Liste; unveränderliche Klassen.
9.2 Generische Datentypen
Wiederverwendbarkeit (reusability); Generizität; generische Methoden; generische Klassen; generische Schnittstellen; Beispiel: lineare Listen; die Klasse Number; Typebounds;
Klassen als Typebounds; Schnittstellen als Typebounds; Klassen und Schnittstellen als
Typebounds; Wildcards; Invarianz; Bivarianz; Kovarianz; Kontravarianz; Übersicht; erlaubte Operationen; Wiederholung: Typkompabilität; Generizität in Java; Zusammenstellung kompatibler Datentypen; Kovarianz bei Array-Typen.
9.3 Keller und Schlangen
Keller; LIFO-Prinzip; Anwendungen; Kelleroperationen; Implementierung eines Kellers
durch eine Liste; Implementierung eines Kellers durch ein Feld; Schlangen; FIFO-Prinzip;
Anwendungen; Operationen für Schlangen; Implementierung einer Schlange durch eine Liste; Implementierung einer Schlange durch ein Feld; Deques; Bemerkungen zur Java-API.
9.4 Graphen
Graph; Knoten; Kante; gerichteter Graph; ungerichteter Graph; bewerteter Graph; Mehrfachkante; Zyklus; Schlinge; Attribute; Anwendungsbeispiele; Adjazenz; Grad eines Knotens; Pfad; Zusammenhang; vollständiger Graph; gewichteter Graph; Speicherung von Graphen: Kantenliste, Knotenliste, Adjazenzmatrix, Adjazenzliste; Komplexität der Operationen; Variationen dieser Möglichkeiten.
– 13 –
9.5 Suchen und Sortieren
Baum; Definition; Wurzel; innerer Knoten; Blatt; Pfad; Tiefe; Anwendungen von Bäumen; Anzahl der Knoten in einem Binärbaum; Durchlauf durch einen Binärbaum; binäre
Suchbäume und ihre Implementierung; Sortieren mit binären Suchbäumen; Erzeugung von
Zufallszahlen; Mergesort; Wiederholung: Bubblesort, Quicksort.
9.6 Hash-Verfahren
Grundlagen; Hash-Funktion; Hash-Tabelle; Kollision; Beispiel; Behandlung von Kollisionen; Hash-Verfahren ohne Überlaufbereich; lineare Verschiebung; quadratische Verschiebung; Hash-Verfahren mit linearer Liste als Überlaufbereich; die Klasse Hashtable; die
Klasse HashMap.
9.7 Persistenz von Daten
Persistenz von Daten; Serialisierung und Deserialisierung von Objekten; der Modifikator transient; die Schnittstelle Serializable; Anwendungen: Schreiben und Lesen von
Objekten in bzw. aus Dateien; tiefes Kopieren durch Serialisierung; Versionierung von serialisierten Daten; das Programm serialver; dynamisches Laden von Klassen; Beispiele
aus dem Paket java.lang.reflect.
9.8 Das Java Collections Framework
Kollektionen; Mengen; Relationen; Funktionen; das Java Collections Framework; Überblick
über wichtige Schnittstellen, Implementierungen (abstrakte, konkrete Klassen) und Algorithmen: Collection, AbstractCollection, AbstractList, AbstractSet, AbstractMap,
Set, SortedSet, List, Queue, Deque, Map, SortedMap, Stack, Vector, TreeSet, HashMap,
Iterable, Iterator, ListIterator; Anwendung: sortierte endliche Mengen am Beispiel
„Lottotipp“; Comparator; die Kollektion-Algorithmen; Beispiel: die Klasse ArrayList;
ArrayList und LinkedList im Vergleich; kurzer Blick auf Heaps; Prioritätsschlangen;
die Klasse PriorityQueue.
10 Parallelprogrammierung in Java
10.1 Das Problem des gegenseitigen Ausschlusses
Varianten des Algorithmusbegriffs: terminierend, nichtterminierend (reaktiv), deterministisch, nichtdeterministisch, approximativ, determiniert, randomisiert, sequenziell, parallel,
verteilt; Einstieg in die Parallelprogrammierung; ein paar Aspekte zur Programmierung
von Nebenläufigkeit: Prozessverwaltung; Kommunikation zwischen Prozessen; Synchronisation von Prozessen; Eigenschaften; Sicherheit, Lebendigkeit, Fairness; das Problem des
gegenseitigen Ausschlusses; elementare Aktion; Ausführung paralleler Prozesse; interleaving semantics; Beispiel: Betriebsmittelzuweisung; Abstraktion des Problems; verschiede-
– 14 –
ne Lösungsansätze; Szenarium; Sicherheitseigenschaft; Lebendigkeitseigenschaft; Verklemmung; Verschwörung; der Algorithmus von Dekker; aktives Warten.
10.2 Grundlagen und Begriffe
Prozess; Thread; leicht- und schwergewichtige Prozesse; sequentielle und parallele Verarbeitung; Parallelität; Quasi-Parallelität; Nebenläufigkeit; unabhängige und gekoppelte Anweisungen und Prozesse; Beispiele; Prozessverwaltung; Erzeugen und Beenden von
Prozessen; Kommunikation; gemeinsame Variable; Nachrichtenaustausch; Synchronisation;
synchrone und asynchrone Arbeitsweise; Konzepte zur Nebenläufigkeit in Programmiersprachen; Semaphore; Monitore; Standardaufgaben der Parallelprogrammierung; ErzeugerVerbraucher-Problem; Leser-Schreiber-Problem; Problem der speisenden Philosophen; einige Fairness Begriffe; Nebenläufigkeit in Java.
10.3 Verwaltung von Threads
Die Klasse Thread; Erzeugung eines Threads durch Überlagerung von run; die Methode
start; Ende einer Anwendung; Dämonen; als “deprecated” gekennzeichnete Methoden;
Transaktionen; Beenden eines Threads; weitere Methoden der Klasse Thread; Lebenszyklus
eines Threads; die Schnittstelle Runnable; Beispiel.
10.4 Kommunikation und Synchronisation
Kommunikation durch gemeinsame Variable; Synchronisation durch Monitore; Beispiel:
Bankbetrieb und verlorene Buchungen; der Modifikator synchronized; synchronisierte
Methoden und Blöcke; Sperren für Objekte und Klassen; Grundregel zur Synchronisation; Wartemenge eines Objekts; die Methoden wait und notify; Fairness; der Modifikator volatile; weak/strong transition/process fairness; Lösung des Erzeuger-VerbraucherProblems; die Methode notifyAll; Beispiel: Parkhausbetrieb; Priorität eines Threads;
Thread-Gruppen; Übersicht über die Methoden der Klasse Object; Programmierrichtlinien zur Parallelprogrammierung.
10.5 Die speisenden Philosophen
Problemstellung; Lösung in Java mit wait und notifyAll.
10.6 Das Concurrent-Paket
Überblick; die Schnittstellen und Klassen Executor, Executors und ExecutorService;
das Erzeuger-Verbraucher-Problem; die Schnittstellen und Klassen Lock, ReentrantLock
und Condition; die Klasse ArrayBlockingQueue; die Klasse Semaphore; Nachrichtenaustausch; das Rendez-Vous-Konzept; Hinweis auf die Synchronizer-Klassen (zum Beispiel
Exchange), das Unterpaket atomic und die „Concurrent Collections“; Zusammenfassung:
Programmierung von Nebenläufigkeit.
– 15 –
11 Grafikprogrammierung in Java
11.1 Grundlagen
Schnittstelle für Anwenderprogramme; API; das Abstract Window Toolkit (AWT); die
Swing-Bibliothek; Hinweis auf das Standard Window Toolkit (SWT); Möglichkeiten des
AWTs; grundsätzliche Vorgehensweise; der grafische Kontext; Beispiel: ein einfaches Fenster; Ein-Ausgabe-Programmierung; ereignisgesteuerte Programmierung; Delegation Based
Event Handling; Quelle eines Ereignisses; Beobachter; Single-Cast-Ereignis; Multi-CastEreignis; Schließen eine Fensters; Adapter-Klassen; die Klasse WindowAdapter als Beispiel.
11.2 Grafische Grundelemente
Das grafische Koordinatensystem; Benutzerbereich eines Fensters; Auswahl elementarer
Grafikroutinen zur Darstellung von Text, Linien, Rechtecken, Polygonen, Ellipsen und
Ellipsenbögen; Schriftarten; Schriften mit Serifen; serifenlose Schriften; Schriften mit variabler und konstanter Zeichenbreite; Fett- und Kursivdruck; Methoden zur Ermittlung
von Font-Informationen und -Metriken; das RGB-Farbmodell; vordefinierte Farben; gebräuchliche Farbwerte; Erzeugung und Verwendung von Farben; die Klasse SystemColor.
11.3 Fensterklassen
Die Behälterklassen Component, Container, Applet, Window und Frame; Aufrufen und
Schließen eines Fensters; Eigenschaften eines Fensters.
11.4 Ereignisse und Widgets
Ereignis; Ereignisquelle; Beobachter; ereignisgesteuerte Programmierung; Single-Cast- und
Multi-Cast-Ereignis; Adapter-Klasse; Überblick über die Ereignisklassen und BeobachterSchnittstellen; Low-Level-Events; Widget; wichtige Widgets; Beispiele: Rollbalken, Label,
Button, Textfeld, Checkbox, Checkboxgroup, Choice; Realisierung von Widgets.
11.5 Applets
Anwendungen und Applets; Eigenschaften von Applets; Beispiel; grundlegende Methoden;
Umwandlung zwischen Anwendungsprogrammen und Applets; Beispiel.
11.6 Die Swing-Klassen
Die Java Foundations Classes; AWT und Swing im Vergleich; der Peer-Ansatz; leicht- und
schwergewichtige Komponenten; einfaches Beispiel mit AWT- und Swing-Klassen; Einordnung der Swingklassen; die Komponentenklassen Component, Container, JComponent,
FlowLayout, BorderLayout, GridLayout, Graphics, JLabel, AbstractButton, JRadio
Button, JComboBox, JList, JTextComponent, JScrollPane, JPanel, JProgressBar; die
Behälterklassen JFrame, JWindow, JDialog, JApplet, JMenuBar, JToolBar, Border; BorderFactory, Vorgehensweise zur Erstellung von grafischen Oberflächen; Adapterklassen;
– 16 –
Strukturierung von Behälter- und Beobachterklassen; Beispiel: Fenster mit Menü- und
Werkzeugleiste. Einige weitere Swing-Klassen/Schnittstellen. Zum Beispiel JFileChooser.
12 Ausblick
12.1 Objektorientierte Programmierung: Entwurfsmuster
Entwurfsmuster; Beispiele für Entwurfsmuster; die Entwurfsmuster „Singleton“, „Immutable“ und „Observer“.
12.2 Programmierparadigmen und -sprachen
Annotationen; Wiederholung der imperativen, funktionalen und objektorientierten Programmierparadigmen (s. Abschnitte 1.1, 1.2, 3.7, 5.3); funktionale Programme in Scheme;
das deduktive (logische) Paradigma; Fakt; Regel; Horn-Klausel; Anfrage; Ziel; kleine Beispiele in Prolog; Funktionen und Relationen; deklaratives Programmieren; wichtige Programmiersprachen im Überblick.
12.3 Gegenstände der Softwaretechnik
Der Begriff „Softwaretechnik“; Software-Entwicklung; Software-Management; SoftwareQualitätssicherung; die Modellierungssprache UML (Unified Modeling Language); die Diagrammtypen der UML; Anwendungsfalldiagramm; Klassendiagramm; Objektdiagramm;
Sequenzdiagramm.
– 17 –
Quellenverzeichnis
[1] Alagić, Suad; Arbib, Michael A.: The Design of Well-Structured and Correct Programs. New York: Springer Verlag, 1978
[2] Alber, Klaus; Struckmann, Werner: Einführung in die Semantik von Programmiersprachen. Mannheim Wien Zürich: BI-Wissenschaftsverlag, 1988
[3] Barnes, David J.; Kölling, Michael: Objects First With Java. 1. Auflage. Harlow,
England: Prentice Hall, 2003
[4] Bell, Douglas; Parr, Mike: Java für Studenten. 3. Auflage. München: Pearson
Studium, 2003
[5] Ben-Ari, Mordechai: Grundlagen der Parallelprogrammierung. 1. Auflage. München
Wien: Carl Hanser Verlag, 1985
[6] Ben-Ari, Mordechai: Principles of Concurrent and Distributed Programming. 2. Auflage. Harlow London: Addison-Wesley, 2006
[7] Bentley, Jon: Programming Pearls. Reading, Massachusetts: Addison-Wesley Publishing Company, 1986
[8] Bloch, Joshua; Gafter, Neal: Java Puzzlers. 1. Auflage. Upper Sadle River NJ,
Boston: Addison-Wesley Verlag, 2005
[9] Breymann, Ulrich: C++ – Einführung und professionelle Programmmierung. 9., neu
bearbeitete Auflage. München: Hanser Verlag, 2007
[10] Budd, Timothy: Classic Data Structures in Java. 1. Auflage. Boston: Addison-Wesley
Verlag, 2001
[11] Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford:
Algorithmen – Eine Einführung. 3., überarb. u. erw. Auflage. München Wien: Oldenbourg Verlag, 2010
[12] Deitel, Harvey M.; Deitel, Paul J.: Java—How to Program. 6. Auflage. Upper
Saddle River, New Jersey: Pearson Education International, 2005
[13] Duden: Informatik. 4. Auflage. Mannheim: Dudenverlag, 2006
[14] Ehrenberger, Wolfgang: Software-Verifikation. 1. Auflage. München: Hanser Verlag, 2002
[15] Esser, Friedrich: Java 6 Core Techniken. 1. Auflage. München: Oldenbourg Verlag,
2008
[16] Esser, Friedrich: Scala für Umsteiger. München: Oldenbourg Verlag, 2011
– 18 –
[17] Ford, William H.; Topp, William R.: Data Structures with Java. 1. Auflage. Upper
Saddle River, New Jersey: Pearson Education International, 2005
[18] Gallenbacher, Jens: Abenteuer Informatik. 2. Auflage. Heidelberg: Spektrum
Akademischer Verlag, 2008
[19] Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John: Design Patterns.
1. Auflage. Boston: Addison-Wesley Verlag, 1995
[20] Harel, David; Feldman, Yishai: Algorithmik. 1. Auflage. Berlin Heidelberg New
York: Springer-Verlag, 2006
[21] Henning, Peter A.; Vogelsang, Holger: Taschenbuch Programmiersprachen. 2. Auflage. München: Carl Hanser Verlag, 2007
[22] Hoffmann, Dirk W.: Theoretische Informatik. 1. Auflage. München: Hanser Verlag,
2009
[23] Hohlfeld, Bernhard; Struckmann, Werner: Einführung in die Programmverifikation. Mannheim Wien Zürich: BI-Wissenschaftsverlag, 1992
[24] Kecher, Christoph: UML 2. 3., durchgesehene Auflage. Bonn: Galileo Press, 2009
[25] Krienke, Rainer: Shell-Programmierung für Unix und Linux. 3., erweiterte Auflage.
München: Hanser Verlag, 2007
[26] Krüger, Guido: Handbuch der Java-Programmierung.
Addison-Wesley Verlag, 2012
7. Auflage.
München:
[27] Lahres, Bernhard; Raýman, Gregor: Objektorientierte Programmierung. 2., aktualisierte und erweiterte Auflage. Bonn: Galileo Computing, 2009
[28] Lang, Hans W.: Algorithmen in Java. 2. Auflage. München: Oldenbourg Wissenschaftsverlag, 2006
[29] Lewis, John; Chase, Joseph: Java—Software Structures. 2. Auflage. Upper Saddle
River, New Jersey: Pearson Education International, 2005
[30] Louis, Dirk; Müller, Peter: Java — Der umfassende Programmierkurs. Köln:
O’Reilly Verlag, 2014
[31] Mehlhorn, Kurt; Sanders, Peter: Algorithms and Data Structures. 1. Auflage.
Berlin Heidelberg: Springer Verlag, 2008
[32] Nowak, Johannes: Fortgeschrittene Programmierung mit Java 5. 1. Auflage. Heidelberg: Dpunkt Verlag, 2005
[33] Oechsle, Rainer: Parallele und verteilte Anwendungen in Java. 2., vollständig überarbeitete und erweiterte Auflage. München: Carl Hanser Verlag, 2007
– 19 –
[34] Ottmann, Thomas; Widmayer, Peter: Algorithmen und Datenstrukturen. 4. Auflage. Heidelberg Berlin: Spektrum Akademischer Verlag, 2002
[35] Pomberger, Gustav; Dobler, Heinz: Algorithmen und Datenstrukturen. 1. Auflage.
München: Pearson Studium, 2008
[36] Ratz, Dietmar; Scheffler, Jens; Seese, Detlef; Wiesenberger, Jan: Grundkurs
Programmieren in Java. 6. aktualisierte und erweiterte Auflage. München Wien:
Hanser Verlag, 2011
[37] Rechenberg, Peter: Was ist Informatik? 3. Auflage. München: Hanser Verlag, 2000
[38] Regionales Rechenzentrum für Niedersachsen RRZN (Hrsg.): Linux – Nutzung mit der grafischen Oberfläche KDE. 1. Auflage. Hannover: Regionales Rechenzentrum für Niedersachsen RRZN, 2000
[39] Regionales Rechenzentrum für Niedersachsen RRZN (Hrsg.): Grundlagen
der Programmierung. 4. Auflage. Hannover: Regionales Rechenzentrum für Niedersachsen RRZN, 2004
[40] Regionales Rechenzentrum für Niedersachsen RRZN (Hrsg.): Unix – Eine
Einführung in die Benutzung. 18. Auflage. Hannover: Regionales Rechenzentrum für
Niedersachsen RRZN, 2008
[41] Regionales Rechenzentrum für Niedersachsen RRZN (Hrsg.): Java 6
(1. Band). 7. Auflage. Hannover: Regionales Rechenzentrum für Niedersachsen RRZN,
2009
[42] Regionales Rechenzentrum für Niedersachsen RRZN (Hrsg.): Java 6
(2. Band). 2. Auflage. Hannover: Regionales Rechenzentrum für Niedersachsen RRZN,
2011
[43] Saake, Gunter; Sattler, Kai-Uwe: Algorithmen und Datenstrukturen. 4., überarb. Auflage. Heidelberg: dpunkt.verlag, 2010
[44] Schiedermeier, Reinhard: Programmieren mit Java. 2., aktualisierte Auflage. München: Pearson Studium, 2010
[45] Schiedermeier, Reinhard; Köhler, Klaus: Das Java-Praktikum. 1. Auflage. Heidelberg: Dpunkt Verlag, 2008
[46] Sedgewick, Robert: Algorithms. 2. Auflage. Reading, Mass.: Addison-Wesley, 1988
[47] Sedgewick, Robert: Algorithmen in Java, Teil 1–4. 3. überarbeitete Auflage. München: Addison-Wesley Verlag, Pearson Studium, 2003
[48] Sedgewick, Robert: Algorithms in Java, Part 5. 3. Auflage. Boston: Addison-Wesley
Verlag, 2004
– 20 –
[49] Struckmann, Werner; Wätjen, Dietmar: Mathematik für Informatiker – Grundlagen und Anwendungen. 1. Auflage. Heidelberg: Spektrum Akademischer Verlag,
2007
[50] Vogt, Carsten: C für Java-Programmierer. 1. Auflage. München: Hanser Verlag,
2007
[51] Weinert, Albrecht: Java für Ingenieure. 1. Auflage. München: Fachbuchverlag
Leipzig im Carl-Hanser-Verlag, 2001
[52] Weiss, Mark A.: Data Structures & Problem Solving Using Java. 3. Auflage. Boston:
Pearson Addison Wesley, 2006
[53] Weiss, Mark A.: Data Structures and Algorithm Analysis in Java. 2. Auflage. Boston:
Pearson Addison Wesley, 2007
[54] Zeller, Andreas; Krinke, Jens: Programmierwerkzeuge. 1. Auflage. Heidelberg:
Dpunkt Verlag, 2000
– 21 –
A Übungen, Ergänzungen, Fallstudien, Wiederholungen
A.1 Unix-Grundlagen
An- und Abmelden; Passwörter; Display-Manager, Desktop-Manager, Fenster-Manager;
Anatomie eines Kommandos; Shell; Grundlagen der Shell-Bedienung; Shell als Kommandointerpreter; Umgebungsvariable; Dateisystem; Befehle zur Dateiverwaltung; Pfad; absolute und relative Adressierung; Manual- und Info-Seiten; Programmbau mit make; die
Unix-Werkzeuge (e)grep, find, sort.
A.2 Algorithmen: Korrekheit, Komplexität
Spezifikation, Verifikation, partielle und totale Korrektheit: Algorithmus von Euklid, Algorithmus zur Division von natürlichen Zahlen; Komplexität: Landau-Symbole, Berechnung
der Komplexität des Insertionsort-Algorithmus.
A.3 Vom Algorithmus zum Programm: Programmentwicklung
Das Sieb des Eratosthenes als Beispiel für Programmentwicklung; Struktogramm (NassiShneiderman-Diagramm); Programmablaufplan (PAP); der Zyklus der Programmentwicklung; Eingabe (Kommandozeile, Tastatur, Programm) und Ausgabe (Bildschirm); einführendes Beispiel für Makefile.
A.4 Regeln zur Formatierung von Java-Programmen
Wiederholung; Überblick über die „Code Conventions for the Java Programming Language“:
http://www.oracle.com/technetwork/java/codeconv-138413.html.
Beispiel für den Check der Formatierung.
A.5 Java-Operatoren
Wiederholung; Überblick; Beispiele.
A.6 Felder
Wiederholung; Arrays; Array-Typen; Container; Zeichenfelder vs. Strings; Alloziieren und
Initialisieren von Feldern; Deklaration; Zuweisung; Array-Literale; Elementzugriff; ForEach-Schleife; Kopieren und Vergleichen von Feldern; geschachtelte Felder.
A.7 Fallstudie: Komplexität von Algorithmen (1)
Beispielanalyse Insertionsort; landausche Symbole; best-, wort- und average-Komplexität;
Komplexitätsklassen.
– 22 –
A.8 Fallstudie: Objektorientierung (Polynome)
Grundlagen der Objektorientierung; Klasse, Objekt, Attribut, Methode; Typischer Aufbau
einer Klasse; Überlagerung von Methoden der Klasse Object; Beispiel zur objektorientierten Programmierung ohne Vererbung: Polynomarithmetik (Schiedermeier, Köhler).
A.9 Abstraktion und Modellierung
Abstraktion; Modellierung; Modellfehler; Datenfehler; Verfahrensfehler; Rundungsfehler;
Numerik; Stabilität eines Algorithmus; Kondition eines Problems; Auslöschung; Lösung
quadratischer Gleichungen.
A.10 Objektorientierte Konzepte und Fallstudie (Punkte, Geraden)
Grundlagen der Objektorientierung; Klasse, Objekt, Attribut, Methode; Zustand; Nachricht; Klassen- und Objektdiagramme; Typischer Aufbau einer Klasse; Überlagerung von
Methoden der Klasse Object; Beziehungen zwischen Klassen: Vererbung; Beziehungen zwischen Klassen und Objekten: der instanceof-Operator; Beziehungen zwischen Objekten:
Assoziation, Multiplizität, Kardinalität, Aggregation, Komposition; Beispiel zur objektorientierten Programmierung ohne Vererbung: Klassen für Punkte und Geraden; Erwähnung
von UML-Diagrammen.
A.11 Fallstudie: Abstrakte Klassen (Funktionen)
Verwendung abstrakter Klassen; Ebenen der Realisation; die abstrakte Klasse Funktion;
verschiedene Realisierungen: Parabel, Hyperbel, Verkettung von Funktionen.
A.12 Berechenbarkeit (1)
Begriffe: Berechenbarkeit, Entscheidbarkeit; Beispiele: Diophantische Gleichungen, Halteproblem, Anzahl der Funktionen N → N und der Algorithmen.
A.13 Fallstudie: Komplexität von Algorithmen (2)
Rekurrenzgleichung; Mastertheorem; Divide-and-Conquer-Algorithmen; dynamische Algorithmen; Fibonacci-Zahlen; Lösung einer linearen Rekurrenzgleichung.
A.14 Zwei erste Beispiele für grafische Oberflächen
Zeichnen von Funktionen, Kakuro.
A.15 Programmtest mit JUnit
Beispiele für Programmtests mit JUnit: 3 Algorithmen für die Berechnung ganzzahliger
Wurzeln; Test, ob der Wert stimmt; Test, ob die Algorithmen identische Werte liefern.
– 23 –
Die Algorithmen werden in der Veranstaltung erläutert. Vom ersten Algorithmus wird die
Korrektheit nachgewiesen.
A.16 Die Osterformel von Gauß
Warum findet am Freitag, den 18. April 2014, die Übung nicht statt?
A.17 Einige Programme des JDK
JDK: Überblick; javac (Compiler); java (Interpreter); appletviewer (Appletviewer); jdb
(Debugger); javadoc (Dokumentationsgenerator); jar (Archivierungswerkzeug); javap
(Disassembler); serialver (Versionierung serialisierter Daten); native2ascii (Änderung
der Kodierung).
A.18 Polymorphismus
Zur Wiederholung werden in der Übung kleine Beispiele zu Vererbung, Overloading und
Polymorphismus besprochen.
A.19 Alias-Name, Gültigkeit, Sichtbarkeit und Lebensdauer
Namensgebung: Anonymität, Alias-Name, Namenskollision; Gültigkeitsbereich; Sichtbarkeitsbereich; statische Eigenschaft; dynamische Eigenschaft; Lebensdauer; globale Variable;
lexikalischer/statischer Scope; dynamischer Scope; Schachtelung; Java als flache Sprache;
Auflösung von Namenskollisionen; hängende Referenz.
A.20 Fallstudie: Graphen, Breitensuche
(Zusammenhangskomponenten)
Bestimmung der Anzahl der Zusammenhangskomponenten eines ungerichteten Graphen
durch Breitensuche.
A.21 Algorithmen und Datenstrukturen (Übersicht)
Der intuitive Algorithmenbegriff; Paradigmen; formale Algorithmenbegriff; Komplexität
und Korrektheit von Algorithmen; Datenstrukturen und Typsysteme; abstrakte Datentypen; Standardalgorithmen; Algorithmenentwurfsmethoden; Variationen des Algorithmenbegriffs.
– 24 –
A.22 Abstrakte Datentypen (ADT)
Einsortige und mehrsortige Algebren: Gruppe, Körper, Vektorraum; Datentyp: Signatur,
Axiom, Algebra; algebraische Spezifikation; abstrakte Datentypen (ADT); Kapselung; Geheimnisprinzip; Beispiele: Listen, Keller, Warteschlangen.
A.23 Fallstudie: Mergesort, Divide-and-Conquer, Generizität
Diskussion und Vergleich verschiedener Implementierungen von Mergesort: direkte Implementierung für Felder eines primitives Datentyps; Implementierung für Felder einer
allgemeinen Klasse; Generizität durch eine abstrakte Klasse; Verwendung einer generischen Methode; Wiederholung: Divide-and-Conquer-Algorithmen, Analyse des Algorithmus, Mastertheorem, Zusicherungen, assert-Anweisung.
A.24 Fallstudie: Keller (Klammerstrukturen)
Überprüfung von Klammerstrukturen nach [52]; die Klasse PushBackReader.
A.25 Die Programmiersprache C
Wiederholung: Das imperative Paradigma; Historie der Sprache; grundlegende Eigenschaften; Standards; Struktur und Übersetzung von C-Programmen; Präprozessor; Anweisungen
des Präprozessors; Java und C im Vergleich; Kontrollstrukturen; skalare und zusammengesetzte Datentypen; Typdefinitionen; Zeiger; Funktionen; dynamische Datenstrukturen;
Ein- und Ausgabe; Beispiel: verkettete Listen in C.
A.26 Wiederholung: Paradigmen und Sprachen (Übersicht)
Natürliche, künstliche und formale Sprachen; GPL (General Purpose Language); Programmierparadigmen und -sprachen; Skriptsprachen; paradigmenübergreifende Konzepte; DSL
(Domain Specific Language); spezielle Sprachklassen; Prinzipien des Sprachentwurfs; Definition und Implementierung von Sprachen.
A.27 Wiederholung: Vom Algorithmus zum Programm
Algorithmen und Datenstrukturen: intuitiver, formaler Begriff, Paradigmen, Korrektheit,
Komplexität, Entwurf von Algorithmen, Varianten des Algorithmusbegriffs, abstrakte Datentypen; Standardalgorithmen und -datenstrukturen; Sprachen der Informatik: Domain
specific languages (DSL), General purpose languages (GPL), Typsystem, Umsetzung von
Paradigmen, paradigmenübergreifende Konzepte; Java-Konzepte, Java-API, JDK.
– 25 –
A.28 Skriptsprachen, C-Shell, JavaScript
Kommandosprachen; Skriptsprachen; Beispiele für Skriptsprachen; Merkmale von Skriptsprachen; Einsatz von Skriptsprachen; Überblick: die Sprache der C-Shell, JavaScript;
Struktur einer Html-Seite; Beispiel einer Html-Seite mit einem JavaScript-Programm.
A.29 Fallstudie: Bäume (AVL-Bäume)
Wiederholung: binäre Suchbäume; ausgeglichene Bäume; AVL-Bäume; Höhe von AVLBäumen; Einfügen und Löschen von Elementen; Rotation; Doppelrotation.
A.30 Berechenbarkeit (2)
Satz von Rice, Aussage, Beispiele; Beweis in Datei: rice.pdf.
– 26 –
B Themen der Übungsaufgaben
B.1 1. Übungsblatt
Aufgabe 1: Unix-Grundlagen, an- u. abmelden, Passwortänderung.
Aufgabe 2: Unix-Grundlagen, Dateien, Verzeichnisse, wichtige Kommandos.
Aufgabe 3: Unix-Grundlagen, Editor, Java-Compiler u. -Interpreter.
Aufgabe 4: Unix-Grundlagen, Java-Compiler u. -Interpreter, Fehlermeldungen.
Aufgabe 5: Unix-Grundlagen, Java-Compiler u. -Interpreter.
Aufgabe 6: Intuitiver Algorithmusbegriff.
B.2 2. Übungsblatt
Aufgabe 7: Unix-Grundlagen, Wiederholung.
Aufgabe 8: Ein erstes Programm: Arithmetische und Vergleichsoperatoren, lineares Programm (Lösung quadratischer Gleichungen), Ein-/Ausgabe.
Aufgabe 9: Ausgabeanweisung.
Aufgabe 10: Compilermeldungen, Fehlersuche und -berichtigung.
Aufgabe 11: Eingabe von der Kommandozeile.
Aufgabe 12: Arithmetische Operatoren, Fallunterscheidung (Kfz-Steuer).
B.3 3. Übungsblatt
Aufgabe 13: Kommentare.
Aufgabe 14: Bezeichner.
Aufgabe 15: Bezeichner, Deklarationen.
Aufgabe 16: Ausdrücke und Operatoren: Zeichenketten, Konkatenation, Zuweisungsoperatoren, bitweise Operatoren.
Aufgabe 17: Einführung in das Programmieren; arithmetische Operatoren, Fallunterscheidung, Eingabe über Kommandozeile (Zeitzone).
Aufgabe 18: Einführung in das Programmieren; arithmetische Operatoren, Fallunterscheidung, Eingabe über Kommandozeile (Zeitzone). Erweiterung der vorigen Aufgabe.
Pflichtaufgabe 19: Einführung in das Programmieren; arithmetische Operatoren, Fallunterscheidung, Eingabe über Kommandozeile (2 Datumsangaben).
– 27 –
B.4 4. Übungsblatt
Aufgabe 20: Zeichensätze, Darstellung und Speicherung von Zeichen und ganzzahligen
Werten.
Aufgabe 21: Literale, Speicherung von Gleitkommazahlen, der primitive Datentyp float.
Operatoren, Anweisungen.
Aufgabe 22: Deklarationen, primitive Datentypen.
Aufgabe 23: Operatoren.
Aufgabe 24: If-Anweisung.
Aufgabe 25: Umsetzen eines gegebenen Algorithmus, die drei Schleifentypen von Java.
Pflichtaufgabe 26: Wiederholungsanweisungen (Quersummen, alternierende Quersummen).
B.5 5. Übungsblatt
Aufgabe 27: Anwendung einfacher Schleifen (σ-Funktion).
Aufgabe 28: Anwendung einfacher Schleifen (Geburtstagsproblem).
Aufgabe 29: Variable, Ausdrücke, Schleifen (fröhliche und traurige Zahlen).
Aufgabe 30: Anweisungen, Ausgabe (Klasse BrowserTest).
Aufgabe 31: Variable, Ausdrücke, Schleifen, Ausgabe (Mid-Square-Methode).
Pflichtaufgabe 32: Klasse, Objekt, Attribut, Methode, Überlagerung von Methoden der
Klasse Object (toString, equals, clone), statische Methode, Instanzmethode, typischer
Aufbau einer Klasse, Aufgabe zur objektorientierten Programmierung ohne Vererbung
(Mengen, Zeichen als Elemente).
B.6 6. Übungsblatt
Aufgabe 33: Klasse, Objekt, Attribut, Methode, Methoden der Klasse Object: clone,
equals, toString, Aufgabe zur objektorientierten Programmierung ohne Vererbung (Uhrzeiten).
Aufgabe 34: Vererbung, Überlagern von Methoden.
Aufgabe 35: Klasse, Objekt, Attribut, Methode, Überlagerung von Methoden der Klasse
Object (toString, equals, clone), statische Methode, Instanzmethode, typischer Aufbau
einer Klasse, Aufgabe zur objektorientierten Programmierung ohne Vererbung (rationale
Zahlen).
Aufgabe 36: Abstrakte Klassen, Vererbung, Überlagern von Methoden, Schnittstellen,
Polymorphismus (Figuren, Dreiecke, Kreise).
– 28 –
Pflichtaufgabe 37: Abstrakte Klassen, Vererbung, Überlagern von Methoden, Schnittstellen, Polymorphismus (Funktion, Wertetabelle, Newton-Verfahren, Parabel).
B.7 7. Übungsblatt
Aufgabe 38: Nachvollziehen eines rekursiven Algorithmus (Geldwechsel).
Aufgabe 39: Auswertung einer rekursiv definierten Funktion.
Aufgabe 40: Iterative und rekursive Implementierung einer rekursiv definierten Funktion.
Aufgabe 41: Auswertung einer rekursiv definierten Funktion.
Aufgabe 42: Implementierung eines rekursiven Algorithmus (Sortieren eines Feldes).
Aufgabe 43: Rekursion, Backtracking, Eingabe aus einer Datei (Irrgarten).
Pflichtaufgabe 44: Ausnahmebehandlung; IllegalArgumentException; Empfehlung: Rekursion; (Ziffern-Matching).
B.8 8. Übungsblatt
Aufgabe 45: Wiederholung: Programmverifikation, partielle und totale Korrektheit, Vorund Nachbedingung, Schleifeninvariante, assert-Anweisung.
Aufgabe 46: Wiederholung: C0- und C1-Überdeckungstests.
Aufgabe 47: Wiederholung: Ausnahmebehandlung, assert-Anweisung, Programmverifikation, Test, (Ganzzahlige Arithmetik).
Aufgabe 48: Wiederholung: Programmverifikation, partielle und totale Korrektheit von
Programmen, Vor- und Nachbedingung, Scheifeninvariante, assert-Anweisung, Komplexität.
Aufgabe 49: Wiederholung: Ausnahmebehandlung, benutzerdefinierte Fehlerklasse.
B.9 9. Übungsblatt
Aufgabe 50: Wiederholung: Grundlagen des imperativen und objektorentierten Programmierens (gemischte Zahlen).
Aufgabe 51: JDK: Debugger jdb, Archivierungswerkzeug jar, Dokumentationsgenerator
javadoc.
Aufgabe 52: Wiederholung: Grundlagen des imperativen und objektorentierten Programmierens (Widerstandsnetz).
Aufgabe 53: Wiederholung: Komplexität, partielle und totale Korrektheit von Programmen, assert-Anweisung (Insertionsort).
Aufgabe 54: Aufzählungstypen (physikalische Einheiten).
– 29 –
B.10 10. Übungsblatt
Aufgabe 55: Programmierung linearer Listen durch Verkettungen.
Aufgabe 56: Programmierung linearer Listen durch Verkettungen.
Aufgabe 57: Programmierung linearer Listen durch Felder.
Pflichtaufgabe 58: Programmierung linearer Listen durch Verkettungen; Anwendung:
Verarbeitung von CSV-Dateien, die Termine enthalten.
B.11 11. Übungsblatt
Aufgabe 59: Implementierung generischer Keller durch verkettete Listen und Felder,
Anwendung von generischen Kellern (Löschsymbol), Testen von Programmen.
Aufgabe 60: Implementierung generischer Keller durch verkettete Listen und Felder, Anwendung von generischen Kellern (Umwandlung eines arithmetischen Ausdrucks von Infixin Postfixnotaion mit einem Character-Keller, Auswertung des Ausdrucks in Postfixnotation mit einem Integer-Keller).
Aufgabe 61: Generische Methoden, Keller, Java Collections Framework, Rekursion vs.
Iteration.
Aufgabe 62: Generische Klassen und Schnittstellen, binäre Suchbäume.
Pflichtaufgabe 63: Generische Datentypen; Verallgemeinerung der letzten Pflichtaufgabe; Programmierung generischer linearer Listen durch Verkettungen; Anwendung: Verarbeitung von CSV-Dateien, die Termine oder Tankvorgänge enthalten.
B.12 12. Übungsblatt
Aufgabe 64: Binäre balancierte Suchbäume, generische Datentypen (AVL-Bäume).
Aufgabe 65: Entwurf von Programmen, Java Collections Framework, gerichtete gewichtete Graphen (Algorithmus von Dijkstra zur Bestimmung kürzester Wege).
Aufgabe 66: (Un)gerichtete azyklische Graphen, generische Datentypen, erweiterte Tiefensuche (topologische Sortierung).
Pflichtaufgabe 67: Graphen: Nichtdeterministische Automaten; Eingabe aus Datei; Erkennung von Wörtern; Java Collections Framework.
– 30 –
B.13 13. Übungsblatt
Aufgabe 68: Entwurf von Programmen, Java Collections Framework (Kakuro).
Aufgabe 69: Freiwillige Zusatzaufgabe: Vorige Aufgabe als C-Programm (Kakuro).
Aufgabe 70: Threads, Atomic-Klasse.
Aufgabe 71: Threads, Parallelisierung eines Divide-Conquer-Algorithmus (Quicksort).
Pflichtaufgabe 72: Threads, Runnable; Parallelisierung: Nichtdeterministische Automaten.
B.14 14. Übungsblatt
Aufgabe 73: Applets (Konvertierung von Celsius- in Fahrenheit-Grade).
Aufgabe 74: Grafikausgabe und -eingabe mit der Swing-Bibliothek (kleiner ganzzahliger
Taschenrechner).
Aufgabe 75: Grafikausgabe mit der Swing-Bibliothek (Kakuro).
Pflichtaufgabe 76: Grafikausgabe und -eingabe mit der Swing-Bibliothek: Nichtdeterministische Automaten.
– 31 –
Herunterladen