Doina Logof tu · Doina Logofătu Eine praktische Einführung in C Lern- und Arbeitsbuch für...

30

Transcript of Doina Logof tu · Doina Logofătu Eine praktische Einführung in C Lern- und Arbeitsbuch für...

Doina Logofătu

Eine praktische Einführung in C

8485-3.book Page 1 Friday, July 18, 2008 1:43 PM

Doina Logofătu

Eine praktischeEinführung in CLern- und Arbeitsbuch für

Programmiereinsteiger

8485-3.book Page 3 Friday, July 18, 2008 1:43 PM

Doina Logofătu: Eine praktische Einführung in CLern- und Arbeitsbuch für ProgrammiereinsteigerISBN: 978-3-939084-85-3

© 2008 entwickler.pressEin Imprint der Software & Support Verlag GmbH

http://www.entwickler-press.dehttp://www.software-support.biz

Ihr Kontakt zum Verlag und Lektorat:Software & Support Verlag GmbHentwickler.pressGoethestraße 2880336 MünchenTel: +49(0) 89 66 55 76 10Fax: +49(0) 89 66 55 76 [email protected]://www.entwickler-press.de

Bibliografische Information Der Deutschen BibliothekDie Deutsche Bibliothek verzeichnet diese Publikation in der DeutschenNationalbibliografie; detaillierte bibliografische Daten sind im Internet überhttp://dnb.ddb.de abrufbar.

Lektorat: Sonja WaldschukKorrektorat: mediaService, SiegenSatz: mediaService, SiegenUmschlaggestaltung: Maria RudiBelichtung, Druck & Bindung: M.P. Media-Print Informationstechnologie GmbH, Paderborn

Alle Rechte, auch für Übersetzungen, sind vorbehalten. Reproduktion jeglicher Art (Fotokopie, Nachdruck, Mikrofilm, Erfassung auf elektronischen Datenträgern oder andere Verfahren) nur mit schriftlicher Genehmigung des Verlags. Jegliche Haftung für die Richtigkeit des gesamten Werks kann, trotz sorgfältiger Prüfung durch Autor und Verlag, nicht übernommen werden. Die im Buch genannten Produkte, Warenzeichen und Firmennamen sind in der Regel durch deren Inhaber geschützt.

8485-3.book Page 4 Friday, July 18, 2008 1:43 PM

The more you can dream, the more you can do.Michael Korda

8485-3.book Page 6 Friday, July 18, 2008 1:43 PM

Eine praktische Einführung in C 7

Inhaltsverzeichnis

V Vorwort 13

V.1 Danksagung 15

V.2 Über die Autorin 16

1 Die Programmiersprache C im Überblick 17

1.1 Kurzer historischer Abriss 17

1.2 Grundlegende Konzepte 18Zeichenvorrat von C 18Ausdrücke 21Aufbau der C-Programme 23Anweisungen 25Standardeingabe/-ausgabe 28Dateienoperationen 30Neue Datentypen: struct, enum, union 32Mehr über Arrays 34Zeiger, sizeof, dynamische Speicherreservierung 37Zeichenketten 43

1.3 11 gelöste Probleme in C 44Problem 1 44Problem 2 45Problem 3 46Problem 4 47Problem 5 49Problem 6 50Problem 7 51Problem 8 53Problem 9 55Problem 10 56Problem 11 56

1.4 Aufgaben 61

8485-3.book Page 7 Friday, July 18, 2008 1:43 PM

Inhaltsverzeichnis

8

2 Elementare Operationen 65

2.1 Teilbarkeit durch Subtraktionen 65

2.2 Euklidischer Algorithmus 66

2.3 Einfacher Primalitätstest 68

2.4 Der Punkt mit dem kürzesten Abstand 69

2.5 Größe des Speicherplatzes 72

2.6 Goldener Schnitt 74

2.7 Position eines Punktes im Kreis 75

2.8 Das arithmetische Mittel 78

2.9 Lineare Rekurrenz 79

2.10 Synonyme Funktion mit atol() 80

2.11 Informationen über Zeichen 82

2.12 Palindrom und Quersumme 83

2.13 Unendliche Wurzel 84

2.14 Reihe mit dem Wert π 85

2.15 Der bedingte Ausdruck ?: 91

2.16 Besondere Paare 93

2.17 Die Farey-Reihe 95

2.18 Gemeinsame Teiler 96

2.19 Zahlenumwandlung ins Dezimalsystem 98

2.20 Formatierung der natürlichen Zahlen 99

2.21 Vollkommene Zahlen 100

2.22 Befreundete Zahlen 101

2.23 Summe der dritten Potenzen 102

2.24 ASCII-Codes 103

2.25 Aufgaben 105

3 Arrays und Zeiger 109

3.1 Kleinstes Element einer Folge 109

3.2 Bubble Sort 111

3.3 Ableitung eines Polynoms 113

3.4 Bestimmung der größeren Zahlen 115

3.5 Produkt eines Polynoms mit (X-a) 117

3.6 Produkt zweier Matrizen 118

3.7 Die Goldbachsche Vermutung 122

3.8 Nachbarn mit Differenz 1 124

8485-3.book Page 8 Friday, July 18, 2008 1:43 PM

Inhaltsverzeichnis

Eine praktische Einführung in C 9

3.9 Lösen von Gleichungen zweiten Grades 126

3.10 Suchen eines Wertes im eindimensionalen Array 128

3.11 Sortieren der Spalten einer Matrix 130

3.12 Symmetrische Elemente in quadratischer Matrix 132

3.13 Zeiger zum Durchlaufen eines Arrays 134

3.14 Adressen in Arrays 135

3.15 Vertauschen der Bytes 136

3.16 Array von Funktionszeigern 138

3.17 Sattelpunkte der Matrix 140

3.18 Aufgaben 142

4 Zeichenketten und Dateioperationen 149

4.1 Kopieren einer konstanten Zeichenkette 149

4.2 Verwendung der Funktionen strcat(), strlen(), strchr(), strrchr() 150

4.3 Vergleich zweier Zeichketten: strcmp() und stricmp() 152

4.4 Erste Zeichenkette, die mit einem Zeichen einer anderen Zeichenkette beginnt – strpbrk() 153

4.5 Finden einer Teilzeichenkette in einer Zeichenkette – strstr() 154

4.6 Addition zweier Zahlen – strlen(), strcat() 155

4.7 Suchsequenz 160

4.8 Vogelsprache 162

4.9 Verwendung der Funktionen strncpy(), strcat(), strlen() 165

4.10 Verwendung der Funktion strtok() 167

4.11 Verketten zweier Dateien 168

4.12 Kommandozeilen-Parameter 169

4.13 Aufgaben 171

5 Strukturen, Bitfelder, Unionen 175

5.1 Kollineare Punkte 175

5.2 Summe zweier Brüche 177

5.3 Vereinigung von mehreren Intervallen 180

5.4 Differenz-, Vereinigungs- und Durchschnittsmenge zweier Mengen 181

