Inhaltsverzeichnis

  • Vorwort
 
  • Inhalt
 
  • 1 Einführung
1
    • 1.1 Was heißt Programmieren?
1
    • 1.2 Algorithmen und Spezifikationen
2
      • 1.2.1 Problemlösen durch Algorithmen
2
      • 1.2.2 Spezifikationen
3
      • 1.2.3 Algorithmen
6
      • 1.2.4 Verifikation von Algorithmen
6
  • 2 Grafische Darstellungsmittel
9
    • 2.1 Struktogramme
9
    • 2.2 Datenflussdiagramme
11
    • 2.3 Programmablaufpläne
15
  • 3 Die Entwicklungsumgebung
19
    • 3.1 Projekte
19
    • 3.2 Erstellen eines Projekts
20
    • 3.3 Compiler oder Interpreter?
21
    • 3.4 Übersetzen von Programmen
22
    • 3.5 Compiler-Optionen
24
    • 3.6 Beheben von Fehlern
25
    • 3.7 Der Präprozessor
25
      • 3.7.1 Die #include – Anweisung
26
      • 3.7.2 Die #define – Anweisung
27
      • 3.7.3 Makros
27
      • 3.7.4 Vordefinierte Präprozessorkonstanten
29
      • 3.7.5 Die #if – Anweisung
30
      • 3.7.6 Die Anweisungen #ifdef und #ifndef
31
  • 4 Erste Schritte
33
    • 4.1 Grundlegendes
33
    • 4.2 Was ist C?
33
    • 4.3 Geschichte von C
34
    • 4.4 Warum C?
35
    • 4.5 Programmtextdateien
35
      • 4.5.1 Der Programmtext
35
      • 4.5.2 Die Header-Dateien
35
    • 4.6 Kommentare
36
    • 4.7 Die Funktion main
37
    • 4.8 Hallo Welt
38
    • 4.9 Beispiele
39
      • 4.9.1 Reklameschrift
39
      • 4.9.2 Leerzeilen
39
      • 4.9.3 Quelltext temporär ausschneiden
40
  • 5 Variablen, Konstanten
41
    • 5.1 Eigenschaften von Variablen und Konstanten
41
    • 5.2 Variablen
41
      • 5.2.1 Definition von Variablen
42
      • 5.2.2 Namen von Variablen
42
      • 5.2.3 Initialisierung von Variablen
43
    • 5.3 Konstanten
44
    • 5.4 Arbeiten mit Variablen und Konstanten
44
    • 5.5 Beispiele
45
      • 5.5.1 Berechnung der Fläche und des Umfanges eines Rechtecks
45
      • 5.5.2 Versuch einer zirkularen Zuweisung
45
      • 5.5.3 Dreieckstausch
45
  • 6 Numerische Datentypen
47
    • 6.1 Ganze Zahlen
47
      • 6.1.1 Qualifizierer
47
      • 6.1.2 Literale
48
      • 6.1.3 Zahlensysteme
48
        • 6.1.3.1 Zweierkomplement
49
        • 6.1.3.2 Zahlensysteme in C
51
        • 6.1.3.3 Umwandlung von Binär-, Oktal- und Hexadezimalzahlen
52
        • 6.1.3.4 Umwandlung einer Binärzahl ins Dezimalsystem
52
        • 6.1.3.5 Umwandlung einer Dezimalzahl ins Binärsystem
53
      • 6.1.4 Operatoren
53
    • 6.2 Punktzahlen
54
      • 6.2.1 Gleitpunkt-Zahlensysteme in C
56
      • 6.2.2 Literale
56
      • 6.2.3 Operatoren
57
      • 6.2.4 Mathematische Funktionen
57
    • 6.3 Zeichen
58
      • 6.3.1 Literale
59
      • 6.3.2 Der ASCII-Code
59
      • 6.3.3 Operatoren
61
      • 6.3.4 Funktionen für Zeichen
