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 Bit-Operatoren
94
        • 8.3.4.1 Der Operator &
94
        • 8.3.4.2 Der Operator |
95
        • 8.3.4.3 Der Operator ˆ
95
        • 8.3.4.4 Der Operator ˜
96
        • 8.3.4.5 Der Operator <<
96
        • 8.3.4.6 Der Operator >>
97
      • 8.3.5 Der Operator ,
98
      • 8.3.6 Der Operator ? :
99
    • 8.4 Abstände
99
    • 8.5 Beispiele
100
      • 8.5.1 Teilbarkeit einer Zahl
100
      • 8.5.2 Übungen zu logischen Ausdrücken
100
      • 8.5.3 Berechnung der Signum-Funktion
102
      • 8.5.4 Berechnung des Schaltjahres
102
  • 9 Selektionen
103
    • 9.1 Die if – Anweisung
103
    • 9.2 Die switch – Anweisung
107
    • 9.3 Beispiele
108
      • 9.3.1 Lösen quadratischer Gleichungen
108
      • 9.3.2 Berechnung der Einkommensteuer
109
      • 9.3.3 Ein Menü
111
      • 9.3.4 Osterregel nach Gauß
111
  • 10 Iterationen
113
    • 10.1 Die for - Anweisung
113
    • 10.2 Die while - Anweisung
115
    • 10.3 Die do - while - Anweisung
116
    • 10.4 Besonderheiten der for - Anweisung
117
      • 10.4.1 Weglassen von Ausdrücken
117
      • 10.4.2 Mehrere Zähler
119
    • 10.5 Die break - Anweisung
119
    • 10.6 Die continue - Anweisung
120
    • 10.7 Schachteln von Schleifen
121
    • 10.8 Beispiele
122
      • 10.8.1 Ein Kalender
122
      • 10.8.2 Der Euklidische Algorithmus
125
      • 10.8.3 Die ASCII-Tabelle
126
      • 10.8.4 Gerade und ungerade Zahlen
127
      • 10.8.5 Der Weihnachtsbaum
127
      • 10.8.6 Ein Menü
131
      • 10.8.7 Ein Zahlenratespiel
132
  • 11 Funktionen
135
    • 11.1 Definition einer Funktion
135
      • 11.1.1 Namen von Funktionen
135
      • 11.1.2 Parameter
136
      • 11.1.3 Rückgabewerte
137
      • 11.1.4 Der Rückgabewert der Funktion main
138
      • 11.1.5 Ablauf eines Funktionsaufrufes
139
    • 11.2 Deklaration einer Funktion
141
      • 11.2.1 Externe Funktionen
144
      • 11.2.2 Statische Funktionen
144
    • 11.3 Beispiele
144
      • 11.3.1 Leeren des Eingabepuffers
144
      • 11.3.2 Kalender für ein Jahr
145
      • 11.3.3 Einfacher Taschenrechner
152
  • 12 Speicherklassen
155
    • 12.1 Lokale Variablen
155
      • 12.1.1 Die Blockstruktur von C
155
      • 12.1.2 Variablen der Speicherklasse auto
157
      • 12.1.3 Variablen der Speicherklasse register
157
      • 12.1.4 Variablen der Speicherklasse static
158
    • 12.2 Globale Variablen
158
      • 12.2.1 Variablen der Speicherklasse extern
159
      • 12.2.2 Variablen der Speicherklasse static
160
    • 12.3 Übersicht über alle Speicherklassen in C
160
  • 13 Felder
163
    • 13.1 Eindimensionale Felder
163
    • 13.2 Mehrdimensionale Felder
165
    • 13.3 Initialisierung von Feldern
167
    • 13.4 Konstante Felder
169
    • 13.5 Felder als Parameter
169
    • 13.6 Einfache Sortierverfahren
170
      • 13.6.1 Minimum-Suche
170
      • 13.6.2 Bubble Sort
172
    • 13.7 Einfache Suchverfahren
173
      • 13.7.1 Sequenzielles Suchen
173
      • 13.7.2 Binäres Suchen
174
    • 13.8 Beispiele
175
      • 13.8.1 Multiplikation von Matrizen
175
      • 13.8.2 Berechnung der Einkommensteuer – verbesserte Variante
177
      • 13.8.3 Kopieren von Feldern
178
  • 14 Zeiger
179
    • 14.1 Allgemeines
179
    • 14.2 Zeiger als Parameter
183
    • 14.3 Die „Dualität“ von Zeigern und Feldern
184
    • 14.4 Zeigerarithmetik