5.5 Zugehörigkeit eines Punktes zur Kreisscheibe 184

5.6 Test union 187

5.7 Bitfelder 189

5.8 Aufgaben 191

8485-3.book Page 9 Friday, July 18, 2008 1:43 PM

Inhaltsverzeichnis

10

6 Bit-Operationen 195

6.1 Binäre Darstellung 195

6.2 Bit-Operationen 197

6.3 Datumsverpackung 198

6.4 Verschiedene Operationen mit Bit-Operatoren 200

6.5 Anzahl der Eins-Bits in der binären Darstellung 203

6.6 Sieb des Eratosthenes 204

6.7 Aufgaben 207

7 Zeitfunktionen, Zufallszahlen 209

7.1 Welcher Wochentag ist es? 209

7.2 rand(), qsort() und bsearch() 211

7.3 Kopf oder Zahl 213

7.4 Schere, Stein, Papier 216

7.5 Laufzeit einer Schleife 219

7.6 Pause in Sekunden 220

7.7 Genaues Datum und genaue Uhrzeit 221

7.8 Vergangenheit oder Zukunft 222

7.9 Aufgaben 223

8 Verkettete Listen 227

8.1 Wörter im Satz 227

8.2 Sortierte Wörter mit Großbuchstaben 230

8.3 Sortierte Wörtermengen mit Großbuchstaben 231

8.4 Rare Matrizen 233

8.5 Zählreime I 242

8.6 Zählreime II 245

8.7 Hashtabelle 248

8.8 Erzeugung von Listen 255

8.9 Kellerspeicher (Stack) 259

8.10 Kartenspiel 264

8.11 Traversieren von Binärbäumen 271

8.12 Aufgaben 275

8485-3.book Page 10 Friday, July 18, 2008 1:43 PM

Inhaltsverzeichnis

Eine praktische Einführung in C 11

9 Anwendung — Große Zahlen 279

9.1 Problemstellung 279

9.2 Ziele 279

9.3 Beispiele 280

9.4 Problemanalyse und Entwurf der Lösung 283

9.5 Aufgaben 296

10 Anwendung — Raumfüllende Fraktale 299

10.1 Objektive 301

10.2 Problembeschreibung 302

10.3 Einige Beispiele 304

10.4 Problemanalyse und Entwurf der Lösung 306

10.5 Programm 307

10.6 Aufgaben 312

A Literaturverzeichnis 313

B CD-ROM zum Buch 315

C Schlüsselwörter in C 317

D Häufig verwendete Zeichenkettenfunktionen in C 319

E ASCII-Tabelle 321

F Hinweis Projekteinstellungen in Microsoft Visual C++ 323

Stichwortverzeichnis 325

8485-3.book Page 11 Friday, July 18, 2008 1:43 PM

Eine praktische Einführung in C 13

Vorwort

Der vorliegende Titel basiert auf meinem Buch „Bazele programării în C. Aplicaţii”(„Grundlagen der Programmierung in C. Anwendungen”), das Anfang 2006 im Polirom-Verlag in Rumänien erschienen ist.

Es ist als Lern- und Arbeitsbuch der C-Programmierung konzipiert und versetzt Sie indie Lage, eine Vielzahl praktischer Probleme zu lösen. Das theoretische Gerüst und dieVielfältigkeit der vorgestellten Themen machen das Buch auch für fortgeschrittene Leserinteressant. Ich empfehle es Schülern, Studenten, Programmierern, Informatiklehrernund allen Interessierten für das individuelle Studium, als Arbeitsmaterial in der Lehreoder als Nachschlagewerk.

Da C Basis für die modernen objektorientierten Sprachen C++, Java und C# und außer-dem flexibel und effizient ist, bin ich der Ansicht, dass sich die Programmiersprache aus-gezeichnet für Einsteiger eignet. Bevor Sie sich mit dem Thema Objektorientierungbefassen, sollten Sie sich algorithmisches, strukturiertes Denken aneignen und die Basis-konzepte (Algorithmenentwurf, Variablen, Anweisungen, Modularität, Speicherplatz-manipulation) beherrschen. Wenn Sie der Programmierung treu bleiben, werden Sienahezu automatisch zu C++, Java oder C# gelangen, denn diese Sprachen bieten Kon-zepte wie Datenabstraktion oder generische Programmierung.

Die 100 Probleme, die Sie mit vollständigen Lösungen im Buch finden, sind unterschied-lich schwer. Zu jeder Problembeschreibung gehört ein repräsentatives Eingabe- undAusgabe-Datenset, mit dem Sie Ihre eigene Lösung überprüfen können. Danach wirddas Problem analysiert, dazu schlage ich eine mögliche Lösung vor. Und schließlich fin-den Sie für diese Lösung das komplette C-Programm aufgelistet, bevor wieder Ihr Hirn-schmalz bei den verwandten Aufgaben und Übungen gefragt ist. Übungen gibt es aucham Ende jedes Kapitels, insgesamt über 330 im Buch. Die Programme sind kompakt undvollständig, um eine gute Lesbarkeit zu gewährleisten und die C-Sprache zu vertiefen.Sie sind, außer das letzte Programm mit Fraktalen (Kapitel 10), mit der Microsoft VisualC++ 2005 Express Edition kompiliert worden, die Microsoft kostenlos zur Verfügungstellt. Sie halten sich an den ANSI-C-Standard und sollten mit jedem C-Compiler funkti-onieren.

Entlang der zehn Kapitel lade ich Sie zu einer Reise ein, die Sie mit der Sprache C ver-traut macht. Das erste Kapitel startet kurz und bündig mit den Grundelementen von Cund zahlreichen Beispielen. Die nächsten sechs Kapitel (2 bis 7) enthalten viele gelösteProbleme (einfache Anweisungen, Zeichenketten, Arrays, Strukturen, Unionen, Zeiger,Bit-Operationen, Zeitfunktionen, Zufallszahlen), damit Sie sich mit C und dem Lösungs-entwurf für konkrete Aufgabenstellungen anfreunden können. In den letzten drei Kapi-teln (Kapitel 8 bis 10) befassen wir uns mit schwierigeren Dingen: verketteten Listen,komplexeren Datenstrukturen und ihrer Verarbeitung, Fraktale. Ein Grund dafür istauch, dass ich mir dadurch erhoffe, Sie mit diesen interessanten Themen für die Pro-

8485-3.book Page 13 Friday, July 18, 2008 1:43 PM

V – Vorwort

14

grammierung begeistern zu können. Kapitel 8 behandelt verkettete Strukturen (einfachund doppelt verkettete, kreisförmige, Hash-Tabellen, Kellerspeicher, Bäume). In Kapitel9 erstellen wir eine umfangreiche Anwendung, die verkettete Listen nutzt, um die Wur-zel k-ten Grades einer großen Zahl zu berechnen. Wir implementieren dabei alle arithme-tischen Operationen für solch große Zahlen. Die Applikation im letzten Kapitel zeichnetfraktale Strukturen und macht u. a. von Bitoperatoren und graphischen RoutinenGebrauch. Das Programm ist in Borland-C geschrieben, weil die grafische Bibliotheküberschaubar und lehrreich ist. Sie können den grafischen Anteil mit einem anderenersetzen, um die Fraktale zu zeichnen.