61
    • 6.4 Wahrheitswerte
62
    • 6.5 void
62
    • 6.6 Typumwandlung
62
    • 6.7 sizeof
64
    • 6.8 Beispiele
64
      • 6.8.1 Umfang und Fläche eines Kreises
64
      • 6.8.2 Lösen quadratischer Gleichungen
65
  • 7 Eingabe – Ausgabe
67
    • 7.1 Ausgabefunktionen
67
      • 7.1.1 Ausgabe einer ganzen Zahl
68
      • 7.1.2 Ausgabe einer Gleitpunkt-Zahl
69
      • 7.1.3 Ausgabe von Adressen
70
      • 7.1.4 Ausgabe eines Zeichens
70
      • 7.1.5 Ausgabe einer Zeichenkette
71
      • 7.1.6 Weitere Formatierungsmöglichkeiten
71
      • 7.1.7 Probleme mit printf
72
      • 7.1.8 Die Platzhalter von printf
72
    • 7.2 Eingabefunktionen
72
      • 7.2.1 Eingabe einer ganzen Zahl
73
      • 7.2.2 Eingabe einer Gleitpunkt-Zahl
73
      • 7.2.3 Eingabe eines Zeichens
73
      • 7.2.4 Eingabe einer Zeichenkette
74
      • 7.2.5 Probleme mit scanf
74
      • 7.2.6 Die Platzhalter von scanf
75
    • 7.3 Ein- und Ausgabe von Zeichen
76
    • 7.4 Beispiele
76
      • 7.4.1 Umfang und Fläche eines Kreises
76
      • 7.4.2 Fehlersuche
76
  • 8 Ausdrücke
77
    • 8.1 Allgemeines
77
    • 8.2 Reihenfolge der Auswertung
78
      • 8.2.1 Prioritäten
78
      • 8.2.2 Assoziativitäten
80
    • 8.3 Operatoren
81
      • 8.3.1 Arithmetische Operatoren
81
      • 8.3.2 Die Zuweisung
82
        • 8.3.2.1 Inkrement und Dekrement
83
        • 8.3.2.2 Abkürzungen
87
      • 8.3.3 Logische Operatoren
87
        • 8.3.3.1 Vergleichsoperatoren
88
        • 8.3.3.2 Der Operator &&
90
        • 8.3.3.3 Der Operator ||
92
        • 8.3.3.4 Der Operator !
93
      • 8.3.4 Der Operator ,
94
      • 8.3.5 Der Operator ? :
95
    • 8.4 Abstände
95
    • 8.5 Beispiele
96
      • 8.5.1 Teilbarkeit einer Zahl
96
      • 8.5.2 Übungen zu logischen Ausdrücken
96
      • 8.5.3 Berechnung der Signum-Funktion
97
      • 8.5.4 Berechnung des Schaltjahres
97
  • 9 Selektionen
99
    • 9.1 Die if – Anweisung
99
    • 9.2 Die switch – Anweisung
103
    • 9.3 Beispiele
104
      • 9.3.1 Lösen quadratischer Gleichungen
104
      • 9.3.2 Berechnung der Einkommensteuer
105
      • 9.3.3 Ein Menü
107
      • 9.3.4 Osterregel nach Gauß
107
  • 10 Iterationen
109
    • 10.1 Die for - Anweisung
109
    • 10.2 Die while - Anweisung
111
    • 10.3 Die do - while - Anweisung
112
    • 10.4 Besonderheiten der for - Anweisung
113
      • 10.4.1 Weglassen von Ausdrücken
113
      • 10.4.2 Mehrere Zähler
115
    • 10.5 Die break - Anweisung
115
    • 10.6 Die continue - Anweisung
116
    • 10.7 Schachteln von Schleifen
117
    • 10.8 Beispiele
118
      • 10.8.1 Ein Kalender
118
      • 10.8.2 Der Euklidische Algorithmus
121
      • 10.8.3 Die ASCII-Tabelle
