Überblick
Das Buch gliedert sich in zwei Teile. Der erste Teil behandelt die Grundlagen des Programmierens. Die weiteren Kapitel vertiefen die Themen des ersten Teils oder beschäftigen sich mit zusätzlichen Themen.
Falls Sie noch in keiner Sprache programmiert haben, dann sollten Sie sich mit dem 1. Teil solange aus- einandersetzen, bis sie die Übungsaufgaben lösen und die Kontrollfragen beantworten können, sonst können Sie das 1. Kapitel als Leitfaden durch die wichtigsten Themen betrachten, um je nach Bedarf zu den weiteren Kapiteln zu wechseln.
Die Reihenfolge der Kapitel 2 bis 13 ist zwar sinnvoll, aber nicht unbedingt zwingend. Neben dem 1. Teil beschäftigen sich die Kapitel 5 (Modulkonzept) und 9 (Zeiger) mit fundamentalen Konzepten in C.
Teil 1
|
1
|
Programmieren lernen - Grundlagen |
1 |
|
1.1
|
Zwei kleine C Programme | 1 |
|
1.2 |
Grundbegriffe der Syntax, Kommentare |
9 |
|
1.3
|
Datentypen und Ausdrücke |
14 |
|
1.4
|
Algorithmen und Kontrollstrukturen |
21
|
|
1.5
|
Vektoren und Zeichenketten |
42
|
|
1.6
|
Adressen und Zeiger |
51
|
|
1.7
|
Modularisierung, Funktionen |
55
|
|
1.8
|
Ein-/Ausgabe |
74
|
Teil 2
|
2
|
Datendarstellung in Rechnern, elementare Datentypen |
85
|
|
3
|
Operatoren und Ausdrücke, mathematische Funktionen |
119
|
|
4
|
Kontrollstrukturen, strukturierte Programmierung |
137
|
|
5
|
Funktionen, Speicherklassen und Modulkonzept |
169
|
|
6
|
Grundsätze für die Programmentwicklung |
207
|
|
7
|
Der Preprozessor |
221
|
|
8
|
Bit-Operatoren und Ausdrücke |
231
|
|
9
|
Zeiger |
239
|
|
10
|
Vektoren |
253
|
|
11
|
Zeichenketten |
279
|
|
12
|
Strukturen, dynamische Datenstrukturen, Unionen |
293
|
|
13
|
Dateien (Files) |
311
|
| 1 | Programmieren lernen - Grundlagen |
1
|
| 1.1 | Zwei kleine C-Programme |
1
|
| 1.2 | Grundbegriffe der Syntax, Kommentare |
9
|
| 1.2.1 | Zeichensatz und Wörter |
9
|
| 1.2.2 | Syntaxnotation |
10
|
| 1.2.3 | Schlüsselwörter |
11
|
| 1.2.4 | Kommentare |
12
|
| 1.2.5 | Fehlermeldungen des Compilers |
13
|
| 1.3 | Datentypen und Ausdrücke |
14
|
| 1.3.1 | Datentypen |
14
|
| 1.3.2 | Ausdrücke (expressions) und Operatoren (operators) |
16
|
| 1.4 | Algorithmen und Kontrollstrukturen |
21
|
| 1.4.1 | Algorithmen |
21
|
| 1.4.2 | Sequenz |
21
|
| 1.4.3 | Wiederholung |
22
|
| 1.4.4 | Auswahl |
31
|
| 1.4.5 | Beispiele |
32
|
| 1.4.6 | Zusammenfassung: Von der Aufgabe zum Programm |
38
|
| 1.5 | Vektoren und Zeichenketten |
42
|
| 1.5.1 | Vektoren |
42
|
| 1.5.2 | Zeichenketten |
46
|
| 1.6 | Adressen und Zeiger |
51
|
| 1.7 | Modularisierung, Funktionen |
55
|
| 1.7.1 | Allgemeines, Begriffe |
55
|
| 1.7.2 | Datenaustausch zwischen Funktionen |
60
|
| 1.7.3 | Funktionsprototypen |
71
|
| 1.8 | Ein-/Ausgabe |
74
|
| 1.8.1 | Allgemeines |
74
|
| 1.8.2 | Ein-/Ausgabe und Dateien |
75
|
| 1.8.3 | Funktionen der Standardbibliothek für die Ein-/Ausgabe |
77
|
| 2 | Datendarstellung in Rechnern, elementare Datentypen |
85
|
| 2.1 | Allgemeines zu Zahlensystemen und Codes |
85
|
| 2.1.1 | Zahlensysteme |
85
|
| 2.1.2 | Codes |
88
|
| 2.2 | Ganze Zahlen (integer) |
89
|
| 2.2.1 | Interne Darstellung (Codierung) ganzer Zahlen |
89
|
| 2.2.2 | Datentypen für ganze Zahlen in C |
94
|
| 2.2.3 | (f)printf und (f)scanf Umwandlungen für ganze Zahlen |
96
|
| 2.3 | Zeichen und Zeichensätze |
97
|
| 2.3.1 | Codierung von Zeichen |
97
|
| 2.3.2 | Der ANSI/ASCII-Code und der Datentyp char |
98
|
| 2.3.3 | Ein- und Ausgabe von Zeichen, (f)printf und (f)scanf-Umwandlungen |
101
|
| 2.3.4 | Breite Zeichen und Unicode |
104
|
| 2.4 | Reelle Zahlen |
105
|
| 2.4.1 | Festkommazahlen |
105
|
| 2.4.2 | Gleitkommadarstellung |
106
|
| 2.4.3 | C-Gleitkommatypen (floating types) |
108
|
| 2.4.4 | (f)printf und (f)scanf Umwandlungen für Gleitkommazahlen |
109
|
| 2.5 | Der sizeof-Operator |
111
|
| 2.6 | Typumwandlungen (casts) |
112
|
| 2.7 | Vereinbarungen |
112
|
| 2.8 | typedef und enum |
115
|
| 2.8.1 | typedef |
115
|
| 2.8.2 | Aufzählungen, enum |
115
|
| 3 | Operatoren und Ausdrücke, mathematische Funktionen |
119
|
| 3.1 | Arithmetische Operatoren |
119
|
| 3.2 | Die Zuweisungsoperatoren, L-Werte |
120
|
| 3.3 | Unäre Ausdrücke |
124
|
| 3.4 | Vergleichsoperatoren |
125
|
| 3.5 | Logische Operatoren und Ausdrücke |
128
|
| 3.6 | Der Komma-Operator |
129
|
| 3.7 | Implizite Typumwandlung |
130
|
| 3.8 | Rangordnung der Operatoren und Reihenfolge der Auswertung |
131
|
| 3.9 | Mathematische Funktionen |
134
|
| 4 | Kontrollstrukturen, strukturierte Programmierung |
137
|
| 4.1 | Steuer- oder Kontrollfluß, Flußdiagramme |
137
|
| 4.2 | Strukturierte Programmierung |
138
|
| 4.3 | Arten von Strukturblöcken |
140
|
| 4.3.1 | Elementarblock |
140
|
| 4.3.2 | Sequenz |
141
|
| 4.3.3 | Auswahl |
142
|
| 4.3.4 | Wiederholung, Iteration |
150
|
| 4.4 | C-Spezifisches |
156
|
| 4.4.1 | Die Leeranweisung (empty-statement) |
156
|
| 4.4.2 | Die goto-Anweisung |
156
|
| 4.4.3 | Die continue-Anweisung |
157
|
| 4.5 | Programmbeispiele |
158
|
| 4.5.1 | Kalender |
158
|
| 4.5.2 | Rechnen mit Zahlen in der Zweierkomplementdarstellung |
162
|
| 5 | Funktionen, Speicherklassen und Modulkonzept |
169
|
| 5.1 | Definition von Funktionen |
169
|
| 5.2 | Funktionsprototypen |
172
|
| 5.3 | Aufruf einer Funktion und Übergabemechanismus |
172
|
| 5.4 | Die Speicherklasse auto |
175
|
| 5.5 | Die Speicherklasse extern |
177
|
| 5.6 | Programme mit mehreren Quelltext- bzw. Objektdateien |
179
|
| 5.7 | Weitere spezielle Speicherklassen |
181
|
| 5.7.1 | Die Speicherklasse register |
181
|
| 5.7.2 | Die Speicherklasse static |
182
|
| 5.7.3 | Externe Variablen mit static-Attribut |
183
|
| 5.7.4 | Das static- und extern-Attribut bei Funktionen |
183
|
| 5.8 | Datenkapselung |
184
|
| 5.9 | Verwaltung größerer Programme, Definitionsdateien |
189
|
| 5.10 | Make-Utility |
197
|
| 5.11 | Rekursion |
199
|
| 6 | Grundsätze der Programmentwicklung |
207
|
| 6.1 | Phasenmodell |
207
|
| 6.1.1 | Planungsphase |
207
|
| 6.1.2 | Definitionsphase |
208
|
| 6.1.3 | Entwurfsphase |
208
|
| 6.1.4 | Codieren - Implementieren |
213
|
| 6.1.5 | Testen |
214
|
| 6.1.6 | Wartung und Pflege |
215
|
| 6.2 | Prinzipien der Softwareentwicklung |
215
|
| 6.3 | Qualität von Softwareprodukten |
217
|
| 6.4 | Dokumentation |
218
|
| 7 | Der Preprozessor |
221
|
| 7.1 | Die #include-Anweisung |
221
|
| 7.2 | Die #define-Anweisung (1) |
222
|
| 7.3 | Die #define-Anweisung (2), Makros |
223
|
| 7.4 | Bedingte Übersetzung (conditional compilation) |
227
|
| 7.5 | #line (Zeilennummern) |
229
|
| 7.6 | Textersatz in Zeichenketten, der Operator # |
229
|
| 7.7 | #error und #pragma |
229
|
| 8 | Bit-Operatoren und Ausdrücke |
231
|
| 8.1 | Bit- und Schiebe-Operatoren |
231
|
| 8.2 | Bitmuster und Bit-Masken |
235
|
| 9 | Zeiger |
239
|
| 9.1 | Einleitende Bemerkungen |
239
|
| 9.2 | Vereinbarung von Zeigervariablen und Zeigertypen |
241
|
| 9.3 | Inhalts- und Adreßoperator, Wertzuweisungen an Zeiger |
241
|
| 9.4 | Zeigerarithmetik |
244
|
| 9.4.1 | Summe und Differenz von Zeiger und int |
244
|
| 9.4.2 | Vergleichsoperationen mit Zeigern |
246
|
| 9.4.3 | Zeigersubtraktion |
246
|
| 9.5 | Speicherplatz anfordern und freigeben |
249
|
| 10 | Vektoren |
253
|
| 10.1 | Eindimensionale Vektoren |
253
|
| 10.1.1 | Vereinbarung und Zusammenhang mit Zeigerarithmetik |
253
|
| 10.1.2 | Vektoren als formale und aktuelle Parameter von Funktionen |
254
|
| 10.1.3 | Dynamische Erzeugung eines Vektors |
256
|
| 10.2 | Mehrdimensionale Vektoren |
257
|
| 10.2.1 | Definition und Indizierung |
257
|
| 10.2.2 | Anordnung der Elemente im Speicher |
258
|
| 10.2.3 | Mehrdimensionale Vektoren als Argument von Funktionen |
261
|
| 10.3 | Initialisierung von Vektoren |
262
|
| 10.4 | Algorithmen und Programmbeispiele |
262
|
| 10.4.1 | Quicksort |
262
|
| 10.4.2 | Lineare Regression |
267
|
| 10.4.3 | Gauß'scher Algorithmus |
271
|
| 11 | Zeichenketten |
279
|
| 11.1 | Allgemeines, Zeichenketten in C |
279
|
| 11.2 | Ein-/Ausgabe von Zeichenketten |
282
|
| 11.3 | Funktionen für Zeichenketten in der C-Bibliothek |
284
|
| 11.4 | Vektoren mit Zeigern auf Zeichenketten |
284
|
| 11.5 | Argumente der Funktion main |
290
|
| 12 | Strukturen, dynamische Datenstrukturen, Unionen |
293
|
| 12.1 | Strukturen |
293
|
| 12.1.1 | Typ-Deklarationen und Definition von Variablen |
293
|
| 12.1.2 | Zugriff auf Strukturen und die Felder einer Struktur |
295
|
| 12.1.3 | Strukturen und Funktionen |
296
|
| 12.1.4 | Initialisierung von Strukturen |
300
|
| 12.2 | Verkettete Listen, Bäume |
300
|
| 12.3 | Unionen |
308
|
| 13 | Dateien (Files) |
311
|
| 13.1 | Dateioperationen |
311
|
| 13.2 | Fehlererkennung und Behandlung |
312
|
| 13.3 | Binärdateien |
313
|
| 13.4 | Random Access |
319
|
| A | Anhang A: Die Standard-Bibliothek |
321
|
| A.1 | Diagnose <assert.h> |
321
|
| A.2 | Test und Behandlung von Zeichen <ctype.h> |
321
|
| A.3 | Fehlerbehandlung <errno.h> |
322
|
| A.4 | Grenzwerte der Gleitkommadarstellung <float.h> |
322
|
| A.5 | Wertebereich für Ganzzahltypen <limits.h> |
323
|
| A.6 | Lokale Besonderheiten <locale.h> |
323
|
| A.7 | Mathematische Funktionen <math.h> |
323
|
| A.8 | Nichtlokale Sprünge <setjmp.h> |
323
|
| A.9 | Signale <signal.h> |
323
|
| A.10 | Variable Argumentlisten <stdarg.h> |
324
|
| A.11 | Allgemein gültige Definitionen <stddef.h> |
324
|
| A.12 | Ein-/Ausgabe <stdio.h> |
325
|
| A.13 | Allgemeine Hilfsfunktionen <stdlib.h> |
333
|
| A.14 | Funktionen für Zeichenketten <string.h> |
337
|
| A.15 | Uhrzeit und Zeit <time.h> |
339
|
| A.16 | Ausblick auf die C99 Bibliothek |
340
|
|
Anhang B: Syntaxzusammenfassung |
343
|
|
Literatur |
350
|
|
Stichwortverzeichnis |
351
|
|
ASCII-Code Tabelle |
360
|
|
Tabelle der Operatoren, Rangordnung der Operatoren |
361
|