„Eine praktische Einführung in C“ enthält viele wichtige Konzepte aus der elementarenDatenverarbeitung, wie z.B. Suchen eines Elements, Sortieren, Löschen, Hinzufügen,Operationen mit Dateien usw. Dazu werden auch verschiedene Datenstrukturen vorge-stellt: Strukturen, Bitfelder, Unionen, Arrays, Zeichenketten, Kellerspeicher, Hash-Tabel-len oder Binärbäume. Die oft verwendeten Zeichenkettenoperationen, Bit-Operationenund Zeitfunktionen werden in mehreren ausgewählten Problemstellungen vorgestellt.Funktionen erstellen wir selbst, um klassische Aufgaben zu lösen, und wir lernen auch,wie wir bestehende Funktionen aus den Header-Dateien verwenden können (z.B. fürZeichenkettenoperationen, Zeit- und Zufallszahlenfunktionen, Sortieren oder Suchen ineinem Array).

Für einen Programmierer ist Mathematik sehr wichtig. Die vielen Übungen und Bei-spiele im Buch tragen dazu bei, mehrere grundlegende Konzepte der Mathematik aufzu-frischen, u.a. Teilbarkeit und Primalität natürlicher Zahlen, Rekurrenzen, Reihen,Berechnung des Wertes π, Fibonacci-Zahlen, vollkommene und befreundete Zahlen,Operationen mit Polynomen und Matrizen, Goldbachsche Vermutung, Gleichungen,Brüche und Mengen, Geometrie, Sieb des Eratosthenes.

Die einzige Möglichkeit, eine Programmiersprache zu beherrschen, ist kontinuierlichesÜben. Es ist wichtig, immer wieder selbständig verschiedene Aufgaben zu lösen undProgramme zu entziffern, zu erweitern, damit zu „spielen“. Dieses Buch bietet Ihnendazu eine große Anzahl von oft auftretenden und vielschichtigen Programmieraufgabenan, die meisten davon sind vollständig gelöst und mit Erklärungen zur Sprache C,Mathematik und Algorithmik versehen. Alle Programme des Buches finden Sie auf derbeiliegenden CD, so dass Sie sie ausprobieren, ändern und erweitern können.

Ab und zu finden Sie als Belohnung für Ihren Fleiß zwischen zwei Kapiteln Bilder wie„Hof des Königspalastes in Madrid“, „Winterlandschaft in Ried“, „Wellensurfer in Mün-chen“, „Kuppel der blauen Moschee“ oder „Garten in Alhambra“.

Vergessen Sie nicht, gelegentlich den Online-Service zum Buch zu besuchen: http://www.algorithmen-und-problemloesungen.de. Dort finden Sie Erweiterungen, Ergänzungen,Lösungen usw. Bitte schicken Sie Ihre Ideen und Vorschläge an [email protected] Dank im Voraus!

Viel Vergnügen beim Lesen und spannendes Lernen!

Doina Logofătu

München, Juni 2008

8485-3.book Page 14 Friday, July 18, 2008 1:43 PM

Danksagung

Eine praktische Einführung in C 15

V.1 DanksagungSehr herzlich bedanke ich mich bei den Kollegen der Fakultät für Informatik und Mathe-matik der Hochschule München. Herr Prof. Dr. Manfred Gruber hat mir mit seinen Kor-rekturen, Vorschlägen und täglichen Ermunterungen viel geholfen. Seine Freude amLehren und an der Zusammenarbeit sowie seine Ermutigungen bedeuten mir sehr viel.Ein ganz besonderer Dank geht auch an die lieben Kolleginnen Heli (Helene Dietz) undMichaela Rambausek, die in jeweils zwei Kapiteln mein Deutsch korrigiert haben.

Ich bedanke mich bei Ștefan Logofătu, Dragoș Carp und Adrian Achihăei für die Gesprä-che über bestimmte Themen des Buches und für die technische und moralische Hilfestel-lung.

Mein herzlicher Dank gebührt außerdem allen, die meine ersten beiden Bücher („Algo-rithmen und Problemlösungen mit C++“ und „Grundlegende Algorithmen mit Java“)positiv aufgenommen haben. Professoren, Studenten und Programmierer, die mirgeschrieben haben, haben mich darin bestärkt, neue Buchprojekte, insbesondere dieses,anzugehen und zu verwirklichen.

Mein besonderer Dank gebührt dem Verlag entwickler.press (insbesondere meiner Lek-torin Sonja Waldschuk). Ich bin sehr dankbar für die Unterstützung, die ich von Anfangan erfahren habe, für die professionelle Zusammenarbeit und für die Geduld, mit der aufmein Manuskript gewartet wurde. Es hat mich sehr gefreut, dass ich eines meiner Fotosfür die Gestaltung des Umschlags verwenden durfte.

Und schließlich danke ich allen, die die Fertigstellung dieses Buches ermöglicht haben.

Doina Logofătu

München, Juni 2008

8485-3.book Page 15 Friday, July 18, 2008 1:43 PM

V – Vorwort

16

V.2 Über die AutorinDoina Logofătu, geboren in Dorohoi in Rumänien, stu-dierte bis 1997 Informatik an der Universität Al. I. Cuza inIșai. 1999 hat sie an derselben Universität den Mastertitel inVerteilten Systemen erworben. Danach arbeitete sie einigeJahre als Informatiklehrerin, als Lehrassistentin an der Uni-versität Al. I. Cuza und als Softwareentwicklerin in derFinanzbranche in Ișai.

Zu ihren Leidenschaften zählen die Mathematik, die Pro-grammierung und Algorithmen. Ein weiterer Schwerpunktbildet die Didaktik. Ihr erstes Buch „C++ - Gelöste Pro-bleme und Algorithmen” wurde 2001 in Rumänien veröf-fentlicht. Als Koautorin wirkte sie am Schulbuch „Pro-grammierung in C++ für Fortgeschrittene“ fürInformatikgymnasien mit und Anfang 2006 schrieb sie dasBuch „Grundlagen der Programmierung in C”.

Ihr erstes in Deutschland publiziertes Buch war „Algorithmen und Problemlösungenmit C++”, das 2006 im Vieweg Verlag erschien. Es basiert auf ihrem rumänischen Buch,das sie um viele neue Themen erweiterte. Es folgen die Bücher „Grundlegende Algorith-men mit C++” (in Rumänien publiziert) und „Grundlegende Algorithmen mit Java” (inDeutschland und Rumänien veröffentlicht).

Doina Logofătu hat außerdem diverse Beiträge in Informatikzeitschriften und bei inter-nationalen Konferenzen veröffentlicht. Seit 2001 arbeitet sie als Softwareentwicklerinund in der Wissenschaft und Lehre in Deutschland, derzeit an der Hochschule München.