122
      • 10.8.4 Gerade und ungerade Zahlen
123
      • 10.8.5 Der Weihnachtsbaum
123
      • 10.8.6 Ein Menü
127
      • 10.8.7 Ein Zahlenratespiel
128
  • 11 Funktionen
131
    • 11.1 Definition einer Funktion
131
      • 11.1.1 Namen von Funktionen
131
      • 11.1.2 Parameter
132
      • 11.1.3 Rückgabewerte
133
      • 11.1.4 Der Rückgabewert der Funktion main
134
      • 11.1.5 Ablauf eines Funktionsaufrufes
135
    • 11.2 Deklaration einer Funktion
137
      • 11.2.1 Externe Funktionen
140
      • 11.2.2 Statische Funktionen
140
    • 11.3 Beispiele
140
      • 11.3.1 Leeren des Eingabepuffers
140
      • 11.3.2 Kalender für ein Jahr
141
      • 11.3.3 Einfacher Taschenrechner
148
  • 12 Speicherklassen
151
    • 12.1 Lokale Variablen
151
      • 12.1.1 Die Blockstruktur von C
151
      • 12.1.2 Variablen der Speicherklasse auto
153
      • 12.1.3 Variablen der Speicherklasse register
153
      • 12.1.4 Variablen der Speicherklasse static
154
    • 12.2 Globale Variablen
154
      • 12.2.1 Variablen der Speicherklasse extern
155
      • 12.2.2 Variablen der Speicherklasse static
156
    • 12.3 Übersicht über alle Speicherklassen in C
156
  • 13 Felder
159
    • 13.1 Eindimensionale Felder
159
    • 13.2 Mehrdimensionale Felder
161
    • 13.3 Initialisierung von Feldern
163
    • 13.4 Konstante Felder
165
    • 13.5 Felder als Parameter
165
    • 13.6 Einfache Sortierverfahren
166
      • 13.6.1 Minimum-Suche
166
      • 13.6.2 Bubble Sort
168
    • 13.7 Einfache Suchverfahren
169
      • 13.7.1 Sequenzielles Suchen
169
      • 13.7.2 Binäres Suchen
170
    • 13.8 Beispiele
171
      • 13.8.1 Multiplikation von Matrizen
171
      • 13.8.2 Berechnung der Einkommensteuer – verbesserte Variante
173
      • 13.8.3 Kopieren von Feldern
174
  • 14 Zeiger
175
    • 14.1 Allgemeines
175
    • 14.2 Zeiger als Parameter
179
    • 14.3 Die „Dualität“ von Zeigern und Feldern
180
    • 14.4 Zeigerarithmetik
182
    • 14.5 Komplexere Fälle: Felder von Zeigern, Zeiger auf Zeiger
183
    • 14.6 Konstante Zeiger
187
    • 14.7 Zeiger auf Funktionen
188
      • 14.7.1 Adressen von Funktionen
188
      • 14.7.2 Definition
188
      • 14.7.3 Verwendung
189
      • 14.7.4 Typdefinitionen mit typedef
190
    • 14.8 Beispiele
191
      • 14.8.1 Inkrement-Funktion
191
      • 14.8.2 Lösen quadratischer Gleichungen – verbesserte Variante
192
  • 15 Zeichenketten
195
    • 15.1 Literale
195
    • 15.2 Zeichenketten in C
196
    • 15.3 Datentyp
197
    • 15.4 Initialisierung von Zeichenketten
198
    • 15.5 Elementare Funktionen für Zeichenketten
199
    • 15.6 Felder von Zeigern auf Zeichenketten
201
    • 15.7 Argumente der Funktion main
203
    • 15.8 Beispiele
204
      • 15.8.1 Vorzeitiges Ende einer Zeichenkette
204
      • 15.8.2 Die Funktion strcpy
204
      • 15.8.3 Die Funktion strlen
206
      • 15.8.4 Die Funktion strcmp
