Vorwort
Hinweise für den Leser
Inhaltsübersicht XXV
I Die Sprache C und Modulare Softwareentwicklung
1 ANSI/ISO-C, Clean-C und Better-C
1.1 Entwicklungsgeschichte: Von K&R-C nach C++
1.2 Clean-C und Better-C
1.3 Neun Beispiele
1.4 Aufbau der Sprache
1.4.1 Lexikalische und Syntaktische Struktur
1.4.2 Formale Beschreibung (Syntaxnotation)
1.4.3 Lexikalische Elemente (Symbole, Token)
1.4.4 Clean-C/Better-C: Restriktionen/Erweiterungen
1.5 Daten, Operatoren, Ausdrücke, Anweisungen
1.5.1 Vorde nierte Datentypen
1.5.2 Variablen und Konstanten
1.5.3 Operatoren für Elementare Datentypen
1.5.4 Ausdrücke
1.5.5 Prioritäten von Operatoren
1.5.6 Explizite und implizite Typkonvertierungen
1.5.7 Arbeiten mit Zahlen
1.5.8 Arbeiten mit Zeichen
1.5.9 Arbeiten mit Booleschen Ausdrücken
1.5.10 Aufzählungstypen
1.5.11 Ausdrücke als Anweisungen, Mehrfachzuweisungen
1.5.12 Bedingte Ausdrücke und bedingte Anweisungen
1.5.13 Clean-C/Better-C: Restriktionen/Erweiterungen
1.6 Steueranweisungen
1.6.1 Übersicht
1.6.2 Verbundanweisung (compound-statement)
1.6.3 Verzweigungen
1.6.4 Wiederholungen
1.6.5 Marken und Sprünge
1.6.6 Zusammenfassung
1.6.7 Clean-C/Better-C: Restriktionen/Erweiterungen
1.7 Funktionen
1.7.1 Grundlagen
1.7.2 Rekursive Algorithmen und Funktionen
1.7.3 Variable Anzahl von Parametern
1.7.4 De nition, Deklaration und Aufruf von Funktionen
1.7.5 ANSI/ISO-C-Bibliotheksfunktionen
1.7.6 Clean-C/Better-C: Restriktionen/Erweiterungen
1.8 Datenstrukturen, Werte- und Zeigersemantik
1.8.1 Zeiger, Adressen, Vektoren
1.8.2 Mehrdimensionale Vektoren
1.8.3 Strukturen
1.8.4 Vereinigungen (Unionen)
1.8.5 Zeiger und Zeigerkonvertierungen
1.8.6 Arbeiten mit selbst verwalteten Daten, Zeigersemantik
1.8.7 Syntax von Deklarationen
1.8.8 Clean-C/Better-C: Restriktionen/Erweiterungen
1.9 Eingabe und Ausgabe von Daten
1.9.1 Überblick
1.9.2 Typen, Variable und Konstanten
1.9.3 Arbeiten mit den Standardgeräten
1.9.4 Arbeiten mit Textdateien
1.9.5 Datenformatierung
1.9.6 Dateien mit Blockstruktur
1.9.7 Strings als Medium für formatierte Ein- und Ausgabe
1.9.8 Fehlerbehandlung
1.9.9 Weitere Funktionen
1.9.10 Clean-C/Better-C: Restriktionen/Erweiterungen
1.10 Programmstruktur und Speicherklassen
1.10.1 Dateien, Geltungsbereiche, Lebensdauer
1.10.2 Geltungsbereich von Bezeichnern
1.10.3 Lebensdauer von Variablenwerten
1.10.4 Zusammenfassung und Ergänzungen
1.10.5 Module: De nitions- und Implementationsdateien
1.10.6 Allgemeiner Aufbau von ANSI/ISO-C-Programmen
1.10.7 Clean-C/Better-C: Restriktionen/Erweiterungen
1.11 Zeiger auf Funktionen
1.11.1 Zeiger auf Funktionen in Vektoren und Strukturen
1.11.2 Zeiger auf Funktionen als Funktionsparameter
1.12 Präprozessor
1.12.1 Einfügen von Dateien
1.12.2 Ersetzen von Textstellen
1.12.3 Bedingte Einfügung, bedingte Übersetzung
1.12.4 De nition von Makros
1.12.5 Vorde nierte Namen
1.12.6 Sonstiges
1.12.7 Zusammenfassung und Bewertung
1.12.8 Clean-C/Better-C: Restriktionen/Erweiterungen
1.13 Speicherverwaltung, Speichermodelle
1.14 Fehlerbehandlung/Ausnahmebehandlung
1.15 Übersicht über den neuen Standard C99
1.15.1 Allgemeines
1.15.2 Neue Datentypen
1.15.3 Zeiger mit dem Attribut restrict
1.15.4 Dynamische Arrays
1.15.5 Reihenfolge von Deklarationen und Anweisungen
1.15.6 inline-Kommentare
1.15.7 inline-Funktionen
1.15.8 Bibliothek
1.16 Übungen
2 ANSI/ISO-C-Standardbibliothek
2.1 Kurzübersicht über die Gesamtbibliothek
2.2 Fehlerdiagnostik:
2.3 Zeichenoperationen:
2.4 Fehlererkennung:
2.5 Grenzwerte für Gleitkommatypen:
2.6 Grenzwerte für Ganzzahl-Typen:
2.7 Lokale (nationale) De nitionen:
2.8 Mathematische Funktionen:
2.9 Globale Sprünge:
2.10 Ausnahmebehandlung:
2.11 Variable Parameterlisten:
2.12 Allgemeine De nitionen:
2.13 Ein- und Ausgabe:
2.14 Hilfsfunktionen:
2.15 String-Operationen:
2.16 Datum und Zeit:
3 Modulare Programmierung
3.1 Module und Modulschnittstellen
3.1.1 Softwareentwurf und Modularisierung
3.1.2 Geheimnisprinzip, Datenkapselung, Abstrakte Datentypen
3.1.3 Realisierung von Abstrakten Datentypen in C
3.1.4 Realisierung von generischen Modulen in C
3.2 Fallstudie 1: Komplexe Arithmetik
3.2.1 Spezi kation
3.2.2 Implementierung
3.2.3 Anwendung
3.3 Fallstudie 2: Strings
3.3.1 Spezi kation
3.3.2 Implementierung
3.3.3 Anwendung
3.4 Fallstudie 3: Set (Menge)
3.4.1 Allgemeine Spezi kation
3.4.2 Modul Set, Version 0: Kleiner Wertebereich
3.4.3 Modul Set, Version 1: Vergrößerung des Wertebereichs
3.4.4 Modul Set, Version 2: Einstellbarer Wertebereich
3.4.5 Modul Set, Version 3: Alternative Realisierung
3.4.6 Modul Set, Version 4: Ein generisches Modul
3.5 Fallstudie 4: Generische Sortierte Liste
3.5.1 Spezi kation
3.5.2 Implementierung
3.5.3 Anwendung
3.5.4 Anpassung an Anwendungen
3.6 Übungen
II Datenstrukturen, Algorithmen, ADTs, Container
4 Sortieren, Suchen und Zeitkomplexität
4.1 Zeitkomplexität
4.2 Einfache Sortieralgorithmen
4.3 Schnelle Sortieralgorithmen
4.4 Laufzeitmessungen an Sortieralgorithmen
4.5 Lineares Suchen
4.6 Binäres Suchen
4.7 Die Macht der Zeitkomplexität
5 Dynamische Datenstrukturen
5.1 Lineare Listen, Stapel und Schlangen
5.1.1 Zeigernotation und Heapverwaltung
5.1.2 Lineare einfach gekettete Listen
5.1.3 Lineare doppelt gekettete Listen
5.1.4 Stapelspeicher
5.1.5 Warteschlange
5.1.6 ADT List (Unsortierte Liste)
5.1.7 Prioritätswarteschlange
5.1.8 Übungen
5.1.9 ADT SList (Sortierte Liste)
5.2 Binäre Wilde Bäume
5.2.1 Grundlagen
5.2.2 Traversieren
5.2.3 Einfügen
5.2.4 Suchen
5.2.5 Löschen
5.2.6 Übungen
5.2.7 ADT Tree (Binärer Suchbaum)
5.2.8 Fallstudie Querverweis-Listengenerator
5.3 Binäre Ausgeglichene Bäume
5.3.1 De nition der Ausgeglichenheit und Konzept
5.3.2 Einfügen
5.3.3 Löschen
5.3.4 ADT Avl (Ausgeglichener Binärer Suchbaum)
5.4 Vielweg-Bäume (B-Bäume)
5.4.1 Einführung und Konzept
5.4.2 Datenstrukturen
5.4.3 Traversieren
5.4.4 Einfügen
5.4.5 Löschen
5.4.6 Demoprogramm
5.4.7 Übungen
5.5 Heap-Strukturen
5.6 Hashverfahren
5.6.1 Allgemeines
5.6.2 Statische Hashverfahren
5.6.3 Halbdynamische Hashverfahren
5.6.4 Dynamische Hashverfahren
5.6.5 Zusammenfassung
6 Container-Strukturen
6.1 Container-Strukturen, Überblick
6.2 Realisierung von Container-Strukturen
6.2.1 Stack, Queue und Priorityqueue
6.2.2 Set und Multiset
6.2.3 Map, Multimap und Vector
6.3 Anwendungsbeispiele
6.3.1 Test- und Demoprogramm
6.3.2 Anwendungsbeispiel Textanalyse
6.3.3 Anwendungsbeispiel Anagramme
6.4 Übungen
7 Automaten in der Softwaretechnik
7.1 Automaten und Sprachen
7.2 Endliche Automaten und Reguläre Sprachen
7.3 Lexikalische Analyse, Scanner
7.3.1 Scanner für Zahlen
7.3.2 Scanner für Kommentare
7.3.3 Ein Scanner für die kleine Sprache ML2
7.4 Kellerautomaten und Kontextfreie Sprachen
7.5 Syntaktische Analyse, Parser
7.5.1 EBNF-Notation und Syntaxdiagramme
7.5.2 Parser
7.5.3 Die Sprachen ML1 und ML2 und ihre Parser
8 Von ANSI/ISO-C nach ANSI/ISO-C++ - ein Überblick
8.1 Die Funktion main
8.2 Neue Schlüsselwörter und reservierte Wörter
8.3 Neue Operatoren
8.4 Neue Bibliotheksmodule
8.5 Der Namensraum std
8.6 Deklarationen und Bindung
8.7 Benutzen von Modulen mit C-Bindung (Bindespezi kation)
8.8 Kleine nicht objektorientierte Erweiterungen
8.8.1 Vorde nierter Makro-Name
8.8.2 Inline-Kommentare
8.8.3 Inline-Funktionen
8.8.4 Der Typ bool
8.8.5 Der Typ wchar_t
8.8.6 Zeichenkonstanten
8.8.7 Syntax von Typkonvertierungen
8.8.8 Das Attribut const
8.8.9 Erweiterung des Strukturtyps
8.8.10 Positionierung von Deklarationen
8.8.11 Default-Parameterwerte und variable Parameterzahl
8.8.12 Funktionen ohne Parameter
8.9 Mittlere nicht direkt objektorientierte Erweiterungen
8.9.1 Referenztypen
8.9.2 Speicherverwaltung mit new und delete
8.9.3 Überladen von Funktionen
8.9.4 Überladen von Operatoren
8.9.5 Generische Funktionen (Funktions-Templates)
8.9.6 Namensbereiche (Namespaces)
8.9.7 Typkonvertierungen (Typecasts)
8.10 Objektorientierung: das Klassenkonzept
8.10.1 Die Konzepte der Objektorientierung in C++
8.10.2 Klassen
8.10.3 Vererbung
8.10.4 Polymorphie und dynamisches Binden
8.10.5 Klassenschablonen
8.11 Ausnahmebehandlung (Exception Handling)
8.12 Die C++-Standardbibliothek
8.12.1 Überblick
8.12.2 Neues EA-Konzept: Stream-IO
8.12.3 Container & Zubehör: Standard Template Library (STL)
8.12.4 Strings
9 Objektorientierte Programmierung
9.1 Kapselung: Klassen als Abstrakte Datentypen
9.1.1 Grundlagen
9.1.2 Konstruktoren und Destruktoren
9.1.3 Der Zuweisungsoperator
9.1.4 Minimale Standardschnittstelle und Nice Class
9.1.5 Konstante Elementfunktionen, konstante Objekte
9.1.6 Zugrisrechte
9.1.7 Mitglieder und Freunde
9.1.8 Überladen von Operatoren
9.1.9 Dynamische verwaltete Daten in Klassen
9.1.10 Ezienzbetrachtungen: Laufzeitezienz
9.1.11 Statische Elemente in einer Klasse
9.1.12 Schachtelung von Klassen
9.1.13 Funktionsobjekte
9.1.14 Zusammenfassung: Wichtige Hinweise und Regeln
9.1.15 Übungsaufgaben
9.2 Vererbung: Erweiterung von Klassen
9.2.1 Grundlagen
9.2.2 Konstruktoren, Destruktor und Zuweisungsoperator
9.2.3 Typkompatibilität in Klassenhierarchien
9.2.4 Virtuelle Funktionen
9.2.5 Öffentliches und Privates Erben
9.2.6 Privates Erben und Benutzen
9.2.7 Rein Virtuelle Funktionen und Abstrakte Klassen
9.2.8 Übungsaufgaben
9.3 Polymorphie: Dynamisches Binden
9.3.1 Dynamischer Typ, dynamisches Binden
9.3.2 Übungsbeispiel Polymorphe Strukturen
9.3.3 Heterogene Datenstrukturen
9.3.4 Virtuelle Destruktoren
9.3.5 Ein Klassensystem für gra sche Objekte, Vers. 1
9.3.6 Objektschachtelung: Grafische Objekte, Vers. 2
9.3.7 Zwei Aspekte der Polymorphie: heterogen und generisch
9.3.8 Polymorphe Container-Strukturen
9.3.9 Übungsaufgabe
9.4 Die richtige Anwendung der Vererbung
9.4.1 Verschiedene Sichten und Probleme
9.4.2 Schnittstellen-Klassen
9.4.3 Abstrakte und nicht abstrakte Basisklassen
9.4.4 Fallstudie Querverweis-Listengenerator
9.4.5 Zuweisungsoperatoren in Klassen mit polymorphen Zeigern
9.5 Mehrfachvererbung
9.5.1 Grundlagen
9.5.2 Verwendung nicht virtueller Basisklassen
9.5.3 Verwendung virtueller Basisklassen
9.5.4 Virtuelle Methoden in virtuellen Basisklassen
9.5.5 Fallstudie Querverweis-Listengenerator
9.6 Beziehungen zwischen Klassen { Übersicht
9.7 Klassen-Templates: Generische Strukturen
9.7.1 Grundlagen
9.7.2 Eine generische Container-Bibliothek
9.7.3 Spezialisierung von Templates
9.7.4 Eine spezialisierte Container-Bibliothek
9.7.5 Funktions-Templates
9.7.6 Funktions-Templates als Elemente
9.7.7 Laufzeit- und Compilezeit-Polymorphismus
9.8 Namensbereiche: Namenskollisionen vermeiden
9.8.1 Grundlagen: De nition und Benutzung
9.8.2 Erweiterung von Namensbereichen
9.8.3 Alias (Synonym) für Namensbereiche
9.8.4 Using-Direktive und Using-Deklaration
9.8.5 Anonyme Namensbereiche
9.8.6 Anwendung von Namensbereichen
9.9 Typkonvertierung, Laufzeit-Typinformation
9.9.1 Die Grundidee
9.9.2 Syntax und Semantik der Sprachkonstrukte
9.9.3 Zusammenfassung
9.10 Ausnahmebehandlung (Exception-Handling)
9.10.1 Grundlagen
9.10.2 Syntax und Semantik der Sprachkonstrukte
9.10.3 Ausnahmebehandlung am Beispiel der Klasse Stack
9.10.4 Empfehlungen
9.10.5 Zusammenfassung
10 Objektorientierte und Generische Softwareentwicklung
10.1 Besondere Programmiertechniken
10.1.1 Smart Pointer
10.1.2 Iteratoren
10.1.3 Generische Algorithmen
10.1.4 Referenzzählung (Reference-Counting)
10.1.5 Up-Calls
10.1.6 Botschaften und Botschaftsinterpreter
10.2 Template-Metaprogrammierung
10.2.1 Compilezeit-Berechnungen
10.2.2 Compilezeit-Polymorphismus
10.3 Zusicherungen (assertions)
10.3.1 Das Prinzip: Zusicherungen in Eiel
10.3.2 Simulation von Zusicherungen in C++, Version 1
10.3.3 Simulation von Zusicherungen in C++, Version 2
10.3.4 Zusammenfassung
10.4 Fallstudien
10.4.1 Strings
10.4.2 Eine Array-Klasse
10.4.3 Entwicklung einer kleinen Container-Bibliothek
11 ANSI/ISO-C++-Standardbibliothek
11.1 Übersicht
11.2 Allgemeine Dienste
11.2.1 Vergleichsoperatoren
11.2.2 Paare
11.2.3 Auto-Zeiger
11.3 Strings
11.3.1 Konzept und Übersicht
11.3.2 Funktionalität
11.4 Eingabe und Ausgabe (EA)
11.4.1 Vorteile des neuen EA-Konzeptes
11.4.2 EA im Standardformat mit Standardgeräten
11.4.3 Struktur & Funktionalität der Stream-IO-Bibliothek
11.4.4 Formatierung
11.4.5 EA-Funktionen
11.4.6 Arbeiten mit Dateien
11.4.7 Strings als Ein- und Ausgabemedium
11.4.8 Anzeige & Abfrage von Zuständen, Fehlerbehandlung
11.4.9 Eigene De nitionen, weitere Funktionen
11.5 Container
11.5.1 Das Konzept der Standard Template Library (STL)
11.5.2 Einführung
11.5.3 Gemeinsame De nitionen
11.5.4 Container für Sequenzen
11.5.5 Containeradapter für Sequenzen
11.5.6 Container für Assoziationen
11.5.7 Die Containerklasse bitset
11.6 Iteratoren
11.6.1 Operationen und Klassi zierung
11.6.2 Iteratoren als Container-Schnittstellen
11.6.3 Reverse-Iteratoren
11.6.4 Insert-Iteratoren
11.6.5 Stream-Iteratoren
11.6.6 Selbst de nierte Iteratoren (Iterator-Adapter)
11.7 Funktionsobjekte
11.7.1 Verwendung von Funktionsobjekten
11.7.2 Funktionsobjekte der Standardbibliothek
11.7.3 Funktionsadapter der Standardbibliothek
11.8 Algorithmen: globale generische Funktionen
11.8.1 Nicht modi zierende sequenzielle Operationen
11.8.2 Modi zierende sequenzielle Operationen
11.8.3 Sortieren, Suchen und verwandte Operationen
11.8.4 Mengenoperationen
11.8.5 Heap-bezogene Operationen
11.8.6 Minimax bestimmen und lexikogra sche Vergleiche
11.8.7 Permutieren
11.8.8 Anwendungsbeispiel Textanalyse
11.8.9 Anwendungsbeispiel Anagramme
11.9 Weitere Dienstleistungen
11.9.1 Ausnahmebehandlung
11.9.2 Grenzwerte der Implementierung
11.9.3 Speichermodelle
11.9.4 Internationalisierung
11.9.5 Numerik
12 Softwaremodellierung mit UML-Klassendiagrammen
12.1 Überblick über die UML-Konzepte
12.2 Klassendiagramme: Modellierung der Architektur
12.2.1 Modellierung von Klassen
12.2.2 Modellierung von Beziehungen zwischen Klassen
12.2.3 Verwendung von Klassenschablonen
12.2.4 Codegenerierung und Reverse Engineering
12.3 Beispiele
12.3.1 Beispiel 1: Polymorphe Prioritätswarteschlange
12.3.2 Beispiel 2: Gra k-Editor
12.3.3 Beispiel 3: Querverweis-Listengenerator
12.3.4 Beispiel 4: Polymorphe Container-Bibliothek
12.3.5 Beispiel 5: Generische Container
Literaturverzeichnis
C/C++-Textverzeichnis
Abbildungsverzeichnis
Tabellenverzeichnis
Stichwortverzeichnis