Zu ihren Hobbys zählen die rumänische Geschichte und Literatur, die Baukunst des Mit-telalters und der Neuzeit, Sport, Fotografieren und Reisen.

Weitere Informationen finden Sie auf der Website de Autorin: www.doina-logofatu.de

8485-3.book Page 16 Friday, July 18, 2008 1:43 PM

Eine praktische Einführung in C 17

Die Programmiersprache C im Überblick

C ist eine sehr flexible Sprache, mit der auch komplexe Aufgaben schnell gelöst werdenkönnen. Der erzeugte Quelltext ist kompakt und bleibt, wenn der Programmierer daraufbedacht ist, trotzdem verständlich, also gut lesbar. Die Programme, die ein C-Compilererzeugt, weisen eine hohe Ausführungsgeschwindigkeit auf und die Liste der Hard-ware-Architekturen und Betriebssysteme, für die es C-Compiler gibt, ist länger als beijeder anderen Sprache. Zur Beliebtheit der Sprache haben auch ihre erprobten Bibliothe-ken beigetragen.

C erlaubt Manipulationen auf Bitebene und kann den Speicher mittels Zeigern undTypassoziationen gezielt verwalten. Im Vergleich zu anderen Sprachen schränkt C denProgrammierer weniger ein, er hat also größere Freiheiten, aus denen auch die Flexibili-tät erwächst. Aber wo Licht ist, ist auch Schatten. Ein C-Programmierer muss bei seinerArbeit auf Dinge achten, an die etwa ein Delphi-Programmierer keinen Gedanken zuverschwenden braucht, denn diese Mühe nimmt ihm der Delphi-Compiler ab. C prüftbeim Kompilieren zum Beispiel nicht den Wert von Zeigervariablen ab, Delphi undandere Sprachen hingegen schon. Diese C-Eigenart trägt gewiss am meisten zu der Frei-heit bei, die erfahrene Programmierer so sehr zu schätzen wissen, die aber für Anfängervon Nachteil sein kann.

1.1 Kurzer historischer Abriss1972 erblickte die Sprache in den Bell Laboratories das Licht der Welt, erfunden von Den-nis Ritchie. Viele ihrer Prinzipien und Ideen stammen von den Sprachen B, BCPL, CPLund Algol. Hier ein kurzer historischer Abriss:

� ALGOL (um 1960, Algorithmic Language, eine der ersten strukturierten Programmier-sprachen)

� CPL (1969, Combined Programming Language, Martin Richards)

� BCPL (1970, abgeleitet von CPL, Martin Richards)

� B (1970, abgeleitet von BCPL, Ken Thompson, Bell Laboratories)

� C (1972, entstand aus B, Dennis Ritchie, Bell Laboratories)

Ritchie und Thompson haben in Zusammenarbeit mit Brian Kernighan den Kernel desBetriebssystems UNIX mit Hilfe des C-Compilers von Ritchie umgeschrieben. Seitdementwickelt sich die Sprache und heute ist sie die Basis für moderne objektorientierteSprachen wie C++ und Java.

8485-3.book Page 17 Friday, July 18, 2008 1:43 PM

1 – Die Programmiersprache C im Überblick

18

1.2 Grundlegende Konzepte

1.2.1 Zeichenvorrat von C

Ein C-Programm, also ein C-Quelltext, besteht aus den Zeichen des ASCII-Zeichensat-zes, der mit ganzen Zahlen von 0 bis 127 kodiert wird. So eine Zahl kann binär mit 7 Bitsdargestellt werden. Den ASCII-Zeichensatz teilt man in zwei Gruppen von Zeichen ein:nicht druckbare Zeichen (mit ASCII-Codes kleiner als 32, Ausnahme ist DEL, das mit 127kodiert ist) und druckbare Zeichen (das Leerzeichen, Groß- und Kleinbuchstaben undSonderzeichen wie den senkrechten Strich, die Codes größer als 32 haben). Zum Beispielbesitzen die Großbuchstaben ASCII-Codes zwischen 65 und 90, 65 ist der Code für ’A’und 90 der Code für ’Z’. Die Kleinbuchstaben haben die ASCII-Codes zwischen 97 und122, die Ziffern ’0’ bis ’9’ werden durch die Zahlen 48 bis 57 repräsentiert.

Die nicht druckbaren Zeichen haben verschiedene Bedeutungen. Zwei Beispiele: DerASCII-Code 0 wird dem Zeichen NULL zugewiesen, das ist ein „künstliches” Zeichen, dasnicht über die Tastatur eingegeben werden kann. Mit \0 schließt man unter anderem Zei-chenketten ab. Der ASCII-Code 10 (man nennt das Zeichen Zeilenvorschub oder newline)bewegt den Cursor auf die erste Spalte der nächsten Zeile. Erzeugt wird der Zeilenvor-schub mit der Taste ENTER. In C wird dieses Zeichen auch mit \n bezeichnet.

Namen (Bezeichner)

Ein Bezeichner (Name) muss immer mit einem Buchstaben oder mit einem ’_’ (Unter-strich) beginnen, dann können sich Buchstaben, Unterstriche und auch Ziffern in beliebi-ger Reihenfolge abwechseln. Groß- und Kleinbuchstaben werden unterschieden, d.h.max, Max und MAX sind drei verschiedene Bezeichner. Man verwendet sie für Variablen,Konstanten, Typnamen, Funktionen, Namen von Strukturen, Unions, Bitfeldern, Auf-zählungstypen, Makros und Makroparameter.

Schlüsselwörter

Schlüsselwörter (reservierte Wörter) sind für den C-Compiler von einer besonderenBedeutung: Es gibt sie nur für Anweisungen, grundlegende Datentypen und für die Defi-nitionssyntax für Funktionen und Datentypen. In ANSI C (American National Standards Ins-titute) gibt es die folgenden 32 reservierten Wörter, die immer klein geschrieben werden:

Schlüsselwörter

auto double int switch

_Bool else long typedef

break enum register union

case extern restrict unsigned

char float return void

_Complex for short volatile

const goto signed while

8485-3.book Page 18 Friday, July 18, 2008 1:43 PM

Grundlegende Konzepte

Eine praktische Einführung in C 19

��BElementare Datentypen

Unter Datentyp versteht man eine Menge, in der die folgenden Begriffe festgestellt sind:

� Speichergröße und Lebensdauer jedes Elements.

� Eine Menge von Operationen, mit deren Hilfe die Werte dieses Typs modifiziert undüberarbeitet werden können und die Bedeutung dieser Operationen.

� Die zugelassenen Operatoren und Einschränkungen, die für sie gelten.

Datentypen können elementar (vordefiniert) oder benutzerdefiniert (abgeleitet) sein. Dieelementare Datentypen und deren Größen:

Ein Wert vom Typ float, der nicht 0 ist, gehört im Betrag dem Intervall [1.7·10-308,1.7·10308].

Konstanten