206
      • 15.8.5 Die Funktion atol
207
      • 15.8.6 Kalender für ein Jahr – verbesserte Variante
208
      • 15.8.7 Sortieren von Zeichenketten
209
      • 15.8.8 Einfaches Verschlüsseln nach Julius Cäsar
210
  • 16 Abgeleitete Datentypen
211
    • 16.1 Richtlinien
211
    • 16.2 Strukturen
212
      • 16.2.1 Einfache Strukturen
213
      • 16.2.2 Funktionen und Strukturen
216
      • 16.2.3 Zeiger auf Strukturen
217
      • 16.2.4 Felder von Strukturen
218
      • 16.2.5 Bitfelder
221
    • 16.3 Aufzählungen
222
    • 16.4 Variante Strukturen
224
    • 16.5 Rekursive Strukturen
228
    • 16.6 Deklaration von abgeleiteten Datentypen
228
    • 16.7 Typdefinition mit typedef
230
    • 16.8 Beispiele
231
      • 16.8.1 Ein Menü
231
      • 16.8.2 Eine Adressverwaltung
233
  • 17 Dateien
239
    • 17.1 Datenströme
239
    • 17.2 Öffnen und Schließen von Datenströmen
240
    • 17.3 Ein- und Ausgabe
243
    • 17.4 Beispiele
245
      • 17.4.1 Kopieren von Dateien
245
      • 17.4.2 Ausgeben von Dateien
246
      • 17.4.3 Eine Adressverwaltung – verbesserte Variante
246
  • 18 Rekursive Funktionen
253
    • 18.1 Rekursive Algorithmen
253
    • 18.2 Rekursive Funktionen in C
254
    • 18.3 Beispiele
256
      • 18.3.1 Binäres Suchen
256
      • 18.3.2 Quicksort
257
  • 19 Datenstrukturen
261
    • 19.1 Datenstrukturen und abstrakte Datenstrukturen
261
    • 19.2 Listen
262
      • 19.2.1 Eigenschaften und Terminologie
262
      • 19.2.2 Methoden und Implementierung
263
        • 19.2.2.1 Einfügen eines neuen Elementes
265
        • 19.2.2.2 Entfernen eines Elementes
267
      • 19.2.3 Weitere Arten von Listen
269
    • 19.3 Stapel und Schlangen
270
      • 19.3.1 Stapel
270
      • 19.3.2 Schlangen
271
      • 19.3.3 Zirkularpuffer
271
    • 19.4 Baum-Strukturen
272
      • 19.4.1 Eigenschaften und Terminologie
272
      • 19.4.2 Binäre Bäume
274
      • 19.4.3 Binäre Suchbäume
276
      • 19.4.4 Methoden
277
        • 19.4.4.1 Traversieren von Bäumen
277
        • 19.4.4.2 Suchen eines Elementes in einem binären Suchbaum
278
        • 19.4.4.3 Einfügen eines neuen Elementes in einen binären Suchbaum
279
        • 19.4.4.4 Löschen eines Elementes in einem binären Suchbaum
279
    • 19.5 Heap-Strukturen
283
      • 19.5.1 Eigenschaften
283
      • 19.5.2 Methoden
284
        • 19.5.2.1 Die Methode UpHeap
284
        • 19.5.2.2 Die Methode DownHeap
285
        • 19.5.2.3 Entfernen von Elementen
286
        • 19.5.2.4 Aufbau eines Heaps durch Einfügen von Elementen
287
        • 19.5.2.5 Aufbau eines Heaps in einem Feld
287
        • 19.5.2.6 Sortieren mit Heaps
287
    • 19.6 Hash-Strukturen
289
      • 19.6.1 Hash-Funktion
293
      • 19.6.2 Getrennte Verkettung
294
      • 19.6.3 Eigenschaften
296
    • 19.7 Vergleich der Datenstrukturen
296
  • 20 Dynamischer Speicher
