HEIKE KUHN STAOTMOHLGASSE 18 69469 WEINHEIM ~ 06201/961321 als erste Programmiersprache Von Prof. Dr. Joachim Goll Uwe Grüner Prof. Herbert Wiese 3., völlig überarbeitete Auflage EI3 B. G. Teubner Stuttgart. Leipzig ' Wiesbaden 2000
Prof. Oe Joachim GolI, Jahrgang 1947, unterrichtet seit 1991 im Fachbereich Informationstechnik der Fachhochschule Esslingen - Hochschule für Technik (FHTE) Programmiersprachen, Betriebssysteme, Software Engineering und Objektorientierte Modellierung. Während seiner beruflichen Tätigkeit in der Industrie befaßte er sich vor allem mit dem Entwurf von verteilten Informationssystemen. Prof. Goll ist Leiter des Steinbeis-Transferzentrums Softwaretechnik Esslingen. Uwe Grüner, Jahrgang 1967, studierte Technische Informatik an der FHTE. Seit seinem Diplom im Jahre 1992 ist er Lehrbeauftragter für Software Engineering, Betriebssysteme und Netzmanagement an der FHTE. Uwe Grüner arbeitete bis zum Jahre 1996 beim Steinbeis Transferzentrum Softwaretechnik als Projektleiter für Realzeitsysteme. Seit 1996 befaßt er sich bei Daimler-Benz mit dem Management von Netzen, Datenbanken und insbesondere mit Methoden und Tools für die Entwicklung von Realzeitsystemen. Prof. Herbert Wiese, Jahrgang 1947, ist seit 1988 Professor an der FHTE. Er lehrt im Fachbereich Informationstechnik die Fächer Rechnertechnik und Prozessdatenverarbeitung sowie das Fach Mikrocomputertechnik im Aufbaustudiengang Informatik im Maschinenbau. Professor Wiese leitet seit vielen Jahren das Rechenzentrum der Fachhochschule. Beim Steinbeis Transferzentrum Softwaretechnik ist er zuständig für die Konzeption und das Management von Rechnernetzen. Im vorliegenden Buch erwähnte Produkt- und Firmennamen wie zum Beispiel Borland, IBM, MS-DOS, MS-Visual C+ + u.a. sind gesetzlich geschützt, ohne dass im Einzelnen darauf hingewiesen wird. Die Deutsche Bibliothek - CIP-Einheitsaufnahme Ein Titelsatz für diese Publikation ist bei Der Deutschen Bibliothek erhältlich. ISBN 978-3-322-92722-4 ISBN 978-3-322-92721-7 (ebook) DOI 10.1007/978-3-322-92721-7 Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsges~.tzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt besonders für Vervielfältigungen, Ubersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. B. G. Teubner Stuttgart. Leipzig' Wiesbaden 2000 Softcover reprint of the hardcover 3rd edition 2000 Der Verlag Teubner ist ein Unternehmen der Fachverlagsgruppe BertelsmannSpringer. Einband: Peter Pfitz, Stuttgart
Vorwort C hat in der Praxis eine außerordentliche Bedeutung gewonnen. Es hat nicht nur Assemblersprachen in der hardwarenahen Programmierung weitgehend verdrängt, sondern hat auch eine große Verbreitung in der Programmierung vielfältiger Anwendungen erfahren. Durch den Aufschwung objektorientierter Sprachen wie C++ und Java, die auf C basieren, hat sich die Bedeutung von C noch erhöht. Das vorliegende Buch wird seit einigen Jahren im Unterricht im ersten Semester der Fachhochschule und am Gymnasium eingesetzt. Es hat zum Ziel, dem Neuling die Sprachkonzepte von C so präzise wie möglich und dennoch in leicht verständlicher Weise vorzustellen. "Lernkästchen", auf die grafisch durch eine kleine Glühlampe aufmerksam gemacht wird, stellen eine Zusammenfassung eines Kapitels dar. Sie erlauben eine rasche Wiederholung des Stoffes. Ein fortgeschrittener Leser kann mit ihrer Hilfe gezielt bis zu der Stelle vorstoßen, an der für ihn ein detaillierter Einstieg erforderlich wird. Unser Dank gilt den Lehrbeauftragten Cristobal Pino und Markus Schuler, die unter anderem die Übungsbeispiele überprüften und durch eigene Vorschläge ergänzten, sowie den Herren Prof. Dr. Manfred Dausmann, Prof. Dr. Ulrich Bröckl-Fox und Prof. Jürgen Nonnast für die kritische Durchsicht des Manuskriptes und manchen wertvollen Verbesserungsvorschlag. Um sowohl einem Neuling als auch einem erfahrenen Leser gerecht werden zu können, sind in der vorliegenden 3. Auflage Abschnitte, die eine Vertiefung darstellen, mit dem Symbol [J gekennzeichnet. Diese Abschnitte stellen für das Folgende keine Voraussetzung dar. Sie können deshalb vom Einsteiger beim ersten Durchlauf übersprungen werden, um rasch einen Überblick über die ganze Breite von C zu erhalten. Die Vertiefungsabschnitte können dann bei Bedarf herangezogen werden. Esslingen, im April 2000 J. Goll / U. Grüner / H. Wiese Unterstützt von der Geschäftsstelle "Engineering Data Management" des debis Systemhauses zur Förderung des Ingenieur- und Informatik-Nachwuchses an Schulen, Fachhochschulen und Universitäten
Schreibweise In diesem Buch sind der Quellcode und die Ein-/Ausgabe von ganzen Beispielprogrammen sowie einzelne Anweisungen und Ein-I Ausgaben in der Schriftart Courier New geschrieben. Dasselbe gilt für Programmteile wie Variablennamen, Funktionsnamen etc., die im normalen Text erwähnt werden. Einige Programmbeispiele enthalten Platzhalter wie Anweisung oder Bedingung für konkrete Anweisungen oder Ausdrücke in der Programmiersprache. Ihre Rolle als Platzhalter ist jedoch so offensichtlich, dass für sie keine eigene Schriftart verwendet wurde. Sie sind wie die Wörter der Sprache in Courier New geschrieben. Wichtige Begriffe im normalen Text sind fett gedruckt, um sie hervorzuheben. Beispielprogramme und alle Bilder aus diesem Buch sowie Aufgaben und Lösungen finden Sie unter http://www.it.fht-esslingen.de/cbuch Ihre Verbesserungsvorschläge und kritischen Hinweise, die wir gerne annehmen, erreichen uns unter der Adresse: Joachim Goll Fachhochschule Esslingen - Hochschule für Technik, Fachbereich Informationstechnik Flandernstraße 101 73732 Esslingen oder via email: Joachim.GoII@fht-esslingen.de
Inhaltsverzeichnis 1.1 Algorithmen und Probleme... 2 1.2 Nassi-Shneiderman-Diagramme... 7 1.3 Werkzeuge für die Programmierung... 16 1.4 Zeichen... 22 1.5 Variablen und Datentypen... 26 1.6 Entwicklung der höheren Programmiersprachen... 30 IN DIE PR 2.1 Ursprung von C... 36 2.2 Standardisierung von C... 36 2.3 Eigenschaften von C...... 37 2.4 Einordnung der Programmiersprache C... 38 2.5 C und C++... 39 3 LEXIKALISCHE KONVENTIONEN... 4 3.1 Zeichenvorrat von C... 42 3.2 Lexikalische Einheiten... 44 4.1 Aufbau eines C-Programms... 60 4.2 Das berühmte Programm "hello, world"... 62 4.3 Programm zur Zinsberechnung... 66 4.4 Euklid'scher Algorithmus als Programm...... 68 5.1 Typkonzept... 72 5.2 Einfache Datentypen... 72 5.3 Variablen... 81 5.4 Typ-Attribute... 85 5.5 Typen in C........... 86 5.6 Klassifikation von Datentypen........ 87 EINEUHRU 6.1 Zeigertypen und Zeigervariablen...... 90 6.2 Zeiger auf void......... 96 6.3 Eindimensionale Arrays........ 96 6.4 Einfache Sortierverfahren für eindimensionale Arrays...... 99
VI Inhaltsverzeichnis 7 ANWEISUNGEN ND OPERATOREN... 10 7.1 Operatoren und Operanden......... 1 08 7.2 Ausdrücke und Anweisungen... 11 0 7.3 Nebeneffekte...... 111 7.4 Auswertungsreihenfolge... 112 7.5 L-Werte und R-Werte... 115 7.6 Zusammenstellung der Operatoren... 116 7.7 Implizite Typkonvertierung... 140 7.8 Sequenzpunkte bei Nebeneffekten... 147 8 KONTROLLS1RU REN.... 8.1 Blöcke - Kontrollstrukturen für die Sequenz... 150 8.2 Selektion... 150 8.3 Iteration... 155 8.4 Sprunganweisungen... 160 9 BLÖCKE UND FUNKTIONEN... 164 9.1 Struktur eines Blockes... 164 9.2 Sichtbarkeit und Lebensdauer... 165 9.3 Definition und Aufruf von Funktionen... 170 9.4 Deklaration von Funktionen... 178 9.5 Gültigkeitsbereiche von Namen...... 181 9.6 Alte Funktionsdefinition und -deklaration nach Kernighan und Ritchie... 181 9.7 Die Ellipse... - ein Mittel für variable Parameteranzahlen... 182 9.8 Rekursive Funktionen... 185 10 FORTGESCHRITTENE ZEIGERTE HNIK... 192 10.1 Zusammenhang zwischen Zeigern und Vektoren... 192 10.2 Arrays... 200 10.3 Übergabe von Arrays und Zeichen ketten... 206 10.4 Vergleich von char-arrays und Zeigern auf Zeichenketten... 208 10.5 Das Schlüsselwort const bei Zeigern und Arrays... 209 10.6 Kopieren von Zeichen ketten... 212 10.7 Standardfunktionen zur Stringverarbeitung und Speicherbearbeitung... 213 10.8 Vektoren von Zeigern und Zeiger auf Zeiger... 223 10.9 Zeiger auf Funktionen... 228 11 STRUKT~U~RE~N~U~~~K~~~====~ 11.1 Strukturen... 234 11.2 Unionen......... 242 11.3 Bitfelder - Komponenten von Strukturen und Unionen... 245
Inhaltsverzeichnis VII 12 KOMPLIZIERTE DATENTYPEN, EIGENE TYPNAMEN UND EINDEUTIGKEIT V N NA 12.1 Komplizierte Vereinbarungen... 250 12.2 Komplizierte Typen...... 251 12.3 typedef zur Vereinbarung eigener Typnamen... 252 12.4 Namensräume... 254 12.5 Interne und externe Bindung... 254 13 SPEICHE UNG VON DATEN IN DATEISYSTEMEN... 256 13.1 Dateien aus Sätzen fester Länge... 258 13.2 Dateien unter UNIX - das Streamkonzept... 262 13.3 Dateien aus Sicht höherer Programmiersprachen........ 263 14 EIN- UND AUSGABE... 2 6 14.1 Schichtenmodell für die Ein- und Ausgabe... 266 14.2 Umlenkung der Standardeingabe und -ausgabe... 267 14.3 C-Bibliotheksfunktionen zur Ein- und Ausgabe... 269 14.4 High-Level-Funktionen für die Standardeingabe und -ausgabe... 270 14.5 High-Level Dateizugriffsfunktionen.......... 293 15 SPEICHERKLASSEN... 318 15.1 Adreßraum eines Programms........... 318 15.2 Programme aus mehreren Dateien - Adressen... 320 15.3 Programme aus mehreren Dateien - die Speicherklasse extern... 321 15.4 Programme aus mehreren Dateien - die Speicherklasse static... 326 15.5 Speicherklassen bei lokalen Variablen... 327 15.6 Initialisierung......... 331 15.7 Tabellarischer Überblick über die Speicherklassen........ 332 15.8 Design und Programmiersprache... 332 16 ÜBERGABEPARAMETER UND RUCKGABEWERT EINES PROGRAMMS... 340 16.1 Übergabe von Parametern beim Programmaufruf..... 340 16.2 Beendigung von Programmen...... 342 17 DYNAMISCHE PEICHERZUWEISUNG, LISTEN UND BAUME. 348 17.1 Reservierung von Speicher...... 350 17.2 Rückgabe von Speicher... 351 17.3 Verkettete Listen.......... 352 17.4 Baumstrukturen......... 361
VIII Inhaltsverzeichnis 18 INTERNE SUCHVER A 18.1 Sequentielles Suchen... 381 18.2 Halbierungssuchen... 381 18.3 Suchen nach dem Hashverfahren... 383 19 PRAPROZESSOR... 402 19.1 Aufgaben des Präprozessors....402 19.2 Einfügen von Dateien in den Source-Code... 403 19.3 Symbolische Konstanten und Makros mit Parametern....404 1904 Bedingte Kompilierung....408 19.5 Weitere Präprozessor-Direktiven... 411 AN DARDBIBLI THEKSFUNKnONEN... 413 A.1 Fehlersuche (assert.h)....413 A.2 Klassifizierung und Konvertierung von Zeichen (ctype.h)... 413 A.3 Länderspezifische Darstellungen und Zeichen (Iocale.h)...414 AA Mathematische Funktionen (math.h)... 414 A.5 Globale Sprünge (setjmp.h)... 415 A.6 Signalbehandlungen (signal,h)...415 A. 7 Behandlung einer variablen Parameterliste (stdarg.h)... 415 A.B Ein- und Ausgabe (stdio.h)... 415 A.9 Zahlenkonvertierung, Speicherverwaltung, Zufallszahlengenerierung und Beenden von Programmen (stdlib.h)....417 A.10 String- und Speicherbearbeitung (string.h)... 418 A.11 Datum und Uhrzeit (time.h)....419 ANHANG B LOW-LEVEL DATEIZUGRIFFSFU ONEN... 420 B.1 Dateioperationen... 421 B.2 Ein-/Ausgabe... 425 B.3 Positionieren in Dateien... 426 BA Beispiel zur Dateibearbeitung mit Low-Level-Funktionen....427 ANHANG C SORnEREN MIT DEM QUIeKSORT ANHANG D SORnERVERFAHREN IM VERGLEICH... 433 LITERATURVERZEICHNIS...,......... ~... 435 INDEX...,. 11 436