Eine Konstante ist ein fester, dem C-Compiler bekannter Wert. Das kann ein Zeichen,eine Zeichenkette, eine ganze oder eine rationale Zahl sein. Beispiele für Konstanten: 678,“Dorohoi“ , ‘M’, −24.67e8, 6*4+32−5.

continue if sizeof switch

default _Imaginary static typedef

do inline struct

Typ Beschreibung Intervall Anzahl Byts

char,unsigned char

Zeichen durch einen ASCII-Code dargestellt

[-128, 127][0, 255]

1

short,unsigned short

binäre ganze Zahl durch das Kom-plementieren gegen 2 dargestellt

[-32768, 32767][0, 65535]

2

int, unsigned int - // - // - Plattform-/Compilerabhängig 2, 4 oder 8

long,unsigned long - // - // -

[-231, 231-1]

[0, 232-1]4, 8

float einfache genaue Fließkommazahl [1.7·10-308, 1.7·10308](im Betrag)

4

double doppelt genaue Fließkommazahl[2.3E-308, 1.7E+308](im Betrag)

8

long double doppelt genaue Fließkommazahl[3.4E-4932, 1.1E+4932](im Betrag)

10

Tabelle 1.1: Standard-Datentypen in C

Schlüsselwörter

8485-3.book Page 19 Friday, July 18, 2008 1:43 PM

1 – Die Programmiersprache C im Überblick

20

Variablen

Eine Variable repräsentiert einen Speicherbereich, der Werte aufnimmt, die während derLaufzeit eines Programms geändert werden können. Angesprochen wird eine Variablemit ihrem Namen (Bezeichner), der auf eine bestimmte Speicheradresse verweist. Siemuss vor ihrer ersten Verwendung deklariert werden, das heißt, man muss den Daten-typ der Werte festlegen, die sie später aufnehmen kann.

Eine Variable ist gekennzeichnet durch:

� ihren Namen

� ihre Adresse im Speicher

� ihren Datentyp

� ihren Wert (zu einem bestimmten Zeitpunkt)

Die Deklaration einer einfachen Variablen hat die Form:

<Datentyp> Bezeichner_Liste;

Eine Bezeichner_Liste enthält mindestens einen, oder mehrere, durch Kommas getrennteBezeichner.

Beispiele

Ein Array ist ein strukturierter Typ, der eine zusammenhängende Speicherzone allokiertund Elemente desselben Datentyps beinhaltet. Die Deklaration eines Arrays sieht so aus:

Der Name eines Arrays kann in verschiedenen Konstruktionen vorkommen und er zeigtauf die Speicheradresse seines ersten Elements. Will man mehrere typgleiche Arraysdeklarieren, kann man sie auch durch Kommas trennen.

Beispiele

Einzelne Elemente eines Arrays spricht man über ihre Indizes an, die intern von 0 begin-nend gezählt werden. Das erste Element von c[] ist also c[0][0], das letzte ist c[99][9].

Die Elemente des Arrays a[] sind: a[0], a[1], …, a[99].

Die Elemente des Arrays b[] sind: b[0][0], b[0][1], b[0][2], b[0][3], b[0][4], b[1][0],b[1][1], b[1][2], b[1][3], b[1][4].

int a, b, c, d, i, j;char ch;float x, y, z;

<Datentyp> <Array_Name> [Dim1][Dim2]…[Dimn];

int a[100], b[2][5], c[100][10];char m[20];

8485-3.book Page 20 Friday, July 18, 2008 1:43 PM

Grundlegende Konzepte

Eine praktische Einführung in C 21

Kommentare

Kommentare leitet man in C mit /* ein und schließt sie mit */ ab. Der Compiler ignoriertsie und in der Regel erklären sie Teile des Programms. Im Oktober 1999 kam mit demStandard C99 auch der einzeilige Kommentar mit //Kommentar dazu.

1.2.2 Ausdrücke

Ein Ausdruck besteht aus einem oder mehreren Operanden, die durch Operatoren ver-bunden sind. Ein Ausdruck hat einen Wert sowie einen Typ und mit runden Klammernkann man die Reihenfolge der Auswertung festlegen.

Operanden

Ein Operand kann sein:

� eine Konstante

� der Name einer einfachen Variablen, einer Struktur, eines Typs, Arrays oder einerFunktion

� die Referenz (die Speicheradresse) eines Arrayelements oder einer Struktur

� ein geklammerter Ausdruck

Operatoren

Es gibt vier Arten von Operatoren:

� Unäre (einstellige) Operatoren haben genau einen Operanden, der ihnen nachgestelltist.

� Binäre (zweistellige) Operatoren, die zwischen ihren beiden Operanden stehen.

� Einen dreistelligen Operatoren, den Bedingungsoperator, der später erklärt wird.

� Einen mehrstelligen Operator, den Komma-Operator, der ebenso später erklärt wird.

In Ausdrücken mit mehreren verschiedenen Operatoren muss die Reihenfolge der Aus-wertung eindeutig sein, daher haben alle Operatoren Priorität.

Ein Ausdruck kann auch der Name einer Variablen oder ein cast-Ausdruck (expliziteTypumwandlung) sein.

Symbol Bedeutung

~x !x Einser-Komplement (bitweises NOT); logisches NOT

-x +x Vorzeichenumkehr; Identität

*x &x Inhalt einer Speicheradresse; die Speicheradresse einer Variable

Tabelle 1.2: Unäre Operatoren in C

8485-3.book Page 21 Friday, July 18, 2008 1:43 PM

1 – Die Programmiersprache C im Überblick

22

In der Evaluierung des Ausdrucks verwendet man die Regel der expliziten Umwand-lung: Wenn sich der Typ des Ausdrucks rechts vom Gleichheitszeichen vom Typ desAusdrucks links davon unterscheidet, dann wird der Wert des rechten Ausdrucks in denlinken Typ umgewandelt und danach findet die Zuweisung statt.

Der Bedingungsoperator ?: (bedingter Ausdruck) ist ein dreistelliger Operator für Aus-drücke, die Alternativen aufweisen. Er hat das Format A1?A2:A3, wobei A1, A2 und A3Ausdrücke darstellen.

Für eine Anweisung x = A1?A2:A3 funktioniert er so:

� wenn A1 ungleich 0, dann x = A2

� wenn A1 gleich 0, dann x = A3

Der Komma-Operator wird eingesetzt, um mehrere Ausdrücke zu gruppieren, er hat dieniedrigste Priorität. Mit Hilfe dieses Operators kann man Konstrukte wie A1, A2, ..., Anaufbauen.

sizeof (x) Größe (in Bytes) einer Variablen oder eines Typs, anwendbar auch für Objekte wie Arrays, Strukturen und Unions, Komponenten, Zeiger usw.

––x x-- ++x x++ Dekrement- und Inkrement-Operatoren, der Wert wird um 1 verringert bzw. erhöht. Sie können Pre- oder Postfix sein, was bedeutet, dass sie in einer Anweisung oder in einem Ausdruck die höchste bzw. die niedrigste Auswertungspriorität haben.