186
    • 14.5 Komplexere Fälle: Felder von Zeigern, Zeiger auf Zeiger
187
    • 14.6 Konstante Zeiger
191
    • 14.7 Zeiger auf Funktionen
192
      • 14.7.1 Adressen von Funktionen
192
      • 14.7.2 Definition
192
      • 14.7.3 Verwendung
193
      • 14.7.4 Typdefinitionen mit typedef
194
    • 14.8 Beispiele
195
      • 14.8.1 Inkrement-Funktion
195
      • 14.8.2 Lösen quadratischer Gleichungen – verbesserte Variante
196
  • 15 Zeichenketten
199
    • 15.1 Literale
199
    • 15.2 Zeichenketten in C
200
    • 15.3 Datentyp
201
    • 15.4 Initialisierung von Zeichenketten
202
    • 15.5 Elementare Funktionen für Zeichenketten
203
    • 15.6 Felder von Zeigern auf Zeichenketten
205
    • 15.7 Argumente der Funktion main
207
    • 15.8 Beispiele
208
      • 15.8.1 Vorzeitiges Ende einer Zeichenkette
208
      • 15.8.2 Die Funktion strcpy
208
      • 15.8.3 Die Funktion strlen
210
      • 15.8.4 Die Funktion strcmp
210
      • 15.8.5 Die Funktion atol
211
      • 15.8.6 Kalender für ein Jahr – verbesserte Variante
212
      • 15.8.7 Sortieren von Zeichenketten
213
      • 15.8.8 Einfaches Verschlüsseln nach Julius Cäsar
214
  • 16 Abgeleitete Datentypen
215
    • 16.1 Richtlinien
215
    • 16.2 Strukturen
216
      • 16.2.1 Einfache Strukturen
217
      • 16.2.2 Funktionen und Strukturen
220
      • 16.2.3 Zeiger auf Strukturen
221
      • 16.2.4 Felder von Strukturen
222
      • 16.2.5 Bitfelder
225
    • 16.3 Aufzählungen
226
    • 16.4 Variante Strukturen
228
    • 16.5 Rekursive Strukturen
232
    • 16.6 Deklaration von abgeleiteten Datentypen
232
    • 16.7 Typdefinition mit typedef
234
    • 16.8 Beispiele
235
      • 16.8.1 Ein Menü
235
      • 16.8.2 Eine Adressverwaltung
237
  • 17 Dateien
243
    • 17.1 Datenströme
243
    • 17.2 Öffnen und Schließen von Datenströmen
244
    • 17.3 Ein- und Ausgabe
246
    • 17.4 Beispiele
249
      • 17.4.1 Kopieren von Dateien
249
      • 17.4.2 Ausgeben von Dateien
250
      • 17.4.3 Eine Adressverwaltung – verbesserte Variante
250
  • 18 Rekursive Funktionen
257
    • 18.1 Rekursive Algorithmen
257
    • 18.2 Rekursive Funktionen in C
258
    • 18.3 Beispiele
260
      • 18.3.1 Binäres Suchen
260
      • 18.3.2 Quicksort
261
  • 19 Datenstrukturen
265
    • 19.1 Datenstrukturen und abstrakte Datenstrukturen
265
    • 19.2 Listen
266
      • 19.2.1 Eigenschaften und Terminologie
266
      • 19.2.2 Methoden und Implementierung
267
        • 19.2.2.1 Einfügen eines neuen Elementes
269
        • 19.2.2.2 Entfernen eines Elementes
271
      • 19.2.3 Weitere Arten von Listen
273
    • 19.3 Stapel und Schlangen
274
      • 19.3.1 Stapel
274
      • 19.3.2 Schlangen
275
      • 19.3.3 Zirkularpuffer
275
    • 19.4 Baum-Strukturen
276
      • 19.4.1 Eigenschaften und Terminologie
276
      • 19.4.2 Binäre Bäume
278
      • 19.4.3 Binäre Suchbäume
280
      • 19.4.4 Methoden
281
        • 19.4.4.1 Traversieren von Bäumen
281
        • 19.4.4.2 Suchen eines Elementes in einem binären Suchbaum
282
        • 19.4.4.3 Einfügen eines neuen Elementes in einen binären Suchbaum
283
        • 19.4.4.4 Löschen eines Elementes in einem binären Suchbaum
283
    • 19.5 Heap-Strukturen
287
      • 19.5.1 Eigenschaften
287
      • 19.5.2 Methoden
288
        • 19.5.2.1 Die Methode UpHeap
288
        • 19.5.2.2 Die Methode DownHeap
