2008 AGI-Information Management Consultants May be used for personal purporses only or by libraries associated to dandelon.com network. Andre Willms C-Programmierung lernen Anfangen, anwenden, verstehen ADDISON-WESLEY An imprint of Addison Wesley Longman, Inc. Bonn Reading, Massachusetts Menlo Park, California New York Harlow, England Don Mills, Ontario Sydney Mexico City Madrid Amsterdam
I 5 E Einleitung 13 E.l Erläuterungen zu den verwendeten Icons 14 1 Das erste C-Programm 15 1.1 Klein aber fein 15 1.2 Kommentare 16 1.3 Ausgabe mit printf 17 1.4 Die #include-direktive und der Präprozessor 18 1.5 Steuerzeichen für die Ausgabe 20 1.6 Grafische Darstellung von Programmen 22 1.7 Kontrollfragen 24 2 Eine eigene Funktion 25 2.1 Zerlegung in Teilaufgaben 25 2.2 Das Bilden von Funktionsnamen 28 2.3 Ein Appell an die Übersichtlichkeit 29 2.4 Eigene Prototypen 29 2.5 Der return-befehl 31 2.6 Kontrollfragen 32 3 Der Variablentyp int 33 3.1 Die Spielarten der Ganzzahlvariablen 33 3.2 Formatzeichen für die Ausgabe 34 3.3 Ein Beispiel für int 34 3.4 Verkürzungen in der Schreibweise 35 3.5 Die Notwendigkeit der Initialisierung 36 3.6 Erweiterte Formatierung der Ausgabe 37 3.7 Kontrollfragen 38
4 Eingabe mit scanf 39 4.1 Eingaben außerhalb des Bereichs 41 4.2 Kontrollfragen 42 5 Die Grundrechenarten 43 5.1 Die Operatoren +, -, *, /, (,) 43 5.2 Der %-Operator 45 5.3 Die Operatoren +=, -=, *=, /=, %= 45 5.4 Ausgabe von Ausdrücken 47 5.5 Die Operatoren ++ und - 48 5.6 Kontrollfragen 50 6 Übungen 51 6.1 Lösungen 54 7 Entscheidungen:if-else 59 7.1 Die Vergleichsoperatoren ==,!=, <, >, <=, >= 62 7.2 Der Operator! 64 7.3 Die Behandlung der Bedingung 64 7.4 Die else-anweisung 66 7.5 Der Bedingungsoperator? : 69 7.6 Vorzeichenwechsel 70 7.7 Kontrollfragen 71 8 Bezugsrahmen von Variablen 73 8.1 Lokale Variablen 73 8.2 Globale Variablen 76 8.3 Statische Variablen 79 8.4 Kontrollfragen 81 9 Funktionen mit Parameterübergabe 83 9.1 Parameterübergabe 83 9.2 Wertrückgabe 84 9.3 Übergabe mehrerer Parameter 86 9.4 Prototypen parametrisierter Funktionen 88 9.5 Die Wichtigkeit von return 88 9.6 Rückgabe von Wahr" und Falsch" 89 9.7 Kontrollfragen 90 10 Schleifen: for 91 10.1 Mehrere Anweisungen in for 95 10.2 Auslassen der Initialiserung 96 10.3 Kontrollfragen 96 I nhalt sver zeich n i s
11 Übungen 97 11.1 Lösungen 99 12 Schleifen mit Ein-/Austrittsbedingung: while 105 12.1 Schleifen mit Eintrittsbedingung : while 105 12.2 Simulation von for mit while 107 12.3 Das Verzichten auf einen Anweisungsblock 108 12.4 Schleifen mit Austrittsbedingung : do while 108 12.5 Simulation von for mit do..while 111 12.6 Zurück zum Anfang : continue 112 12.7 Kontrollfragen 114 13 Die logischen Operatoren, && 115 13.1 Der AND-Operator && 115 13.2 Der OR-Operator 116 13.3 Das Mischen von AND und OR 118 13.4 Kontrollfragen 118 14 Der Variablentyp float 119 14.1 Die Spielarten der Fließkommavariablen 119 14.2 Ein Beispiel für float 119 14.3 Typentscheidung bei gemischten Ausdrücken 121 14.4 Typumwandlung : Der cast-operator 121 14.5 Die Funktionen von math.h 123 14.6 Berechnung von logx a 127 14.7 Transzendente Funktionen im Gradmaß 127 14.8 Erweiterte Formatierung der Ausgabe 128 14.9 Kontrollfragen 129 15 Fallunterscheidung: switch...case 131 15.1 Der Abbruch: break 133 15.2 Mehrere case-anweisungen mit gleichem Ziel 134 15.3 Die Übriggebliebenen: default 135 15.4 Kontrollfragen 137 16 Übungen 139 16.1 Lösungen 140 17 Der Variablentyp char 145 17.1 Das Doppelleben von char 146 17.2 char und case 146 17.3 Die Funktionen von ctype.h 147 17.4 Das Sedezimalsystem 150 17.5 Das Dualsystem 152 17.6 Erweiterte Formatierung der Ausgabe 153 L
17.7 Kontrollfragen 153 18 Vektoren und Zeiger 155 18.1 Der Adreßoperator & 155 18.2 Der Dereferenzierungsoperator * 157 18.3 Adressen als Funktionsparameter 160 18.4 Zeiger auf Funktionen 161 18.5 Zeiger auf Zeiger 163 18.6 Kontrollfragen 166 19 Variablenfelder 167 19.1 Felder als Funktionsparameter 168 19.2 Mehrdimensionale Felder 171 19.3 Verwaltung von Feldern 173 19.4 In-/Dekrementierung von Zeigern 174 19.5 Felder von Zeigern 175 19.6 Kontrollfragen 176 20 Strings 177 20.1 Ein- und Ausgabe von Strings 177 20.2 Die Funktionen von string.h 180 20.3 Der Umgang mit Strings 184 20.4 Stringfelder 187 20.5 Stringfelder als Funktionsparameter 188 20.6 Die Parameter von main 188 20.7 Schützen vor Bereichsüberschreitung 190 20.8 Erweiterte Formatierung der Ausgabe 192 20.9 Kontrollfragen 193 21 Übungen 195 21.1 Lösungen 198 22 Präprozessordirektiven 207 22.1 #define und #undef 207 22.2 #include 210 22.3 #ifund#endif 211 22.4 #ifdef und #ifndef 213 22.5 #else und #elif 214 22.6 #error 216 22.7 #line und #pragma 216 22.8 Vordefinierte Makros 217 22.9 Kontrollfragen 218 23 File-Handling 219 23.1 Textdateien 220
23.2 Binärdateien 226 23.3 Verändern des Dateipositionszeigers 230 23.4 Allgemeines zu Dateien 233 23.5 Gepufferte Dateien 235 23.6 Kontrollfragen 237 24 Übungen 239 24.1 Lösungen 243 25 Strukturen 259 25.1 Zeiger auf Strukturen 263 25.2 Felder von Strukturen 264 25.3 Verschachtelte Strukturen 265 25.4 Das Speichern von Strukturen 269 25.5 Unions 271 25.6 Der Aufzählungstyp enum 274 25.7 Eigene Typen mit typedef 276 25.8 Kontrollfragen 277 26 Dynamische Speicherverwaltung 279 26.1 Reservierung eines Speicherblocks 280 26.2 Verwaltung mehrerer Speicherblöcke 284 26.3 Tiefe Kopien 287 26.4 Kontrollfragen 291 27 Listen 293 27.1 Einfach verkettete Listen 294 27.2 Doppelt verkettete Listen 305 27.3 Doppelt verkettete Ringe 312 27.4 Erstellen von Indextabellen 313 27.5 Die Sentinel-Technik 316 27.6 Kontrollfragen 317 28 Das Sortierverfahren Bubblesort 319 28.1 Die binäre Suche 324 28.2 Kontrollfragen 327 29 Die bitweisen Operatoren 329 29.1 Der AND-Operator & 329 29.2 Der Inclusive-OR-Operator 331 29.3 Der Exclusive-OR-Operator A 331 29.4 Der NOT-Operator ~ 332 29.5 Die Verschiebeoperatoren «und» 332 29.6 Bitfelder 333 29.7 Kontrollfragen : 334 L
30 Rekursion 335 30.1 Die Fibonacci-Zahlen 337 30.2 Die Türme von Hanoi 338 30.3 Backtracking 340 30.4 Das Dame-Problem 341 30.5 Rest-rekursive Funktionen 345 30.6 Kontrollfragen 348 31 Modulares Programmieren 349 31.1 Eigene Header-Dateien 349 31.2 Aufteilen in Module 350 31.3 Die Funktionsweise des Compilers 353 31.4 Statische Funktionen und Variablen 355 31.5 Kontrollfragen 356 32 Übungen 357 32.1 Lösungen 360 33 Nachtrag 379 33.1 Der Zufall 379 33.2 Der irreguläre Abbruch 385 33.3 Die letzte Anweisung 388 33.4 Die Funktionen von stdio.h 388 33.5 Die Funktionen von stdlib.h 395 33.6 Schlußbemerkung 399 34 Anhang 401 34.1 Anhang A - Antworten auf die Kontrollfragen 401 Antworten zu Kapitel 1 401 Antworten zu Kapitel 2 401 Antworten zu Kapitel 3 402 Antworten zu Kapitel 4 402 Antworten zu Kapitel 5 403 Antworten zu Kapitel 7 403 Antworten zu Kapitel 8 404 Antworten zu Kapitel 9 404 Antworten zu Kapitel 10 : 405 Antworten zu Kapitel 12 406 Antworten zu Kapitel 13 406 Antworten zu Kapitel 14 406 Antworten zu Kapitel 15 407 Antworten zu Kapitel 17 407 Antworten zu Kapitel 18 408 Antworten zu Kapitel 19 408 Antworten zu Kapitel 20 409 Antworten zu Kapitel 22 410
Antworten zu Kapitel 23 410 Antworten zu Kapitel 25 411 Antworten zu Kapitel 26 412 Antworten zu Kapitel 27 412 Antworten zu Kapitel 28 413 Antworten zu Kapitel 29 414 Antworten zu Kapitel 30 414 Antworten zu Kapitel 31 415 34.2 Anhang B - Bindungsstärke der Operatoren 415 34.3 Anhang C - Formatzeichen 417 Fließkommazahlen 417 Ganzzahlen 417 Strings 418 Zeiger 418 34.4 Anhang D - Steuerzeichen 418 Steuerzeichen 418 34.5 Anhang E-Dateimodi für fopen() 419 34.6 Anhang F - Die Symbole des Programmablaufplans 420 S Stichwortverzeichnis 421 L