Symbol Bedeutung

x*y x/y x%y Multiplikation; Division; Rest der Division (Modulo). Diese Operatoren haben eine höhere Priorität als die Addition und Subtraktion, es gilt also, wie in der Mathematik, Punkt vor Strich.

x+y x-y Addition; Subtraktion

x<<y x>>y Shift-Operatoren, die den Wert x um y-Stellen bitweise nach links bzw. rechts verschieben.

x<y x>y x<=y x>=y x==y x!=y

Vergleichende Operatoren. Kleiner; größer; kleiner gleich; größer gleich; gleich; ungleich

x&y x|y x^y Bitweise Operatoren. AND; OR; XOR

x&&y x||y Logische Operatoren. AND; OR

x=y x*=y x/=y x%=y x+=y x-=y x<<=y x>>=y x&=y x|=y x^=y

Zuweisungsoperator;Zusammengesetzte Zuweisungsoperatoren, erklärt anhand des Operators *=: x*=y ist gleichbedeutend mit x=x*y

Tabelle 1.3: Binäre Operatoren in C

Symbol Bedeutung

Tabelle 1.2: Unäre Operatoren in C (Forts.)

8485-3.book Page 22 Friday, July 18, 2008 1:43 PM

Grundlegende Konzepte

Eine praktische Einführung in C 23

Beispiel

Mehrere Zuweisungsoperatoren arbeitet der Compiler von rechts nach links ab, alsowertet er zuerst a=2 aus, und dann b=a. Die Variablenwerte sind also: a=2; b=2; c=3; d=103.

1.2.3 Aufbau der C-Programme

Ein C-Programm hat den folgenden Aufbau:

� Präprozessor-Anweisungen (oder -Direktiven)

� Globale Deklarationen

� Funktionen

Präprozessor-Direktiven

In der Regel beginnt ein C-Programm mit Präprozessor-Anweisungen, die verarbeitetwerden, bevor das Programm kompiliert wird. Abgearbeitet werden sie vom Präprozes-sor, der automatisch vor der Übersetzung ausgeführt wird.

Diese Direktiven erfüllen verschiedene Aufgaben und beginnen immer mit einem #:

Im ersten Fall wird die angegebene Datei im aktuellen Ordner gesucht und danach inden für include definierten Standard-Verzeichnissen. Im zweiten Fall wird zuerst in denStandard-Ordnern gesucht und danach in den aktuellen. Header-Dateien (auch Biblio-theken genannt) enthalten C-Code mit Definitionen von Typen und Funktionen, denman im eigenen Programm nutzen kann, denn der Präprozessor kopiert den Inhalt derHeader-Datei in den Quelltext. Hier die meistverwendeten Bibliotheken:

� stdio.h und io.h für das Einlesen und Ausgeben von Daten

� stdlib.h und math.h für numerische Verarbeitungen

� ctype.h für Zeichenverarbeitung

� string.h und mem.h für Zeichenketten und Speicherzonen

� stdlib.h, alloc.h und malloc.h für Speicherallokation

Symbolische Konstanten (benannte Konstanten)

Der Präprozessor ersetzt im Quellcode jedes Vorkommen des Namens durch die Zei-chensequenz.

int a, b, c, d;b=a=2, c=a+1, d=c+100;

#include "DateiName"#include <DateiName>

#define Name Zeichensequenz

8485-3.book Page 23 Friday, July 18, 2008 1:43 PM

1 – Die Programmiersprache C im Überblick

24

Beispiel

Globale Deklarationen

Alle Datentypen und Variablen, die man global deklariert, stehen an jeder Stelle des Pro-gramms zur Verfügung, d.h. sie sind dort bekannt.

Funktionen

In C gibt es zwei Arten von Funktionen. Funktionen, die einen Wert zurückgeben, undFunktionen, die nichts zurückgeben. Der Aufbau einer Funktion sieht folgendermaßenaus:

Alles, was in eckigen Klammern steht, ist optional. Natürlich macht es wenig Sinn, eineFunktion zu schreiben, die keine Anweisungen ausführt.

Jedes Programm besteht mindestens aus der Funktion main(), der sogenannten Haupt-funktion, die die Anweisungen enthält, die auf alle Fälle ausgeführt werden. Innerhalbvon main() ruft man dann weitere Funktionen auf, wenn nötig.

Für jede Funktion gilt:

� Die runden Klammern nach dem Funktionsnamen sind obligatorisch, auch wenn eskeine formalen Parameter gibt.

� Wenn es keine formalen Parameter gibt, kann man entweder Funktionsname() oderFunktionsname(void) schreiben. void bedeutet leerer Typ.

� Liefert eine Funktion nichts zurück, schreibt man void Funktionsname(). Denn wennman den Datentyp einfach weglässt, wird er automatisch auf int gesetzt.

� Als Funktionskopf bezeichnet man den Abschnitt vom Beginn der Funktion bis vordie erste geschweifte Klammer.

� Den Teil zwischen und inklusive den geschweiften Klammern nennt man Funktions-körper. Die geschweiften Klammern sind auch dann anzugeben, wenn nichts zwi-schen ihnen steht.

#define MAX 5000 /* MAX wird überall in der Datei durch 5000 ersetzt*/

[DatenTyp] Funktionsname([Liste der Formalparameter])[Deklaration der Parameter]{ [Deklaration der lokalen Variablen] [Anweisung]; [Anweisung]; …}

8485-3.book Page 24 Friday, July 18, 2008 1:43 PM

Grundlegende Konzepte

Eine praktische Einführung in C 25

1.2.4 Anweisungen

Nun sehen wir uns die grundlegenden C-Anweisungen an. Sie haben sequenziellen,alternativen oder wiederholenden Charakter.

Leere Anweisung

Sie besteht nur aus dem einzelnen Zeichen ‘;‘ und hat keinen Effekt.

Ausdrucksanweisungen

Jede Ausdrucksanweisung muss in C mit einem ‘;‘ abgeschlossen werden. Es gibt mehrereArten davon, z.B. den Zuweisungsausdruck, den Funktionsaufruf oder den Ausdruck.

Beispiele

Zusammengesetzte Anweisung

Sie besteht aus Deklarationen gefolgt von Anweisungen in geschweiften Klammern. DieDeklarationen und/oder die Anweisungen könnten auch fehlen.

Die if-Anweisung

Sie erlaubt eine Verzweigung abhängig vom Resultat der Auswertung eines Ausdrucks.

Abbildung 1.1: Die zwei Formen der if-Anweisung

i++; /* Postinkrementierung; Ausdruck */max = a[i]; /* Zuweisungsausdruck */c = getchar(); /* Funktionsaufruf und Zuweisung */printf("Hallo"); /* Funktionsaufruf */

{ Deklarationen; Anweisungen;}

8485-3.book Page 25 Friday, July 18, 2008 1:43 PM

1 – Die Programmiersprache C im Überblick