299
    • 20.1 Aufgaben der Speicherverwaltung
299
    • 20.2 Anfordern von Speicher
300
    • 20.3 Verändern der Größe von Speicherblöcken
303
    • 20.4 Freigeben von Speicher
304
    • 20.5 Typische Fehler
304
      • 20.5.1 Kein Speicher mehr frei
305
      • 20.5.2 Freigabe mit einer falschen Adresse
305
      • 20.5.3 Freigabe eines bereits freigegebenen Speichers
305
      • 20.5.4 Freigabe eines Feldes
306
      • 20.5.5 Freigabe einer Variable
306
      • 20.5.6 Freigabe eines nicht initialisierten Zeigers
306
      • 20.5.7 Zugriff auf einen ungültigen Speicher
306
      • 20.5.8 Zugriff auf bereits freigegebenen Speicher
307
      • 20.5.9 Zugriff mit falschen Indizes
307
      • 20.5.10 Zugriff auf nicht initialisierten Speicher
307
      • 20.5.11 Verlust des Speichers durch Überschreiben des Zeigers
308
      • 20.5.12 Verlust des Speichers durch Verlust des Zeigers
308
      • 20.5.13 Verlust des Speichers durch Rücksprung
309
      • 20.5.14 Verlust des Speichers bei Rückgabe
309
      • 20.5.15 Zu große Speicherblöcke
310
  • 21 Numerik
311
    • 21.1 Fehlerarten
311
      • 21.1.1 Modellfehler
311
      • 21.1.2 Datenfehler
311
      • 21.1.3 Verfahrensfehler
312
      • 21.1.4 Rundungsfehler
312
    • 21.2 Mathematische Grundbegriffe
312
      • 21.2.1 Relativer Fehler
313
      • 21.2.2 Kondition
313
    • 21.3 Sehr kleine und sehr große Zahlen
315
      • 21.3.1 Ganze Zahlen
315
      • 21.3.2 Punktzahlen
315
      • 21.3.3 Summation von Punktzahlen
316
    • 21.4 Auslöschung
318
  • 22 Fehlerbehandlung
319
    • 22.1 Behandlung von Fehlern im Programm
322
      • 22.1.1 Fehlercodes
322
      • 22.1.2 Fehlerweitergabe
324
    • 22.2 Fehlerbehandlung mit Funktionen der Standard-Bibliothek
325
      • 22.2.1 Die Fehlervariable errno
325
      • 22.2.2 Fehlerausgabe
326
      • 22.2.3 Programmende mit exit
327
      • 22.2.4 Die Funktion atexit
327
      • 22.2.5 Die Funktion assert
327
    • 22.3 Signalbehandlung
328
      • 22.3.1 Definition von Signalbehandlungsfunktionen
329
      • 22.3.2 Abbruch mit abort
330
  • 23 Ein exemplarisches Software-Projekt
331
    • 23.1 Die Spezifikation
331
    • 23.2 Präzisierung der Spezifikation
332
    • 23.3 Bibliotheken
333
      • 23.3.1 Wahl der Bibliothek
334
      • 23.3.2 Verwendung von Bibliotheken
334
    • 23.4 Realisierungsmöglichkeiten
335
      • 23.4.1 Ansatz mit rekursiven Funktionen
336
      • 23.4.2 Der Syntaxbaum
337
      • 23.4.3 Der Auswertungsstapel
338
    • 23.5 Entwurf
339
      • 23.5.1 Beschreibung der Funktionen
339
      • 23.5.2 Fehlerbehandlung
340
    • 23.6 Implementierung des virtuellen Taschenrechners für den Textmodus
340
      • 23.6.1 Das Modul main.o
341
      • 23.6.2 Das Modul berechnung.o
343
      • 23.6.3 Das Modul stapel.o
346
      • 23.6.4 Das Modul eingabe.o
349
      • 23.6.5 Die grafische Benutzeroberfläche
351
    Literaturverzeichnis
353