Joachim Goll Ulrich Bröckl Manfred Dausmann С als erste Programmiersprache Vom Einsteiger zum Profi 4., überarbeitete und erweiterte Auflage Teubner B.G.Teubner Stuttgart Leipzig Wiesbaden
1 2 3 4 5 GRUNDBEGRIFFE DER PROGRAMMIERUNG 2 1.1 Vom Problem zum Programm 2 1.2 Nassi-Shneiderman-Diagramme 8 1.3 Werkzeuge für die Programmierung 16 1.4 Zeichen 23 1.5 Variablen und Datentypen 26 1.6 Entwicklung der höheren Programmiersprachen 30 1.7 35 EINFÜHRUNG IN DIE PROGRAMMIERSPRACHE С 38 2.1 Ursprung von С 38 2.2 Standardisierung von С 38 2.3 Eigenschaften von С 39 2.4 Einordnung der Programmiersprache С 40 2.5 С und C++ 41 LEXIKALISCHE KONVENTIONEN 44 3.1 Zeichenvorrat von С 44 3.2 Lexikalische Einheiten 45 ERSTE BEISPIELPROGRAMME 62 4.1 Aufbau eines C-Programms 62 4.2 Das berühmte Programm hello, world" 64 4.3 Programm zur Zinsberechnung 68 4.4 Euklid'scher Algorithmus als Programm 70 4.5 72 DATENTYPEN UND VARIABLEN 5.1 Typkonzept 78 78 5.2 Einfache Datentypen 78 5.3 Variablen 88 5.4 Typ-Attribute 92 5.5 Typen in С 93 5.6 Klassifikation von Datentypen 94 5.7 95
VIII 6 7 8 9 EINFÜHRUNG IN POINTER UND ARRAYS 98 6.1 Pointertypen und Pointervariablen 6.2 Pointer auf void 105 6.3 Eindimensionale Arrays 106 6.4 112 ANWEISUNGEN, AUSDRÜCKE UND OPERATOREN 98 116 7.1 Operatoren und Operanden 116 7.2 Ausdrücke und Anweisungen 118 7.3 Nebeneffekte 119 7.4 Auswertungsreihenfolge 120 7.5 L-Werte und R-Werte 123 7.6 Zusammenstellung der Operatoren 125 7.7 Implizite Typumwandlung 148 7.8 Sequenzpunkte bei Nebeneffekten 155 7.9 157 KONTROLLSTRUKTUREN 162 8.1 B l ö c k e - Kontrollstrukturen für die Sequenz 162 8.2 Selektion 162 8.3 Iteration 169 8.4 Sprunganweisungen 180 8.5 184 BLÖCKE UND FUNKTIONEN 188 9.1 Struktur eines Blockes 188 9.2 Sichtbarkeit und Lebensdauer 189 9.3 Definition und Aufruf von Funktionen 193 9.4 Deklaration von Funktionen 202 9.5 Gültigkeitsbereiche von Namen 206 9.6 Alte Funktionsdefinition und -deklaration nach Kernighan und Ritchie 206 9.7 Die Ellipse... - ein Mittel für variable Parameteranzahlen 207 9.8 Rekursive Funktionen 210 9.9 220 10 FORTGESCHRITTENE PROGRAMMIERUNG MIT POINTERN..228 10.1 Arrays 228 10.2 Übergabe von Arrays und Zeichenketten 242 10.3 Vergleich von char-arrays und Pointern auf Zeichenketten 244 10.4 Das Schlüsselwort const bei Pointern und Arrays 245
IX 10.5 Kopieren von Zeichenketten 247 10.6 Standardfunktionen zur Stringverarbeitung und Speicherbearbeitung 249 10.7 Vektoren von Pointern und Pointer auf Pointer 260 10.8 Pointer auf Funktionen 264 10.9 270 11 STRUKTUREN, UNIONEN UND BITFELDER 278 11.1 Strukturen 278 11.2 Unionen 290 11.3 Bitfelder- Komponenten von Strukturen und Unionen 294 11.4 301 12 KOMPLEXERE DATENTYPEN, EIGENE TYPNAMEN UND NAMENSRÄUME 12.1 Komplexere Vereinbarungen 308 308 12.2 Komplexere Typen 310 12.3 typedef zur Vereinbarung eigener Typnamen 310 12.4 Namensräume 313 13 SPEICHERKLASSEN 316 13.1 Adressraum eines Programms 316 13.2 Programme aus mehreren Dateien -Adressen 318 13.3 Programme aus mehreren Dateien - d i e Speicherklasse extern 319 13.4 Programme aus mehreren Dateien - die Speicherklasse static 324 13.5 Speicherklassen bei lokalen Variablen 325 13.6 Initialisierung 330 13.7 Interne und externe Bindung von Namen 330 13.8 Tabellarischer Überblick über die Speicherklassen 331 13.9 332 14 EIN- UND AUSGABE 336 14.1 Speicherung von Daten in Dateisystemen 336 14.2 Dateien unter UNIX - das Streamkonzept 338 14.3 Schichtenmodell für die Ein- und Ausgabe 338 14.4 Das Ein-/Ausgabe-Konzept von С 340 14.5 Standardeingabe und -ausgäbe 341 14.6 C-Bibliotheksfunktionen zur Ein- und Ausgabe 344 14.7 High-Level-Funktionen für die Standardeingabe und -ausgäbe 345 14.8 High-Level-Dateizugriffsfunktionen 370 14.9 396
X 15 ÜBERGABEPARAMETER UND RÜCKGABEWERT EINES PROGRAMMS 404 15.1 Übergabe von Parametern beim Programmaufruf 404 15.2 Beendigung von Programmen 406 16 DYNAMISCHE SPEICHERZUWEISUNG, LISTEN UND BÄUME. 412 16.1 Reservierung von Speicher 414 16.2 Rückgabe von Speicher 418 16.3 Verkettete Listen 419 16.4 Baumstrukturen 427 16.5 444 17 INTERNE SUCH- UND SORTIERVERFAHREN 450 17.1 Interne Sortierverfahren 450 17.2 Interne Suchverfahren 460 18 PRÄPROZESSOR 488 18.1 Aufgaben des Präprozessors 488 18.2 Einfügen von Dateien in den Source-Code 489 18.3 Symbolische Konstanten und Makros mit Parametern 490 18.4 Bedingte Kompilierung 494 18.5 Informationen über den Übersetzungskontext 497 18.6 Weitere Präprozessor-Direktiven 498 19 SOFTWARE ENGINEERING IN С 500 19.1 Structured Design 500 19.2 Modular Design 500 19.3 Umsetzung des Modular Designs in С 503 19.4 Trennung von Schnittstelle und Implementierung in С 504 19.5 Realisierung eines Stacks mit Modular Design in С 506 19.6 514 ANHANG A STANDARDBIBLIOTHEKSFUNKTIONEN A.1 Fehlersuche (assert.h) 515 515 A.2 Klassifizierung und Konvertierung von Zeichen (ctype.h) 515 A.3 Länderspezifische Darstellungen und Zeichen (locale.h) 516 A.4 Mathematische Funktionen (math.h) 516 A.5 Globale Sprünge (setjmp.h) A.6 Signalbehandlungen (signal.h) A.7 Behandlung einer variablen Parameterliste (stdarg.h) A.8 Ein- und Ausgabe (stdio.h)
XI A.9 Zahlenkonvertierung, Speicherverwaltung, Zufallszahlengenerierung und Beenden von Programmen (stdlib.h) 519 A.10 String- und Speicherbearbeitung (string.h) 520 A.11 Datum und Uhrzeit (time.h) 521 ANHANG В LOW-LEVEL-DATEIZUGRIFFSFUNKTIONEN 523 B.1 Dateioperationen 524 B.2 Ein-/Ausgabe 528 B.3 Positionieren in Dateien 529 B.4 Beispiel zur Dateibearbeitung mit Low-Level-Funktionen 530 ANHANG С WANDLUNGEN ZWISCHEN ZAHLENSYSTEMEN 532 C.1 Vorstellung der Zahlensysteme 532 C.2 Umwandlung von Dual/Hexadezimal in Dezimal 533 C.3 Umwandlung von Dezimal in Dual/Hexadezimal 533 C.4 Umwandlung von Dual in Hexadezimal und von Hexadezimal in Dual...536 LITERATURVERZEICHNIS 538 INDEX 539 TABELLEN FÜR DEN SCHNELLEN ZUGRIFF 548