26

Die erste Form:

Effekt

1. Evaluierung des Ausdrucks;

2. Wenn das Ergebnis ungleich 0 ist, wird Anweisung1 ausgeführt, ansonsten wird dienächste Anweisung im Programm ausgeführt.

3. Man fährt mit der nächsten Anweisung im Programm fort.

Die zweite Form:

Effekt

1. Evaluierung des Ausdrucks;

2. Wenn das Ergebnis ungleich 0 ist, wird Anweisung1 ausgeführt, ansonsten wirdAnweisung2 ausgeführt.

3. Man fährt mit der nächsten Anweisung im Programm fort.

Die while-Anweisung

Damit wiederholt man nach einem Eingangstest die Anweisung mit einer unbekanntenHäufigkeit.

Effekt

1. Der Ausdruck wird ausgewertet.

2. Wenn das Ergebnis ungleich 0 ist, wird die Anweisung ausgeführt und man machtmit Schritt 1 weiter.

3. Wenn das Ergebnis gleich 0 ist, wird mit der der Schleife folgenden Anweisung fort-gefahren.

Die do-while-Anweisung

Damit wiederholt man vor einem Ausgangstest die Anweisung mit einer unbekanntenHäufigkeit. Einmal wird die Anweisung mindestens ausgeführt.

if(Ausdruck) Anweisung1;

if(Ausdruck) Anweisung1;else Anweisung2;

while(Ausdruck) Anweisung;

do Anweisung while (Ausdruck);

8485-3.book Page 26 Friday, July 18, 2008 1:43 PM

Grundlegende Konzepte

Eine praktische Einführung in C 27

Effekt

1. Die Anweisung wird ausgeführt.

2. Der Ausdruck wird bewertet.

3. Wenn das Ergebnis nicht 0 ist, geht es mit Schritt 1 weiter.

4. Ist das Ergebnis 0, wird die der Schleife folgende Anweisung aufgerufen.

Die for-Anweisung

Das ist eine wiederholende Anweisung, bei der die Anzahl der Wiederholungen bekanntist.

A1, A2 und A3 sind Ausdrücke.

for(A1; A2; A3) ist der Kopf der Schleife. Die Anweisung, die wiederholt wird, heißtSchleifenkörper. A1 ist die Initialisierung, A2 die Abbruchbedingung und A3 die Reinitiali-sierung.

Beispiel

Effekt

1. i wird mit 1 initialisiert.

2. Die Abbruchbedingung i<10 wird geprüft.

3. Wenn das Ergebnis ungleich 0 ist, wird die Anweisung ausgeführt, wir geben denaktuellen Wert von i mit der Funktion printf() aus.

4. Anschließend wird i reinitialisiert, wir zählen i um 1 hoch und gehen zu Schritt 2.

5. Wenn das Ergebnis gleich 0 ist, wird die Schleife verlassen, und die Anweisung nachder Schleife wird ausgeführt.

continue-Anweisung

Sie ist nur innerhalb von Schleifen anwendbar.

Effekt

� In while- und do-while-Schleifen sorgt ein continue dafür, dass der Ausdruck wiederausgewertet wird. Gehen Sie ein bisschen zurück: bei while gelangen wir also zuSchritt 1, und bei do-while zu Schritt 2.

� In einer for-Schleife veranlasst ein continue die Reinitialisierung, oben im Beispielkäme man also zu Schritt 4.

for(A1; A2; A3) Anweisung;

for(i=1; i<10; i++) printf("i=%d", i);

continue;

8485-3.book Page 27 Friday, July 18, 2008 1:43 PM

1 – Die Programmiersprache C im Überblick

28

break-Anweisung

Sie wird verwendet, um eine switch-Anweisung oder eine Schleife sofort zu verlassen.

switch-Anweisung

Mit switch realisiert man eine Mehrfach-Verzweigung. Die könnte man auch mit ver-schachtelten if-Anweisungen zustande bringen, aber mit switch ist es übersichtlicher.

Alles zwischen eckigen Klammern ist optional.

Effekt

1. Der Ausdruck wird ausgewertet.

2. Das Ergebnis wird mit den Werten c1, c2, …, cn verglichen.

3. Wenn ein Vergleich positiv ist, werden die zugehörigen Anweisungen ausgeführt;kommt es zu keinem passenden Vergleich, werden die Anweisungen bei default aus-geführt, wenn es sie gibt.

Ist ein Vergleich mit ck positiv, werden also die Sequenzk_Anweisungen verarbeitet, undexistiert dahinter kein break, dann werden auch alle weiteren Anweisungen nacheinan-der ausgeführt (auch die default-Anweisung), und zwar ohne weitere Vergleiche, wennnicht vorher irgendwo auf ein break gestoßen wird. Sobald also ein Vergleich zutrifft,wird nicht mehr weiter verglichen.

1.2.5 Standardeingabe/-ausgabe

Die C-Funktionen dafür sind für die meisten Betriebssysteme identisch aufgebaut.

Formatierte Eingabe

Dafür verwendet man die Funktion scanf() mit der folgenden Syntax:

wobei format eine Konstante vom Typ Zeichenkette ist und angibt, in welcher Form dieEingabe abgespeichert wird. Die Liste_Variablenadressen beinhaltet, durch Kommasgetrennt, die Adressen der Variablen, die die Eingabedaten aufnehmen.

break;