289
        • 19.5.2.3 Entfernen von Elementen
290
        • 19.5.2.4 Aufbau eines Heaps durch Einfügen von Elementen
291
        • 19.5.2.5 Aufbau eines Heaps in einem Feld
291
        • 19.5.2.6 Sortieren mit Heaps
291
    • 19.6 Hash-Strukturen
293
      • 19.6.1 Hash-Funktion
297
      • 19.6.2 Getrennte Verkettung
298
      • 19.6.3 Eigenschaften
300
    • 19.7 Vergleich der Datenstrukturen
300
  • 20 Dynamischer Speicher
303
    • 20.1 Aufgaben der Speicherverwaltung
303
    • 20.2 Anfordern von Speicher
304
    • 20.3 Verändern der Größe von Speicherblöcken
307
    • 20.4 Freigeben von Speicher
308
    • 20.5 Typische Fehler
308
      • 20.5.1 Kein Speicher mehr frei
309
      • 20.5.2 Freigabe mit einer falschen Adresse
309
      • 20.5.3 Freigabe eines bereits freigegebenen Speichers
309
      • 20.5.4 Freigabe eines Feldes
310
      • 20.5.5 Freigabe einer Variable
310
      • 20.5.6 Freigabe eines nicht initialisierten Zeigers
310
      • 20.5.7 Zugriff auf einen ungültigen Speicher
310
      • 20.5.8 Zugriff auf bereits freigegebenen Speicher
311
      • 20.5.9 Zugriff mit falschen Indizes
311
      • 20.5.10 Zugriff auf nicht initialisierten Speicher
311
      • 20.5.11 Verlust des Speichers durch Überschreiben des Zeigers
312
      • 20.5.12 Verlust des Speichers durch Verlust des Zeigers
312
      • 20.5.13 Verlust des Speichers durch Rücksprung
313
      • 20.5.14 Verlust des Speichers bei Rückgabe
313
      • 20.5.15 Zu große Speicherblöcke
314
  • 21 Numerik
315
    • 21.1 Fehlerarten
315
      • 21.1.1 Modellfehler
315
      • 21.1.2 Datenfehler
315
      • 21.1.3 Verfahrensfehler
316
      • 21.1.4 Rundungsfehler
316
    • 21.2 Mathematische Grundbegriffe
316
      • 21.2.1 Relativer Fehler
317
      • 21.2.2 Kondition
317
    • 21.3 Sehr kleine und sehr große Zahlen
319
      • 21.3.1 Ganze Zahlen
319
      • 21.3.2 Punktzahlen
319
      • 21.3.3 Summation von Punktzahlen
320
    • 21.4 Auslöschung
322
  • 22 Fehlerbehandlung
323
    • 22.1 Behandlung von Fehlern im Programm
326
      • 22.1.1 Fehlercodes
326
      • 22.1.2 Fehlerweitergabe
328
    • 22.2 Fehlerbehandlung mit Funktionen der Standard-Bibliothek
329
      • 22.2.1 Die Fehlervariable errno
329
      • 22.2.2 Fehlerausgabe
330
      • 22.2.3 Programmende mit exit
331
      • 22.2.4 Die Funktion atexit
331
      • 22.2.5 Die Funktion assert
331
    • 22.3 Signalbehandlung
332
      • 22.3.1 Definition von Signalbehandlungsfunktionen
333
      • 22.3.2 Abbruch mit abort
334
  • 23 Ein exemplarisches Software-Projekt
335
    • 23.1 Die Spezifikation
335
    • 23.2 Präzisierung der Spezifikation
336
    • 23.3 Bibliotheken
337
      • 23.3.1 Wahl der Bibliothek
338
      • 23.3.2 Verwendung von Bibliotheken
338
    • 23.4 Realisierungsmöglichkeiten
339
      • 23.4.1 Ansatz mit rekursiven Funktionen
340
      • 23.4.2 Der Syntaxbaum
341
      • 23.4.3 Der Auswertungsstapel
342
    • 23.5 Entwurf
343
      • 23.5.1 Beschreibung der Funktionen
343
      • 23.5.2 Fehlerbehandlung
344
    • 23.6 Implementierung des virtuellen Taschenrechners für den Textmodus
344
      • 23.6.1 Das Modul main.o
345
      • 23.6.2 Das Modul berechnung.o
347
      • 23.6.3 Das Modul stapel.o
350
      • 23.6.4 Das Modul eingabe.o
353
      • 23.6.5 Die grafische Benutzeroberfläche
355
    Literaturverzeichnis
357
    Index
359