switch(Ausdruck){ case c1: [Sequenz1_Anweisungen;] [break;] case c2: [Sequenz2_Anweisungen;] [break;] ... case cn: [Sequenzn_Anweisungen;] [break;] [default: [Sequenz_Anweisungen;]}

int scanf(const char *format [, Liste_Variablenadressen]);

8485-3.book Page 28 Friday, July 18, 2008 1:43 PM

Grundlegende Konzepte

Eine praktische Einführung in C 29

Effekt

1. Liest eine oder mehrere Eingaben zeichenweise ein, bis ein Leerzeichen oder ein Zei-lenvorschub gefunden wird.

2. Formatiert jede Eingabe gemäß dem spezifizierten Format in format.

3. Die Werte werden in den Adressen der gegebenen Variablen gespeichert.

Formatierte Ausgabe

Um Daten zu formatieren und auszugeben benutzt man in C die Bibliotheksfunktionprintf(). Die Ausgabe erfolgt auf die Standardausgabe und hat die folgende Syntax:

Effekt

1. Akzeptiert eine Liste mit Ausdrücken, die ausgewertet werden, und danach gemäßformat in Zeichenketten umgewandelt werden.

2. Schreibt diese Zeichenketten auf die Standardausgabe.

Wenn die Anzahl der in format gegebenen Argumente nicht mit der Liste der Ausdrückeübereinstimmt, kann es sein, dass der printf()-Aufruf Unerwünschtes ausgibt, insbeson-dere dann, wenn die Anzahl der Argumente kleiner ist als die Anzahl der Format-elemente. Das Resultat, das die Funktion zurückliefert, ist bei Fehlerfreiheit die Anzahlder ausgegebenen Bytes und im Fehlerfall die symbolische Konstante EOF (End Of File).

Die Formatelemente für die Funktionen printf() und scanf() sind in Tabelle 1.4 aufge-führt:

int printf(const char *format [, Liste_Ausdruecke]);

Für ganze Zahlen des Typs int

%i ganze Zahl im Basissystem 8, 10 oder 16; bei negativen Zahlen mit Vorzeichen

%d ganze Zahl in der Basis 10

%o Oktal ohne Vorzeichen und ohne führende Null

%x,%X Hexadezimal, ohne Vorzeichen in Klein- bzw. Großbuchstaben, man muss nicht ‘0x’ am Anfang schreiben.

%u Dezimal ohne Vorzeichen

Für Zeichen

%s Zeichenkette

%c ein einziges Zeichen

Für Gleitpunktzahlen

%e,%E

Reelle Zahl in der Form gggg.dddddd, wobei die Anzahl der Nachkommazahlen d die Genauigkeit darstellt (standardmäßig 6).

Tabelle 1.4: Formatelemente für die Funktionen printf() und scanf()

8485-3.book Page 29 Friday, July 18, 2008 1:43 PM

1 – Die Programmiersprache C im Überblick

30

Zusätzlich gibt es die Formatierungen %lf, %le, %lE, %lg und %lG für Gleitpunktzahlenvom Typ double.

1.2.6 Dateienoperationen

Die Eingabe/Ausgabe-Funktionen basieren auf dem Stream-Konzept. In C kann maneinem Stream verschiedene Elemente zuordnen: eine Datei auf der Platte, einen Terminal,ein CD-ROM-Laufwerk, eine Tastatur, einen Drucker, ein Modem oder eine Soundkarte.

Die Standardeingabe und -ausgabe von Dateien wird mit Hilfe von Funktionen realisiert,die in einem kompatiblen Format für die meisten Betriebssysteme vorliegen.

Öffnen einer Datei

Dafür gibt es die Funktion fopen():

Der Öffnungsmodus modus kann sein: "r" (Öffnen nur zum Lesen), "w" (Öffnen nur zumSchreiben), "a" (Öffnen nur zum Anfügen), "b" (Öffnen im Binärmodus) und "t" (Öffnenim Textmodus, das entspricht der Standardoption). Um zwei oder mehr Modi zu kombi-nieren, verwenden wir ein "+" am Ende.

Schließen einer Datei

Das erledigt die Funktion fclose():

Sie gibt 0 im Erfolgsfall zurück.

Alle offenen Dateien schließt die Funktion fcloseall():

%f Dezimal in der Form g.dddddd, wobei die Anzahl der Nachkommazahlen die Genauigkeit darstellt (standardmäßig 6). Man merkt, dass das Ganzteil nur eine Ziffer hat, anders bei den Formaten e und E, wo bis zu 4 Ziffern benutzt werden können.

%g,%G

Reelle Zahl, die die besonderen Zeichen, die den Wert nicht beeinflussen, entfernen, d.h. die 0-Zif-fern am Ende und den dezimalen Punkt, wenn die Zahl nur 0 als Nachkommazahlen hat.

Für Zeiger

%p Adresse

FILE *fopen(const char *Dateiname, const char *modus);

int fclose(FILE *stream);

int fcloseall(void);

Für ganze Zahlen des Typs int

Tabelle 1.4: Formatelemente für die Funktionen printf() und scanf()

8485-3.book Page 30 Friday, July 18, 2008 1:43 PM

Grundlegende Konzepte

Eine praktische Einführung in C 31

Prüfen, ob das Ende einer Datei erreicht ist

Hier hilft die Funktion feof() mit der Syntax

weiter. Sie liefert 0 zurück, wenn die Stelle, an der wir uns aktuell in der Datei befinden,nicht das Dateiende darstellt. Wenn wir das Ende erreicht haben, gibt feof() einen Wertungleich 0 zurück.

Funktionen für das Lesen/Schreiben

Für die Eingabe eines Zeichens gibt es die folgende Funktionen:

War das Lesen erfolgreich, wird der Wert des gelesenen Zeichens zurückgegeben,andernfalls die Konstante EOF.

Für die Ausgabe eines Zeichens zieht man diese Funktionen heran:

War die Ausgabe erfolgreich, wird das geschriebene Zeichen zurückgeliefert, andernfallsdie Konstante EOF.

Die Funktion für die Eingabe von Zeichenketten lautet fgets():

Dabei repräsentiert s die zu lesende Zeichenkette und n ihre maximale Länge.

Die Funktion fputs() gibt Zeichenketten aus:

Bei einem Fehler liefert sie EOF.

Hier die Syntax der Funktion fscanf() für das Lesen eines Stream:

Zeichen für Zeichen liest fscanf() eine Folge von Eingabefeldern, formatiert jedes Feldgemäß seinem Format und schreibt die Resultate in die jeweiligen Adressen der Variablen.

Um Daten formatiert aus einem Stream auszugeben, nutzt man die Funktion fprinf():

int feof(FILE *stream)

int fgetc(FILE *stream);int getc(FILE *stream);

int fputc(int c, FILE *stream);int putc(int c, FILE *stream);

int fgets(char *s, int n, FILE *stream);

int fputs(const char *s, FILE *f);

int fscanf(FILE *stream, const char *format[, Variableadresse1, ...]);

8485-3.book Page 31 Friday, July 18, 2008 1:43 PM

1 – Die Programmiersprache C im Überblick

32

Sie erwartet eine Liste mit Ausdrücken, die gemäß den Formatelementen der gegebenenZeichenkette formatiert sind und gibt die Daten in die Datei aus.

1.2.7 Neue Datentypen: struct, enum, union

struct

Eine Struktur ermöglicht es, mehrere Daten zu gruppieren, zum Beispiel den Namenund das Alter einer Person. Mit dem Operator "." greift man auf die Elemente einerStruktur zu.

Beispiele

Am zweiten Beispiel erkennen wir, dass eine Struktur Bestandteil einer anderen Struktursein kann.

enum und typedef

Lassen Sie uns mit einem Beispielprogramm anfangen:

int fprintf (FILE *stream, const char* format [, argument, ...] );

Datentyp struct complexDeklaration, Verwendung

Datentyp struct persDatentyp struct angestellter

struct complex{ double re; double im;}…struct complex z;…z.re = 5.45;z.im = -7.89;

struct pers{ char *name; int alter; };struct angestellter{ struct pers p; long gehalt; int firmenzugehoerigkeit;}...struct angestellter a;a.p.name = “Maia Ionescu”;a.p.alter = 34;a.gehalt = 60000;a.firmenzugehoerigkeit = 3;

Tabelle 1.5: Beispiele für Verwendung der struct

#include <stdio.h>

enum farben {ROT, GELB, GRUEN, BLAU, VIOLETT, ANZAHL_FARBEN};

8485-3.book Page 32 Friday, July 18, 2008 1:43 PM