Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag,...

60
Ulrich Kaiser, Christoph Kecher C/C++

Transcript of Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag,...

Page 1: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Ulrich Kaiser, Christoph Kecher

C/C++

839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Page 2: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Auf einen Blick

1 Einige Grundbegriffe ..................................................................... 21

2 Einführung in die Programmierung ............................................... 35

3 Ausgewählte Sprachelemente von C ............................................. 43

4 Arithmetik ..................................................................................... 73

5 Aussagenlogik ............................................................................... 97

6 Elementare Datentypen und ihre Darstellung ............................... 129

7 Modularisierung ............................................................................ 181

8 Zeiger und Adressen ...................................................................... 253

9 C-Referenz (Teil 1) ......................................................................... 271

10 Kombinatorik ................................................................................ 315

11 Leistungsanalyse und -messung von Algorithmen ........................ 349

12 Sortierverfahren ............................................................................. 395

13 Datenstrukturen ............................................................................ 441

14 C-Referenz (Teil 2) ......................................................................... 497

15 Ausgewählte Datenstrukturen ...................................................... 519

16 Elemente der Graphentheorie ....................................................... 613

17 Projekt 2D-Grafikprogrammierung ............................................... 701

18 C++-Referenz (Teil 1) ..................................................................... 703

19 Objektorientierte Programmierung ............................................... 743

20 Klassen in C++ ............................................................................... 759

21 Vererbung in C++ ........................................................................... 823

22 C++-Referenz (Teil 2) ..................................................................... 893

23 Die C++-Standard-Library ............................................................. 983

24 Projekt: 3D-Grafikprogrammierung .............................................. 1077

Anhang ........................................................................................... 1079

Lösungen ....................................................................................... 1083

839.book Seite 3 Dienstag, 9. September 2008 11:49 11

Page 3: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

5

Inhalt

Vorwort ................................................................................................. 17Danksagung ........................................................................................... 18Vorwort zur zweiten Auflage .................................................................. 19Vorwort zur vierten Auflage ................................................................... 20

1 Einige Grundbegriffe ................................................................ 21

1.1 Algorithmus ................................................................................. 231.2 Datenstruktur .............................................................................. 271.3 Programm .................................................................................... 291.4 Aufgaben ..................................................................................... 32

2 Einführung in die Programmierung .......................................... 35

2.1 Die Programmierumgebung ......................................................... 402.1.1 Der Editor ..................................................................... 402.1.2 Der Compiler ................................................................ 412.1.3 Der Linker ..................................................................... 422.1.4 Der Debugger ............................................................... 42

3 Ausgewählte Sprachelemente von C ....................................... 43

3.1 Programmrahmen ........................................................................ 433.2 Zahlen ......................................................................................... 443.3 Variablen ..................................................................................... 443.4 Operationen ................................................................................ 46

3.4.1 Zuweisungsoperationen ................................................ 463.4.2 Rechenoperationen ....................................................... 473.4.3 Vergleichsoperationen .................................................. 49

3.5 Kommentare ................................................................................ 493.6 Elementare Ein-/Ausgabe ............................................................. 50

3.6.1 Bildschirmausgabe ........................................................ 503.6.2 Tastatureingabe ............................................................ 52

3.7 Kontrollfluss ................................................................................ 523.7.1 Bedingte Befehlsausführung .......................................... 533.7.2 Wiederholte Befehlsausführung ..................................... 543.7.3 Verschachtelung von Kontrollstrukturen ........................ 60

3.8 Beispiele ...................................................................................... 613.8.1 Das erste C-Programm .................................................. 61

839.book Seite 5 Dienstag, 9. September 2008 11:49 11

Page 4: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

6

3.8.2 Das zweite C-Programm ................................................ 623.8.3 Das dritte C-Programm ................................................. 66

3.9 Aufgaben ..................................................................................... 69

4 Arithmetik ................................................................................ 73

4.1 Folgen ......................................................................................... 734.2 Summen ...................................................................................... 804.3 Produkte ..................................................................................... 874.4 Aufgaben ..................................................................................... 89

5 Aussagenlogik .......................................................................... 97

5.1 Aussagen ..................................................................................... 975.2 Logische Operatoren ................................................................... 985.3 Darstellung boolescher Funktionen .............................................. 1065.4 Vereinfachung boolescher Ausdrücke ........................................... 1115.5 Logische Operatoren in C ............................................................ 1195.6 Programmierbeispiele .................................................................. 120

5.6.1 Kugelspiel ..................................................................... 1205.6.2 Schaltung ...................................................................... 121

5.7 Aufgaben ..................................................................................... 124

6 Elementare Datentypen und ihre Darstellung ......................... 129

6.1 Zahlendarstellungen .................................................................... 1296.1.1 Dezimaldarstellung ....................................................... 1316.1.2 Dualdarstellung ............................................................. 1316.1.3 Oktaldarstellung ........................................................... 1336.1.4 Hexadezimaldarstellung ................................................ 134

6.2 Bits und Bytes .............................................................................. 1366.3 Skalare Datentypen in C ............................................................... 140

6.3.1 Ganze Zahlen ................................................................ 1416.3.2 Aufzählungstypen ......................................................... 1426.3.3 Gleitkommazahlen ........................................................ 1426.3.4 Buchstaben ................................................................... 143

6.4 Bit-Operationen ........................................................................... 1476.5 Programmierbeispiele mit Zeichen, Zahlen und

Bit-Operationen ........................................................................... 1506.5.1 Zeichensatz ................................................................... 1506.5.2 Bit-Editor ...................................................................... 152

839.book Seite 6 Dienstag, 9. September 2008 11:49 11

Page 5: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

7

6.6 Arrays und Zeichenketten ............................................................ 1566.6.1 Arrays ........................................................................... 1566.6.2 Zeichenketten ............................................................... 161

6.7 Programmierbeispiele mit Arrays und Strings ............................... 1676.7.1 Buchstaben zählen ........................................................ 1676.7.2 Matrixdruck .................................................................. 170

6.8 Aufgaben ..................................................................................... 173

7 Modularisierung ....................................................................... 181

7.1 Funktionen und Unterprogramme ................................................ 1817.2 Rekursion .................................................................................... 1887.3 Der Stack ..................................................................................... 1967.4 Globale, lokale und statische Variablen ........................................ 1997.5 Die C-Runtime-Library ................................................................. 201

7.5.1 Mathematische Funktionen ........................................... 2017.5.2 Konvertierungs- und Klassifizierungsroutinen ................ 2047.5.3 Stringbearbeitung ......................................................... 2067.5.4 Terminal I/O ................................................................. 2087.5.5 Dateioperationen .......................................................... 2137.5.6 Suchen und Sortieren .................................................... 2167.5.7 Variable Anzahl von Argumenten .................................. 2167.5.8 Ausnahme- und Fehlerbehandlung ................................ 2197.5.9 Assertions und Programmabbruch ................................. 2237.5.10 Freispeicherverwaltung und Speicherfunktionen ............ 2257.5.11 Zeit- und Datum-Funktionen ........................................ 2257.5.12 Prozess-Steuerung ......................................................... 226

7.6 Beispiele ...................................................................................... 2267.6.1 Das Damenproblem ...................................................... 2267.6.2 Labyrinth ...................................................................... 234

7.7 Aufgaben ..................................................................................... 240

8 Zeiger und Adressen ................................................................. 253

8.1 Zeigerarithmetik .......................................................................... 2578.2 Arrays und Zeiger ......................................................................... 2598.3 Funktionszeiger ........................................................................... 2628.4 Komplexe Variablendeklarationen ................................................ 2668.5 Aufgaben ..................................................................................... 268

839.book Seite 7 Dienstag, 9. September 2008 11:49 11

Page 6: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

8

9 C-Referenz (Teil 1) .................................................................... 271

9.1 Reservierte Wörter ...................................................................... 2719.2 Identifier ..................................................................................... 2719.3 Numerische Werte ....................................................................... 2729.4 Werte für Zeichen und Zeichenketten .......................................... 2739.5 Skalare Datentypen ...................................................................... 2749.6 Variablen ..................................................................................... 2749.7 Arrays .......................................................................................... 2799.8 Operatoren .................................................................................. 279

9.8.1 Arithmetische Operatoren ............................................. 2849.8.2 Vergleichsoperatoren .................................................... 2859.8.3 Logische Operatoren ..................................................... 2859.8.4 Bit-Operatoren ............................................................. 2869.8.5 Zugriffsoperatoren ......................................................... 2869.8.6 Auswertungsoperatoren ................................................ 2879.8.7 Datentyp-Operatoren ................................................... 2889.8.8 Ausdrücke und Zuweisungsoperatoren .......................... 289

9.9 Funktionen .................................................................................. 2939.10 Kontrollstrukturen ....................................................................... 295

9.10.1 Alternativen .................................................................. 2959.10.2 Sprungleisten ................................................................ 2969.10.3 Schleifen ....................................................................... 2989.10.4 Sprunganweisungen ...................................................... 300

9.11 Der Preprozessor ......................................................................... 3029.11.1 Includes ........................................................................ 3029.11.2 Symbolische Konstanten ............................................... 3039.11.3 Makros ......................................................................... 3059.11.4 Bedingte Compilierung .................................................. 306

9.12 Der Aufbau von Programmdateien ............................................... 3089.12.1 Header-Dateien ............................................................ 3099.12.2 Quellcode-Dateien ........................................................ 310

9.13 Einige Coding-Standards .............................................................. 311

10 Kombinatorik ........................................................................... 315

10.1 Kombinatorische Grundaufgaben ................................................. 31610.1.1 Permutationen mit Wiederholungen ............................. 31610.1.2 Permutationen ohne Wiederholungen ........................... 31710.1.3 Kombinationen ohne Wiederholungen .......................... 318

839.book Seite 8 Dienstag, 9. September 2008 11:49 11

Page 7: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

9

10.1.4 Kombinationen mit Wiederholungen ............................ 32010.1.5 Zusammenfassung ......................................................... 322

10.2 Kombinatorische Algorithmen ..................................................... 32410.2.1 Permutationen mit Wiederholungen ............................. 32510.2.2 Kombinationen mit Wiederholungen ............................ 32810.2.3 Kombinationen ohne Wiederholungen .......................... 33010.2.4 Permutationen ohne Wiederholungen ........................... 332

10.3 Beispiele ...................................................................................... 33510.3.1 Juwelenraub .................................................................. 33510.3.2 Geldautomat ................................................................. 340

10.4 Aufgaben ..................................................................................... 345

11 Leistungsanalyse und -messung von Algorithmen .................. 349

11.1 Leistungsanalyse .......................................................................... 35211.2 Leistungsmessung ........................................................................ 364

11.2.1 Überdeckungsanalyse .................................................... 36611.2.2 Performance-Analyse .................................................... 367

11.3 Mathematische Grundfunktionen ................................................. 36911.3.1 Floor und Ceiling .......................................................... 36911.3.2 Potenzfunktionen .......................................................... 37111.3.3 Exponentialfunktionen .................................................. 37211.3.4 Logarithmen ................................................................. 373

11.4 Laufzeitklassen ............................................................................. 37511.5 Beispiele ...................................................................................... 382

12 Sortierverfahren ....................................................................... 395

12.1 Bubblesort ................................................................................... 39612.2 Selectionsort ................................................................................ 39812.3 Insertionsort ................................................................................ 40112.4 Shellsort ...................................................................................... 40312.5 Quicksort ..................................................................................... 40712.6 Heapsort ...................................................................................... 41212.7 Leistungsanalyse .......................................................................... 418

12.7.1 Bubblesort .................................................................... 42012.7.2 Selectionsort ................................................................. 42112.7.3 Insertionsort ................................................................. 42312.7.4 Shellsort ........................................................................ 42412.7.5 Quicksort ...................................................................... 42512.7.6 Heapsort ....................................................................... 427

839.book Seite 9 Dienstag, 9. September 2008 11:49 11

Page 8: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

10

12.8 Vergleich und Bewertung ............................................................. 42812.9 Grenzen der Optimierung von Sortierverfahren ............................ 43412.10 Aufgaben ..................................................................................... 439

13 Datenstrukturen ....................................................................... 441

13.1 Datensequenz (struct) .................................................................. 44413.2 Datenalternative (union) .............................................................. 45113.3 Optimierung von Datenstrukturen ............................................... 45713.4 Zeiger und Datenstrukturen ......................................................... 46213.5 Dynamische Datenstrukturen ....................................................... 46513.6 Verkettete Datenstrukturen (Listen) ............................................. 47013.7 Die Freispeicherverwaltung .......................................................... 47413.8 Abstrakte Datentypen .................................................................. 478

13.8.1 Der abstrakte Datentyp »Stack« ..................................... 48013.8.2 Der abstrakte Datentyp »Queue« .................................. 485

13.9 Aufgaben ..................................................................................... 490

14 C-Referenz (Teil 2) .................................................................... 497

14.1 Einfache Strukturen ..................................................................... 49714.2 Zusammengesetzte Strukturen ..................................................... 50014.3 Zugriff auf Strukturen ................................................................... 502

14.3.1 Direkter Zugriff ............................................................. 50214.3.2 Indirekter Zugriff ........................................................... 503

14.4 Unions ......................................................................................... 50514.5 Datenstrukturen und Funktionen ................................................. 50614.6 Dynamische Datenstrukturen ....................................................... 50914.7 Zeiger in Datenstrukturen ............................................................ 51114.8 Typvereinbarungen ...................................................................... 51514.9 Bitfelder ...................................................................................... 516

15 Ausgewählte Datenstrukturen ................................................. 519

15.1 Aufgabenstellung ......................................................................... 51915.2 Schnittstellenvereinbarung ........................................................... 52115.3 Anwendungsprogramm ................................................................ 52415.4 Listen .......................................................................................... 530

15.4.1 Grundbegriffe ................................................................ 53015.4.2 Arrays oder Listen ......................................................... 53215.4.3 Speicherstruktur ............................................................ 533

839.book Seite 10 Dienstag, 9. September 2008 11:49 11

Page 9: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

11

15.4.4 Implementierung .......................................................... 53715.4.5 Test .............................................................................. 542

15.5 Bäume ......................................................................................... 54315.5.1 Grundbegriffe ................................................................ 54315.5.2 Traversierung von Bäumen ............................................ 54715.5.3 Speicherstruktur ............................................................ 55915.5.4 Implementierung .......................................................... 56215.5.5 Test .............................................................................. 569

15.6 Ausgeglichene Bäume .................................................................. 57015.6.1 Grundbegriffe ................................................................ 57115.6.2 Speicherstruktur ............................................................ 57515.6.3 Implementierung .......................................................... 57815.6.4 Test .............................................................................. 592

15.7 Hashtabellen ................................................................................ 59315.7.1 Grundbegriffe ................................................................ 59415.7.2 Speicherstruktur ............................................................ 59615.7.3 Implementierung .......................................................... 59915.7.4 Test .............................................................................. 602

15.8 Vergleich und Bewertung ............................................................. 60615.8.1 Speicherkomplexität ...................................................... 60615.8.2 Laufzeitmessungen ........................................................ 607

15.9 Aufgaben ..................................................................................... 612

16 Elemente der Graphentheorie .................................................. 613

16.1 Grundbegriffe .............................................................................. 61516.2 Darstellung von Graphen durch Datenstrukturen ......................... 62116.3 Ausgewählte graphentheoretische Probleme ................................ 627

16.3.1 Existenz von Wegen ...................................................... 62916.3.2 Kürzeste Wege .............................................................. 64916.3.3 Minimal spannende Bäume ........................................... 68216.3.4 Hamiltonsche Wege ...................................................... 688

17 Projekt 2D-Grafikprogrammierung .......................................... 701

18 C++-Referenz (Teil 1) ................................................................ 703

18.1 Schlüsselwörter ............................................................................ 70318.2 Operatoren .................................................................................. 70418.3 Kommentare ................................................................................ 70718.4 Datentypen, Datenstrukturen und Variablen ................................ 708

839.book Seite 11 Dienstag, 9. September 2008 11:49 11

Page 10: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

12

18.4.1 Automatische Typisierung von Aufzählungstypen .......... 70818.4.2 Automatische Typisierung von Strukturen ..................... 70818.4.3 Vorwärtsverweise auf Strukturen ................................... 70918.4.4 Der Datentyp bool ........................................................ 71018.4.5 Wide Character ............................................................. 71118.4.6 Const-Deklarationen ..................................................... 71218.4.7 Typumwandlungen ....................................................... 71318.4.8 Definition von Variablen ............................................... 71618.4.9 Referenzen .................................................................... 716

18.5 Funktionen und Operatoren ........................................................ 72218.5.1 Funktionsdeklarationen und Prototypen ........................ 72218.5.2 Default-Werte ............................................................... 72218.5.3 Inline-Funktionen ......................................................... 72418.5.4 Der Scope-Resolution-Operator .................................... 72518.5.5 Überladen von Funktionen ............................................ 72618.5.6 Überladen von Operatoren ........................................... 72818.5.7 Einbindung von C-Funktionen in C++-Programme ......... 730

18.6 Namensräume ............................................................................. 73218.6.1 Erstellung von Namensräumen ...................................... 73318.6.2 Verwendung von Namensräumen ................................. 73618.6.3 Der Namensraum std .................................................... 740

19 Objektorientierte Programmierung ......................................... 743

20 Klassen in C++ .......................................................................... 759

20.1 Aufbau von Klassen ..................................................................... 75920.1.1 Daten-Member ............................................................. 76120.1.2 Funktions-Member ....................................................... 76420.1.3 Konstruktoren und Destruktoren ................................... 772

20.2 Instantiierung von Klassen ........................................................... 77720.2.1 Automatische Instantiierung ......................................... 77920.2.2 Statische Instantiierung ................................................. 78120.2.3 Dynamische Instantiierung ............................................ 78220.2.4 Instantiierung von Arrays .............................................. 784

20.3 Friends ........................................................................................ 78520.4 Operatoren auf Klassen ................................................................ 78820.5 Ein- und Ausgabe in C++ ............................................................. 792

20.5.1 Bildschirmausgabe ........................................................ 793

839.book Seite 12 Dienstag, 9. September 2008 11:49 11

Page 11: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

13

20.5.2 Tastatureingabe ............................................................ 79620.5.3 Dateioperationen .......................................................... 797

20.6 Der this-Pointer ........................................................................... 79920.7 Beispiele ...................................................................................... 800

20.7.1 Menge .......................................................................... 80020.7.2 Bingo ............................................................................ 811

20.8 Aufgaben ..................................................................................... 818

21 Vererbung in C++ ..................................................................... 823

21.1 Geschützte Member .................................................................... 82921.2 Einfache Vererbung ..................................................................... 83221.3 Mehrfache Vererbung .................................................................. 83321.4 Instantiierung abgeleiteter Klassen ............................................... 83321.5 Erweiterung abgeleiteter Klassen ................................................. 83521.6 Überladen von Funktionen der Basisklasse ................................... 83621.7 Virtuelle Member-Funktionen ...................................................... 84121.8 Rein virtuelle Member-Funktionen .............................................. 84421.9 Statische Member ........................................................................ 84521.10 Beispiele ...................................................................................... 850

21.10.1 Würfelspiel ................................................................... 85021.10.2 Partnervermittlung ........................................................ 871

22 C++-Referenz (Teil 2) ................................................................ 893

22.1 Klassen und Instanzen ................................................................. 89322.2 Member ...................................................................................... 894

22.2.1 Daten-Member ............................................................. 89522.2.2 Funktions-Member ....................................................... 89622.2.3 Konstante Member ....................................................... 89922.2.4 Statische Member ......................................................... 90022.2.5 Operatoren ................................................................... 902

22.3 Zugriff auf Member ...................................................................... 90322.3.1 Zugriff von außen .......................................................... 90422.3.2 Zugriff von innen ........................................................... 90722.3.3 Der this-Pointer ............................................................ 91022.3.4 Zugriff durch Friends ..................................................... 911

22.4 Vererbung ................................................................................... 91322.4.1 Einfachvererbung .......................................................... 91322.4.2 Mehrfachvererbung ....................................................... 91722.4.3 Virtuelle Funktionen ..................................................... 922

839.book Seite 13 Dienstag, 9. September 2008 11:49 11

Page 12: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

14

22.4.4 Virtuelle Destruktoren ................................................... 92522.4.5 Rein virtuelle Funktionen .............................................. 92622.4.6 Dynamische Typüberprüfungen ..................................... 92822.4.7 Dynamische Typumwandlung ........................................ 929

22.5 Zugriffsschutz und Vererbung ...................................................... 93522.5.1 Geschützte Member ...................................................... 93622.5.2 Zugriff auf die Basisklasse .............................................. 93722.5.3 Modifikation von Zugriffsrechten .................................. 941

22.6 Der Lebenszyklus von Objekten ................................................... 94222.6.1 Konstruktion von Objekten ........................................... 94522.6.2 Destruktion von Objekten ............................................. 94822.6.3 Kopieren von Objekten ................................................. 94922.6.4 Instantiierung von Objekten .......................................... 95322.6.5 Implizite und explizite Verwendung von

Konstruktoren ............................................................... 95622.6.6 Initialisierung eingelagerter Objekte .............................. 95722.6.7 Initialisierung von Basisklassen ...................................... 96022.6.8 Initialisierung virtueller Basisklassen .............................. 96222.6.9 Instantiierungsregeln ..................................................... 964

22.7 Pointer to Member ...................................................................... 96622.8 Generische Klassen (Templates) ................................................... 97022.9 Ausnahmefallbehandlung ............................................................. 976

23 Die C++-Standard-Library ........................................................ 983

23.1 Iteratoren .................................................................................... 98423.2 Strings (string) ............................................................................. 987

23.2.1 Konstruktion ................................................................. 98823.2.2 Ein-/Ausgabe ................................................................ 98923.2.3 Zugriff ........................................................................... 98923.2.4 Manipulation ................................................................ 99223.2.5 Vergleich ...................................................................... 99723.2.6 Suchen .......................................................................... 99823.2.7 Speichermanagement .................................................... 999

23.3 Bitsets (bitset) .............................................................................. 100223.3.1 Konstruktion ................................................................. 100223.3.2 Zugriff ........................................................................... 100323.3.3 Manipulation ................................................................ 1004

23.4 Dynamische Arrays (vector) .......................................................... 100523.4.1 Konstruktion ................................................................. 100623.4.2 Zugriff ........................................................................... 1007

839.book Seite 14 Dienstag, 9. September 2008 11:49 11

Page 13: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

15

23.4.3 Iteratoren ...................................................................... 100823.4.4 Manipulation ................................................................ 100923.4.5 Speichermanagement .................................................... 1012

23.5 Beidseitige Warteschlangen (deque) ............................................ 101223.6 Listen (list) ................................................................................... 1014

23.6.1 Konstruktion ................................................................. 101423.6.2 Zugriff ........................................................................... 101523.6.3 Iteratoren ...................................................................... 101523.6.4 Manipulation ................................................................ 101723.6.5 Speichermanagement .................................................... 1027

23.7 Stacks (stack) ............................................................................... 102723.8 Warteschlangen (queue) .............................................................. 103023.9 Prioritätswarteschlangen (priority_queue) .................................... 103223.10 Geordnete Paare (pair) ................................................................. 103823.11 Mengen (set und multiset) ........................................................... 1040

23.11.1 Konstruktion ................................................................. 104123.11.2 Zugriff ........................................................................... 104223.11.3 Manipulation ................................................................ 1044

23.12 Relationen (map und multimap) .................................................. 104523.12.1 Konstruktion ................................................................. 104623.12.2 Zugriff ........................................................................... 104923.12.3 Manipulation ................................................................ 1049

23.13 Algorithmen der Standard-Library ................................................ 104923.13.1 Iterieren ........................................................................ 105223.13.2 Suchen und Finden ....................................................... 105323.13.3 Vergleichen ................................................................... 105523.13.4 Zählen ........................................................................... 105623.13.5 Kopieren ....................................................................... 105723.13.6 Tauschen ...................................................................... 105823.13.7 Ersetzen ........................................................................ 105923.13.8 Wertzuweisung ............................................................. 106123.13.9 Entfernen von Elementen .............................................. 106223.13.10 Reorganisation .............................................................. 106323.13.11 Sortieren ....................................................................... 106423.13.12 Binäre Suche ................................................................. 106523.13.13 Mischen ........................................................................ 106623.13.14 Mengenoperationen ..................................................... 106723.13.15 Heap-Algorithmen ........................................................ 106923.13.16 Minima und Maxima ..................................................... 107023.13.17 Lexikografische Ordnung und Permutationen ................ 1071

23.14 Vererbung und virtuelle Funktionen in Containern ....................... 1073

839.book Seite 15 Dienstag, 9. September 2008 11:49 11

Page 14: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Inhalt

16

24 Projekt: 3D-Grafikprogrammierung ......................................... 1077

Anhang ........................................................................................... 1079

Lösungen ...................................................................................................... 1083Kapitel 1 ...................................................................................... 1085Kapitel 3 ...................................................................................... 1103Kapitel 4 ...................................................................................... 1123Kapitel 5 ...................................................................................... 1155Kapitel 6 ...................................................................................... 1169Kapitel 7 ...................................................................................... 1195Kapitel 8 ...................................................................................... 1245Kapitel 10..................................................................................... 1253Kapitel 12..................................................................................... 1273Kapitel 13..................................................................................... 1277Kapitel 15..................................................................................... 1305Kapitel 20..................................................................................... 1315

Index ........................................................................................................... 1333

839.book Seite 16 Dienstag, 9. September 2008 11:49 11

Page 15: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

21

1 Einige Grundbegriffe

Einem Kochbuch entnehmen wir das folgende Rezept zur Herstellung eines soge-nannten Pharisäers:

Das Rezept gliedert sich in zwei Teile. Im ersten Teil werden die erforderlichenZutaten genannt, und im zweiten Teil wird ein Verfahren beschrieben, nach demman aus den Zutaten das gewünschte Getränk herstellen kann. Die beiden Teilesind wesentlich verschieden und gehören doch untrennbar zusammen. Ohne Zu-taten ist die Zubereitung nicht durchführbar, und ohne Zubereitung bleiben dieZutaten ungenießbar. Zu beachten ist auch, dass sich der Autor bei der Erstellungdes Rezepts einer bestimmten Fachsprache (Essl., cl, Sahne steif schlagen, aufbrü-hen) bedient. Ohne diese Fachsprache wäre die Anleitung wahrscheinlich weit-schweifiger, umständlicher und vielleicht sogar missverständlich. Die Verwen-dung einer Fachsprache setzt allerdings voraus, dass sich Autor und Leser des Re-zepts zuvor (ausgesprochen oder unausgesprochen) auf eine gemeinsameTerminologie verständigt haben.

Wir übertragen dieses Beispiel in unsere Welt – die Welt der Datenverarbeitung:

� Die Zutaten für das Rezept sind die Daten bzw. Datenstrukturen, die wir ver-arbeiten wollen.

� Die Zubereitungsvorschrift ist ein Algorithmus1, der festlegt, wie die Daten zuverarbeiten sind.

Zutaten:1/2 l heißer Kaffee1/4 l Sahne2 Essl. Zucker4 Schnapsgläser 54%iger Rum (8 cl)

Zubereitung:Den Kaffee aufbrühen und warmhalten. 4 Tassen mit heißem Wasser vorwär-men. Inzwischen die Sahne steif schlagen. Das Wasser aus den Tassen gießen,die Tassen abtrocknen und in jede Tasse 1–2 Teelöffel Zucker geben. Je 1Schnapsglas Rum darüber gießen und mit dem Kaffee auffüllen. Die Schlag-sahne als Haube auf jede Tasse Pharisäer setzen.

1. Dieser Begriff geht zurück auf Abu Jafar Muhammad Ibn Musa Al-Khwarizmi, der alsBibliothekar des Kalifen von Bagdad um 825 ein Rechenbuch verfasste und dessen Namein der lateinischen Übersetzung von 1200 als »Algorithmus« angegeben wurde.

839.book Seite 21 Dienstag, 9. September 2008 11:49 11

Page 16: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

22

Einige Grundbegriffe1

� Das Rezept ist ein Programm, das alle Datenstrukturen (Zutaten) und Algorith-men (Zubereitungsvorschriften) zum Lösen der gestellten Aufgabe (Erstellendes Gerichts) enthält.

� Die gemeinsame Terminologie, in der sich Autor und Leser des Rezepts ver-ständigen, ist eine Programmiersprache, in der das Programm geschriebenist. Die Programmiersprache muss dabei in der Lage sein, alle bezüglich derZutaten und der Zubereitung bedeutsamen Informationen zweifelsfrei zuübermitteln.

� Die Küche ist die technische Infrastruktur zur Umsetzung von Rezepten inschmackhafte Gerichte und ist vergleichbar mit einem Computer, seinem Be-triebssystem und den benötigten Entwicklungswerkzeugen.

� Der Koch übersetzt das Rezept in einzelne Arbeitsschritte in der Küche. Übli-cherweise geht ein Koch in zwei Schritten vor. Im ersten Schritt bereitet er dieZutaten einzeln und unabhängig voneinander vor (z.B. Kartoffeln kochen), umdie Einzelteile dann in einem zweiten Schritt zusammenzufügen und abzu-schmecken. In der Datenverarbeitung sprechen wir in diesem Zusammenhangvon Compiler und Linker.

� Das fertige Gericht ist das lauffähige Programm, das vom Benutzer (Esser) an-gewandt (verzehrt) werden kann.

Nur, welche Rolle spielen wir in diesem Szenario? Sollte für uns kein Platz vorge-sehen sein? Wir suchen uns die interessantesten Aufgaben aus:

� Wir sind Autoren, die sich neue, schmackhafte Gerichte für unterschiedlicheAnlässe ausdenken und Rezepte bzw. Kochbücher mit den besten Kreationenveröffentlichen.

� Gelegentlich probieren wir auch einen Pharisäer, um uns an unseren eigenenSchöpfungen zu berauschen und um festzustellen, ob die Speise gelungen ist.

Was müssen wir lernen, um unsere Rolle ausfüllen zu können?

� Wir müssen die Sprache beherrschen, in der Rezepte formuliert werden.

� Wir müssen einen Überblick über die üblicherweise verwendeten Zutaten,deren Eigenschaften und Zubereitungsmöglichkeiten haben.

� Wir müssen einen Vorrat an Standard-Zubereitungsverfahren bzw. Rezeptenabrufbereit im Kopf haben.

� Wir müssen wissen, welche Zutaten oder Verfahren miteinander harmonierenund welche nicht.

� Wir müssen wissen, was in einer Küche üblicherweise an Hilfsmitteln vorhan-den ist und wie bzw. wozu diese Hilfsmittel verwendet werden.

839.book Seite 22 Dienstag, 9. September 2008 11:49 11

Page 17: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

23

Algorithmus 1.1

� Bei anspruchsvolleren Gerichten müssen wir wissen, in welcher Reihenfolgeund mit welchem Timing die Einzelteile zuzubereiten sind und wie die einzel-nen Aufgaben verteilt werden müssen, damit alles zeitgleich serviert werdenkann.

� Wir müssen auch wissen, worauf ein potentieller, späterer Esser Wert legt undworauf nicht. Dies ist besonders wichtig, wenn wir Rezepte für einen ganz be-sonderen Anlass erstellen.

Letztlich wollen wir komplette Festmenüs und deren Speisefolge komponierenund benötigen dazu eine Mischung aus Phantasie, Kreativität, logischer Strenge,Ausdauer und Fleiß, wie sie auch ein guter Komponist oder Architekt benötigt.

Zurück zu den Grundbegriffen der Informatik. Wir haben informell die Begriffe

� Datenstruktur,

� Algorithmus und

� Programm

eingeführt und dabei bereits erkannt, dass diese Begriffe untrennbar zusammen-gehören und eigentlich nur unterschiedliche Facetten ein und desselben Themen-komplexes sind.

� Algorithmen arbeiten auf Datenstrukturen. Algorithmen ohne Datenstruktu-ren sind leere Formalismen.

� Datenstrukturen benötigen Algorithmen, die auf ihnen operieren und sie da-mit zum »Leben« erwecken.

� Programme realisieren Datenstrukturen und Algorithmen. Algorithmen undDatenstrukturen sind zwar ohne Programme denkbar, aber viele Datenstruktu-ren und Algorithmen wären ohne Programmierung allenfalls von akademi-schem Interesse.

In einem ersten Wurf versuchen wir, die Begriffe »Algorithmus«, »Datenstruktur«und »Programm« einigermaßen exakt zu erfassen.

1.1 Algorithmus

Um unsere noch sehr vage Vorstellung von einem Algorithmus zu präzisieren,starten wir mit einer Definition:

Ein Algorithmus ist eine endliche Menge von genau beschriebenen Anwei-sungen, die unter Benutzung von vorgegebenen Anfangsdaten in einer genaufestgelegten Reihenfolge auszuführen sind, um die Lösung eines Problems inendlich vielen Schritten zu ermitteln.

839.book Seite 23 Dienstag, 9. September 2008 11:49 11

Page 18: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

24

Einige Grundbegriffe1

Bei dem Begriff »Algorithmus« denkt man heute sofort an »Programmierung«.Das war nicht immer so. In der Tat gab es Algorithmen schon lange, bevor manauch nur entfernt an Programmierung dachte. Bereits im antiken Griechenlandwurden Algorithmen zur Lösung mathematischer Probleme formuliert, so zumBeispiel der Euklidische Algorithmus zur Bestimmung des größten gemeinsamenTeilers zweier Zahlen oder das sogenannte Sieb des Eratosthenes zur Bestimmungaller Primzahlen unterhalb einer vorgegebenen Schranke.2

Ihnen ist der Algorithmus zur schrittweisen Berechnung des Quotienten zweierZahlen schon lange vertraut. Um beispielsweise 84 durch 16 zu dividieren, gehtman wie folgt vor:

Wenn wir versuchen, dieses Verfahren im Detail zu beschreiben, finden wir allein der obigen Definition genannten Elemente wieder:

Problem:

Berechne den Quotienten zweier natürlicher Zahlen!

Anfangsdaten:

z = Zähler (z ≥ 0),n = Nenner (n > 0) unda = Anzahl der zu berechnenden Nachkommastellen.3

Anweisungen:

1. Bestimme die größte ganze Zahl x mit nx ≤ z! Dies ist der Vorkomma-Anteil der gesuchten Zahl.

2. Zur Bestimmung der Nachkommastellen fahre wie folgt fort:

2.1 Sind noch Nachkommastellen zu berechnen (d.h. a > 0)? Wennnein, dann beende das Verfahren!

2.2 Setze z = 10(z-nx)!

2.3 Ist z = 0, so beende das Verfahren!

2. Eukleides von Alexandria (um 300 vor Chr.) und Erathostenes von Kyrene (um 200 vorChr.).

84:16=5,2580403280800

3. Anfänglich ist a die Anzahl der zu berechnenden Nachkommastellen. Im Verfahren ver-wenden wir a als die Anzahl der noch zu berechnenden Nachkommastellen. Wir werdenden Wert von a in jedem Verfahrensschritt herunterzählen, bis a = 0 ist und keine Nach-kommastellen mehr zu berechnen sind.

839.book Seite 24 Dienstag, 9. September 2008 11:49 11

Page 19: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

25

Algorithmus 1.1

2.4 Bestimme die größte ganze Zahl x mit nx ≤ z! Dies ist die nächsteZiffer.

2.5 Jetzt ist eine Ziffer weniger zu bestimmen. Vermindere also den Wertvon a um 1 und fahre anschließend bei 2.1 fort!

Die einzelnen Anweisungen und ihre Abfolge können wir uns durch ein soge-nanntes Flussdiagramm veranschaulichen. In einem solchen Diagramm werdenalle beim Ablauf des Algorithmus möglicherweise vorkommenden Wege unterVerwendung bestimmter Symbole grafisch beschrieben. Die dabei zulässigenSymbole sind in einer Norm (DIN 66001) festgelegt. Von den zahlreichen in derNorm festgelegten Symbolen wollen wir hier nur einige einführen:

Mit diesen Symbolen können wir den zuvor nur sprachlich beschriebenen Algo-rithmus auch grafisch darstellen, wenn wir zusätzlich die Abfolge der einzelnenOperationen durch Richtungspfeile kennzeichnen.

Start/Ende des Algorithmus

Ein-/Ausgabe

Allgemeine Operation

Verzweigung

Ende

Eingabe: z, n, a

Start

x = größte ganze Zahlmit nx ≤ z

Ausgabe: "Ergebnis = x."

z = 10 (z - nx)

z = 0? ja

x = größte ganze Zahlmit nx ≤ z

Ausgabe: "x"

a = a-1

ja

nein

nein

1

2.2

2.3

2.4

2.5

a > 0?

2.1

839.book Seite 25 Dienstag, 9. September 2008 11:49 11

Page 20: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

26

Einige Grundbegriffe1

In der vorherigen Grafik können wir den Ablauf des Algorithmus für konkreteAnfangswerte »mit dem Finger« nachfahren und erhalten so eine recht gute Vor-stellung von der Dynamik des Verfahrens.

Wir wollen den Divisionsalgorithmus anhand des Flussdiagramms für konkreteDaten (z=84, n=16, a=4) Schritt für Schritt durchführen. Mehrfach durchlau-fene Teile zeichnen wir dabei entsprechend oft, nicht durchlaufene Pfade lassenwir weg.

Als Ergebnis erhalten wir die Ausgabe "5.25". Wir sehen, dass der Algorithmusgewisse Verfahrensschritte (z.B. 2.1) mehrfach, allerdings mit verschiedenen Da-ten durchläuft. Die Daten steuern letztlich den konkreten Ablauf des Algorith-mus. Das Verfahren zeigt im Ablauf eine gewisse Regelmäßigkeit – um nicht zusagen Monotonie. Gerade solche monotonen Aufgaben würde man sich gern von

Eingabe:z=84, n=16, a=4

Start

x = größte ganze Zahlmit 16x ≤ 84 = 5

Ausgabe: "5."

z = 10 (84 - 16*5) = 40

z = 0 ? Ende

x = größte ganze Zahlmit 16x ≤40 = 2

Ausgabe: "2"

a = 4-1 = 3

a > 0 ?

1

2.2

2.3

2.4

2.5

z = 10 (80 -16*5) = 0

z = 0 ?

nein

ja

ja

1. Durchlauf 3. Durchlauf

a > 0 ?

ja

2.1

z = 10 (40 - 16*2) = 80

z = 0 ?

x = größte ganze Zahlmit 16x ≤ 80 = 5

Ausgabe: "5"

a = 3-1 = 2

a > 0 ?

nein

ja

2. Durchlauf

839.book Seite 26 Dienstag, 9. September 2008 11:49 11

Page 21: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

27

Datenstruktur 1.2

einer Maschine abnehmen lassen. Eine Maschine müsste natürlich jeden einzel-nen Verfahrensschritt »verstehen« können, um das Verfahren als Ganzes durch-führen zu können. Einige unserer Schritte (z.B. 2.2) erscheinen unmittelbar ver-ständlich, während andere (z.B. 2.4) ein gewisses mathematisches Vorverständnisvoraussetzen. Je nachdem, welche Eigenintelligenz man bei demjenigen (Menschoder Maschine) voraussetzt, der den Algorithmus durchführen soll, wird man anmanchen Stellen noch präziser formulieren und einen Verfahrensschritt gegebe-nenfalls in einfachere Teilschritte zerlegen müssen.

Festgehalten werden sollte noch, dass wir von einem Algorithmus gefordert ha-ben, dass er nach endlich vielen Schritten zu einem Ergebnis kommt (terminiert).Dies ist bei unserem Divisionsalgorithmus durch die Vorgabe der Anzahl der zuberechnenden Nachkommastellen sichergestellt, auch wenn in unserem konkre-ten Beispiel ein vorzeitiger Abbruch eintritt. Würden wir das Abbruchkriteriumfallenlassen, so würde unser Verfahren unter Umständen (z.B. bei der Berech-nung von 10:3) nicht abbrechen, und eine mit der Berechnung beauftragteMaschine würde endlos rechnen. Es ist zu befürchten, dass die Eigenschaft desTerminierens für manche Verfahren schwer oder vielleicht gar nicht nachzuwei-sen ist.

1.2 Datenstruktur

Wir wenden uns jetzt dem Begriff der »Datenstruktur« zu.

Eine Datenstruktur ist ein Modell, das die zur Lösung eines Problems benö-tigten Informationen (Ausgangsdaten, Zwischenergebnisse, Endergebnisse)enthält und für alle Informationen genau festgelegte Zugriffswege bereitstellt.

Auch Datenstrukturen hat es bereits lange vor der Programmierung gegeben, ob-wohl man hier mit einigem Recht sagen kann, dass die Theorie der Datenstruktu-ren erst mit der maschinellen Datenverarbeitung zur Blüte gekommen ist.

Als Beispiel betrachten wir ein Versandhaus, das seine Geschäftsvorfälle durchdrei Karteien organisiert. Die Kundenkartei enthält die personenbezogenen Da-ten aller Kunden. Die Artikelkartei enthält die Stammdaten und den Lagerbestandaller lieferbaren Artikel. In der Bestellkartei schließlich werden alle eingehendenBestellungen festgehalten.

839.book Seite 27 Dienstag, 9. September 2008 11:49 11

Page 22: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

28

Einige Grundbegriffe1

Ein einzelner Datensatz entspricht einer ausgefüllten Karteikarte. Auf jeder Kar-teikarte sind zwei Bereiche erkennbar. Links steht jeweils die Struktur der Daten,während rechts die konkreten Datenwerte stehen. Die Datensätze für Kunden,Artikel und Bestellungen sind dabei strukturell verschieden. Neben der Strukturder Karteikarten ist natürlich auch noch die Organisation der einzelnen Karteikäs-ten von Bedeutung. Wir stellen uns vor, dass die Kundendatei nach Kundennum-mern, die Artikeldatei nach Artikelnummern und die Bestelldatei nach Bestellda-tum sortiert ist. Darüber hinaus gibt es noch Querverweise zwischen den Daten-sätzen der verschiedenen Karteikästen. In der Bestelldatei finden wir auf jederKarteikarte beispielsweise Artikelnummern und eine Kundennummer. Die dreiKarteikästen mit ihrer Sortierung, der Struktur ihrer Karteikarten und der Quer-verweisstruktur bilden insgesamt die Datenstruktur. Beachten Sie, dass die kon-kreten Daten nicht zur Datenstruktur gehören. Die Datenstruktur legt nur die Or-ganisationsform der Daten fest, nicht jedoch die konkreten Datenwerte. Auf derDatenstruktur arbeiten dann gewisse Algorithmen (z.B. Kundenadresse ändern,Rechnung stellen, Artikel nachbestellen, Lieferung zusammenstellen usw.). DieEffizienz dieser Algorithmen hängt dabei ganz entscheidend von der Organisa-tion der Datenstruktur ab. Zum Beispiel ist die Frage: »Was hat der Kunde Müllerdem Unternehmen bisher an Umsatz gebracht?«, ausgesprochen schwer zu beant-worten. Dazu muss man zunächst in der Kundendatei die Kundennummer desKunden Müller finden. Dann muss man alle Bestellungen durchsuchen, um fest-zustellen, ob die Kundennummer von Müller dort vorkommt, und schließlichmuss man dann noch die Preise der in den betroffenen Bestellungen vorkommen-den Artikel in der Artikeldatei suchen und aufsummieren. Die Frage: »Welche Ar-tikel in welcher Menge sind im letzen Monat bestellt worden?«, lässt sich mit die-ser Datenstruktur erheblich einfacher beantworten.

Kunde: 1234Datum: 15.09.1996Bestellung

Artikel: P23-914/6Anzahl: 1Artikel: ...Anzahl: ...

. ..

Bestellung

Bezeichnung: DruckerArt. Nr.: P23-914/6Lagerbestand: 43EK-Preis: 375.00VK-Preis: 498.00

ArtikelKundennummer: 1234Name: MeierVorname: OttoAdresse: ...

Kunde

839.book Seite 28 Dienstag, 9. September 2008 11:49 11

Page 23: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

29

Programm 1.3

Das Problem, eine »bestmögliche« Organisationsform für eine Datenstruktur zufinden, ist im Allgemeinen unlösbar, weil man dazu in der Regel gegenläufige Op-timierungsaspekte in Einklang bringen muss. Man könnte zum Beispiel bei derobigen Datenstruktur den Verbesserungsvorschlag machen, alle Kundendaten mitauf der Bestellkartei zu vermerken, um die Rechnungsstellung zu erleichtern. Da-durch erhöht sich dann aber der Aufwand, den man bei der Adressänderung ei-nes Kunden in Kauf zu nehmen hat. Die Erstellung von Datenstrukturen, die alleAlgorithmen eines bestimmten Problemfeldes wirkungsvoll unterstützen, ist eineausgesprochen schwierige Aufgabe, zumal man häufig zum Zeitpunkt der Festle-gung einer Datenstruktur noch gar nicht absehen kann, welche Algorithmen inZukunft mit den Daten dieser Struktur arbeiten werden.

Bei der Fülle der in der Praxis vorkommenden Probleme und Strukturen (Kun-dendaten, Geschäftsprozesse, Stücklisten technischer Bauteile, Versicherungsver-träge, Krankengeschichten, Konstruktionszeichnungen, Verdachtsflächen für Alt-lasten, Aktienkurse, ...) kann man natürlich nicht erwarten, dass man für alle (janicht einmal für die hier genannten) Beispiele passende Datenstrukturen bereit-stellen kann. Wir müssen lernen, typische, immer wiederkehrende Bausteine zuidentifizieren und zu beherrschen. Aus diesen Bausteinen werden wir dann kom-plexere, jeweils an ein bestimmtes Problem angepasste Strukturen aufbauen.

1.3 Programm

Ein Programm ist im Gegensatz zu einer Datenstruktur oder einem Algorithmusfür uns etwas sehr Konkretes – zumindest dann, wenn wir schon einmal ein Pro-gramm erstellt oder benutzt haben.

Ein Programm ist eine eindeutige, formalisierte Beschreibung von Algorith-men und Datenstrukturen, die durch einen automatischen Übersetzungspro-zess auf einem Computer ablauffähig ist.

Den zur Formulierung eines Programms verwendeten Beschreibungsformalis-mus bezeichnen wir als Programmiersprache.

Im Gegensatz zu einem Algorithmus fordern wir von einem Programm nicht ex-plizit, dass es terminiert. Viele Programme (z.B. ein Betriebssystem oder Pro-gramme zur Überwachung und Steuerung technischer Anlagen) sind auch so kon-zipiert, dass sie im Prinzip endlos laufen könnten.

Eine Programmiersprache muss nach unserer Definition Elemente zur exaktenBeschreibung von Datenstrukturen und Algorithmen enthalten. Programmier-sprachen dienen uns daher nicht nur zur Erstellung lauffähiger Programme, son-dern auch zur präzisen Festlegung von Datenstrukturen und Algorithmen.

839.book Seite 29 Dienstag, 9. September 2008 11:49 11

Page 24: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

30

Einige Grundbegriffe1

Eigentlich stellen wir gegensätzliche Forderungen an eine Programmiersprache.Sie sollte

� automatisch übersetzbar, d.h. maschinenlesbar und

� möglichst verständlich und leicht erlernbar, d.h. menschenlesbar

sein, und sie sollte darüber hinaus die maschinellen Berechnungs- und Verarbei-tungsmöglichkeiten eines Computers möglichst vollständig ausschöpfen. Maschi-nenlesbarkeit und Menschenlesbarkeit sind bei den heutigen Maschinenkonzep-ten unvereinbare Begriffe. Da die Maschinenlesbarkeit jedoch unverzichtbar ist,müssen zwangsläufig bei der Menschenlesbarkeit Kompromisse gemacht wer-den; Kompromisse, von denen Berufsgruppen wie Systemanalytiker oder Pro-grammierer leben.

Häufig teilt man Programmiersprachen in

� maschinenorientierte,

� universelle und

� spezielle

Sprachen ein.

Maschinenorientiert nennen wir Sprachen, die Annahmen über konkrete Merk-male einer Rechnerarchitektur (z.B. Adressierungsmöglichkeiten, Register, Stack,Prozessor-Status, Hardware-Interrupts) machen. Wir werden solche Sprachen imRahmen dieses Buches nicht betrachten.

Um die Frage nach der »Mächtigkeit« von Programmiersprachen zu beantworten,wurden in der theoretischen Informatik zahlreiche Berechnungs- bzw. Program-mierformalismen aufgestellt4. Es konnte gezeigt werden, dass diese Formalismenalle exakt die gleiche Klasse von Problemen lösen und damit von gleicher Mäch-tigkeit sind. Programmiersprachen dieser Mächtigkeit werden als universell be-zeichnet. Zu den universellen Programmiersprachen gehören u.a. Ada, Basic, C,C++, Cobol, Fortran, Java, Lisp, Modula-2, Pascal und Prolog. Diese Liste ließesich problemlos weiter fortsetzen. Universelle Sprachen stehen im Mittelpunktunserer Betrachtungen, auch wenn wir uns in konkreten Beispielen ausschließ-lich mit C bzw. C++ beschäftigen.

Manche Programmiersprachen geben die Universalität auf, um spezielle Pro-bleme effizienter oder komfortabler lösen zu können. Solche Sprachen bezeich-nen wir als spezielle Programmiersprachen. Beispiele sind etwa UIL zur Spezifi-kation von grafischen Benutzeroberflächen, SQL zur Arbeit mit relationalen Da-tenbanken oder die Kommandosprache zur Bedienung eines DOS-Systems.

4. Z.B. die »Turingmaschine«

839.book Seite 30 Dienstag, 9. September 2008 11:49 11

Page 25: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

31

Programm 1.3

Solche Sprachen sind oft rein deskriptiv (beschreibend) und enthalten keine ex-pliziten Steueranweisungen. Auch mit solchen Sprachen beschäftigen wir unshier nicht.

Die verschiedenen Programmiersprachen, die wir heute verwenden, haben sichnicht unabhängig voneinander entwickelt. Sie sind teilweise auseinander hervor-gegangen oder haben sich wechselseitig beeinflusst. Auf diese Weise entsteht ein»Stammbaum«, der für einige wichtige universelle Programmiersprachen in derfolgenden Grafik dargestellt ist:

Der Stammbaum zeigt die prägende Bedeutung, die Fortran und Algol für die Ent-wicklung der Programmiersprachen hatten. Einige eigenständige und für die In-formatik durchaus interessante Programmierkonzepte (z.B. Prolog) fristen bei derpraktischen Anwendung ein Schattendasein. Erwähnt werden sollte die beson-dere Bedeutung der Programmiersprache Cobol, die – oft für tot erklärt – im Be-reich der kommerziellen Software bei Banken und Versicherungen immer nochverwendet wird.

Alle hier aufgeführten Programmiersprachen sind im oben angesprochenen Sinnuniversell und daher gleich mächtig. Prinzipiell ist es daher egal, in welcher dieserSprachen wir unsere Programme formulieren. Die Entscheidung für die Verwen-dung von C/C++ in diesem Buch hat ausschließlich praktische Gründe. Insbeson-dere ist hier die hohe Verbreitung von C/C++ im Bereich der technischen Pro-grammierung zu nennen. Als Alternative zu C/C++ bietet sich Java an. Es ist je-doch festzustellen, dass C/C++ und Java so eng miteinander verwandt sind, dass

1950

1960

1970

1980

1990

Fortran

Cobol Algol

PL/1

Pascal

C

Simula

Smalltalk

Ada

C++Eiffel

Lisp

ML

Miranda

Prolog

BasicBCPL

Modula-2

Oberon

Java

2000

839.book Seite 31 Dienstag, 9. September 2008 11:49 11

Page 26: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

32

Einige Grundbegriffe1

Ihnen ein gegebenenfalls erforderlicher Umstieg von der einen auf die andereSprache nicht schwer fallen wird.

1.4 Aufgaben

A 1.1 Formulieren Sie Ihr morgendliches Aufsteh-Ritual vom Klingeln des We-ckers bis zum Verlassen des Hauses als Algorithmus. Berücksichtigen Siedabei auch verschiedene Wochentags-Varianten! Zeichnen Sie ein Fluss-diagramm!

A 1.2 Verfeinern Sie den Algorithmus zur Division zweier Zahlen aus Abschnitt1.1 so, dass er von jemandem, der nur Zahlen addieren, subtrahieren undder Größe nach vergleichen kann, durchgeführt werden kann! ZeichnenSie ein Flussdiagramm!

A 1.3 In unserem Kalender sind zum Ausgleich der astronomischen und der ka-lendarischen Jahreslänge in regelmäßigen Abständen Schaltjahre einge-baut. Zur exakten Festlegung der Schaltjahre dienen die folgenden Re-geln:

(1) Ist die Jahreszahl durch 4 teilbar, so ist das Jahr ein Schaltjahr.

Diese Regel hat allerdings eine Ausnahme:

(2) Ist die Jahreszahl durch 100 teilbar, so ist das Jahr kein Schaltjahr.

Diese Ausnahme hat wiederum eine Ausnahme:

(3) Ist die Jahreszahl durch 400 teilbar, so ist das Jahr doch ein Schaltjahr.

Formulieren Sie einen Algorithmus, mit dessen Hilfe man feststellenkann, ob ein bestimmtes Jahr ein Schaltjahr ist oder nicht!

A 1.4 Sie sollen eine unbekannte Zahl x (1 ≤ x ≤ 1000) erraten und habenbeliebig viele Versuche dazu. Bei jedem Versuch erhalten Sie die Rückmel-dung, ob die gesuchte Zahl größer, kleiner oder gleich der von Ihnen ge-ratenen Zahl ist. Entwickeln Sie einen Algorithmus, um die gesuchte Zahlmöglichst schnell zu ermitteln! Wie viele Versuche benötigen Sie bei Ih-rem Verfahren maximal?

A 1.5 Formulieren Sie einen Algorithmus, der prüft, ob eine gegebene Zahl einePrimzahl ist oder nicht!

A 1.6 Ihr CD-Ständer hat 100 Fächer, die fortlaufend von 1–100 nummeriertsind. In jedem Fach befindet sich eine CD. Formulieren Sie einen Algo-rithmus, mit dessen Hilfe Sie die CDs alphabetisch nach Interpreten sor-

839.book Seite 32 Dienstag, 9. September 2008 11:49 11

Page 27: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

33

Aufgaben 1.4

tieren können! Das Verfahren soll dabei auf den beiden folgenden Grund-funktionen basieren:

vergleiche(n,m)

Vergleiche die Interpreten der CDs in den Fächern n und m! Ergebnis:»richtig« oder »falsch« je nachdem, ob die beiden CDs in der richtigenoder falschen Reihenfolge im Ständer stehen.

tausche(n,m)

Tausche die CDs in den Fächern n und m!

A 1.7 Formulieren Sie einen Algorithmus, mit dessen Hilfe Sie die CDs in IhremCD-Ständer jeweils um ein Fach aufwärts verschieben können! Die dabeiam Ende herausgeschobene CD kommt in das erste Fach. Das Verfahrensoll nur auf der Grundfunktion tausche aus Aufgabe 1.6 beruhen.

A 1.8 Formulieren Sie einen Algorithmus, mit dessen Hilfe Sie die Reihenfolgeder CDs in Ihrem CD-Ständer umkehren können! Das Verfahren soll nurauf der Grundfunktion tausche aus Aufgabe 1.6 beruhen.

A 1.9 In einem Hochhaus mit 20 Stockwerken fährt ein Aufzug. Im Aufzug sind20 Knöpfe, mit denen man sein Fahrziel wählen kann, und auf jeder Etageist ein Knopf, mit dem man den Aufzug rufen kann. Entwickeln Sie einenAlgorithmus, der den Aufzug so steuert, dass alle Aufzugbenutzer gerechtbedient werden! Sie können dabei annehmen, dass der Aufzug über diefolgenden Befehle zur Fahrtsteuerung bzw. zum Auslesen der Bedienele-mente verfügt:

fahre(n)

Fahre das Stockwerk n an!

lade()

Lade oder entlade in dem zuletzt angefahrenen Stockwerk Fahrgäste!

pruefe(n)

Prüfe, ob Stockwerk n (innen oder außen) als Fahrziel gewählt wurde!Ergebnis: »ja« oder »nein«.

max()

Liefert die höchste Etage, die aktuell als Fahrziel (innen oder außen)gewählt wurde. Ergebnis: Etagennummer.

min()

Liefert die niedrigste Etage, die aktuell als Fahrziel (innen oder außen)gewählt wurde. Ergebnis: Etagennummer.

loesche(n)

Löscht Etage n als Fahrziel.

839.book Seite 33 Dienstag, 9. September 2008 11:49 11

Page 28: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

34

Einige Grundbegriffe1

A 1.10 Beim Schach gibt es ein einfaches Endspiel:

Versuchen Sie den Algorithmus für das Endspiel so zu formulieren, dassauch ein Nicht-Schachspieler die Spielstrategie versteht!

König und Turm gegen König

839.book Seite 34 Dienstag, 9. September 2008 11:49 11

Page 29: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Lösu

ngen

Lösungen

839.book Seite 1083 Dienstag, 9. September 2008 11:49 11

Page 30: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1085

Kapitel 1

Lösu

ngen

Kapitel 1

A 1.1 Formulieren Sie Ihr morgendliches Aufsteh-Ritual vom Klingeln des We-ckers bis zum Verlassen des Hauses als Algorithmus. Berücksichtigen Siedabei auch verschiedene Wochentags-Varianten! Zeichnen Sie ein Fluss-diagramm!

Vorüberlegung:

Natürlich haben wir alle unterschiedliche »Aufsteh-Rituale«, jedoch ist es hierwichtig, sich möglichst genaue Gedanken über den zeitlichen Ablauf des typi-schen Morgens zu machen. Sehr leicht werden Sie dabei erkennen, wie viele un-bewusste Entscheidungspfade ein auf den ersten Blick so simpler Vorgang wie dastägliche Aufstehen beinhaltet.

Lösungsteil 1 ( Algorithmus ):

1. Stelle den Wecker aus!

2. Ist der heutige Wochentag ein Samstag oder ein Sonntag, dann schlaf ruhigweiter!

Andernfalls fahre mit Punkt 3 fort!

3. Ist das Badezimmer gerade besetzt, dann warte solange, bis es frei wird!

3.1 Ist dies nicht der Fall, dann kannst Du jetzt duschen und Dich danach an-ziehen!

4. Ist das Frühstück von keinem anderen bereits vorbereitet worden, musst Du eswohl selbst tun!

4.1 Andernfalls kannst Du sofort Dein Frühstück zu Dir nehmen!

5. Ist das Badezimmer gerade besetzt, dann warte solange, bis es frei wird!

5.1 Ist dies nicht der Fall, dann kannst Du Dir nun Deine Zähne putzen!

6. Nun musst Du nur noch Deine Schuhe und Jacke anziehen,

6.1 die Schulsachen mitnehmen

6.2 und das Haus in Richtung Schule verlassen!

839.book Seite 1085 Dienstag, 9. September 2008 11:49 11

Page 31: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1086

Lösu

ngen

Lösungsteil 2 (Flussdiagramm)

A 1.2 Verfeinern Sie den Algorithmus zur Division zweier Zahlen aus Abschnitt1.1 so, dass er von jemandem, der nur Zahlen addieren, subtrahieren undder Größe nach vergleichen kann, durchgeführt werden kann! ZeichnenSie ein Flussdiagramm!

Vorüberlegung:

Zuallererst sollten wir uns genau den Algorithmus aus Abschnitt 1.1 anschauen.Das Ziel ist, die Stellen herauszufinden, an denen die obigen Bedingungen nichterfüllt werden. Wir suchen also die Anweisungen heraus, in denen andere Ope-

5

5.1

6

6.1

6.2

4

4.1

3

3.1

2

1

Start

Welcher Wochentag?

Wecker ausstellen

Anziehen

Frühstück fertig?

Frühstücken

Badezimmer besetzt?

Warten

Zähne putzen

Badezimmer besetzt ?

Warten

Duschen

Jacke und Schuhe anziehen

Schulsachen mitnehmen

Frühstück vorbereiten

Weiterschlafen

Haus verlassen

Montag bis Freitag Sam/Sonn

ja

nein

ja

ja

nein

nein

839.book Seite 1086 Dienstag, 9. September 2008 11:49 11

Page 32: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1087

Kapitel 1

Lösu

ngen

rationen als Addition, Division oder ein Vergleich verwendet werden. Diese wer-den wir dann so umformulieren, dass sie nur noch die in der Aufgabenstellungerlaubten Operationen verwenden.

Der ursprüngliche Algorithmus:

Problem:

Berechne den Quotienten zweier natürlicher Zahlen!

Anfangsdaten:

z = Zähler ( z ≥ 0 )n = Nenner ( n > 0 ) unda = Anzahl der zu berechnenden Nachkommastellen.

Anweisungen:

1. Bestimme die größte ganze Zahl x mit n·x ≤ z! Dies ist der Vorkommaanteilder gesuchten Zahl.

2. Zur Bestimmung der Nachkommastellen fahre wie folgt fort:

2.1 Sind noch Nachkommastellen zu berechnen (d. h. a > 0)? Wenn nein,dann beende das Verfahren!

2.2 Setze z = 10(z-n·x)!

2.3 Ist z = 0, so beende das Verfahren!

2.4 Bestimme die größte ganze Zahl x mit n·x ≤ z! Dies ist die nächste Ziffer.

2.5 Jetzt ist eine Ziffer weniger zu bestimmen. Vermindere also den Wert vona um 1 und fahre anschließend bei 2.1 fort!

Die Anweisungen 1 und 2.4 enthalten eine Division, denn um die geforderte Zahlx zu bestimmen, müssen wir die Operation x = z/n durchführen. Dies ist durchdie Aufgabenstellung nicht erlaubt. Um diese Anweisungen zu ersetzen, benöti-gen wir eine zusätzliche Variable y. Wir werden y solange um den Wert des Nen-ners n erhöhen, bis wir den Wert des Zählers z übertroffen haben.

Wir ersetzen diese Anweisungen also durch:

1. Um die größte Zahl x mit n·x ≤ z zu bestimmen, fahre wie folgt fort:

1.1 Setze x = 0 und y = n!

1.2 Ist y > z, so ist x der gesuchte Vorkommaanteil!

1.3 Ist dies nicht der Fall, dann setze x = x+1 und y = y+n und fahre mitPunkt 1.2 fort!

Die Anweisung 2.2 enthält zwei Multiplikationen: n·x und 10·Klammerinhalt.

839.book Seite 1087 Dienstag, 9. September 2008 11:49 11

Page 33: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1088

Lösu

ngen

Den Wert n·x können wir aus y berechnen. Unser y ist um den Wert des Nennersn zu hoch, denn wir mussten ihn solange erhöhen, bis wir über den Wert des Zäh-lers z hinausgekommen sind, also einmal zu viel. Deshalb können wir n·x ein-fach durch y-n ersetzen.

Die Multiplikation des Klammerinhalts mit 10 lassen wir verschwinden, indemwir den Klammerinhalt in einer Zwischenvariablen k speichern und ihn zehnmalin der Variable add aufaddieren. Wie oft wir schon addiert haben, zählen wir inder Variablen i mit.

Somit ergeben sich für die Anweisung 2.2 folgende Algorithmusanweisungen:

2.2 Setze add = 0 und i = 1!

2.3 Speichere den Klammerinhalt z–(y-n) in der Variablen k, setze alsok = z–(y-n)!

2.4 Solange die Zählvariable i ≤ 10 ist

2.4.1 Addiere k zu add und

2.4.2 Erhöhe den Wert von i um 1!

2.5 Setze z = add!

Der neue Algorithmus:

Problem:

Berechne den Quotienten zweier natürlicher Zahlen!

Anfangsdaten:

z = Zähler (z � 0)

n = Nenner (n > 0)a = Anzahl der zu berechnenden Nachkommastellen

i = Zählvariabley = Zwischenspeicher für n·xk = Zwischenspeicher für den Inhalt der ursprünglichen Klammer (z-n·x)add = Zwischenspeicher für die Aufaddierung des Klammerwertes

Anweisungen:

1. Um die größte Zahl x mit n·x ≤ z zu bestimmen, fahre wie folgt fort:

1.1 Setze x = 0 und y = n!

1.2 Ist y > z, so ist x der gesuchte Vorkommaanteil!

1.3 Ist dies nicht der Fall, dann erhöhe den Wert von x um 1, den Wert von yum den Wert des Nenners n und fahre mit Punkt 1.2 fort!

839.book Seite 1088 Dienstag, 9. September 2008 11:49 11

Page 34: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1089

Kapitel 1

Lösu

ngen

2. Zur Bestimmung der Nachkommastellen fahre wie folgt fort:

2.1 Sind noch Nachkommastellen zu berechnen (d. h. a > 0)? Wenn nein,dann beende das Verfahren!

2.2 Setze add = 0, i = 1 und speichere den Klammerinhalt z-(y-n) in derVariablen k, setze also k = z-(y-n)!

2.3 Solange die Zählvariable i ≤ 10 ist, addiere k zu add und erhöhe denWert von i um 1!

2.4 Setze z = add !

2.5 Ist z = 0, so beende das Verfahren!

3. Um die größte Zahl x mit n·x ≤ z zu bestimmen, fahre wie folgt fort:

3.1 Setze x = 0 und y = n!

3.2 Ist y > z, so ist x die nächste Ziffer!

3.3 Ist dies nicht der Fall, dann erhöhe den Wert von x um 1, den Wert von yum den Wert des Nenners n und fahre mit Punkt 3.2 fort!

4. Jetzt ist eine Ziffer weniger zu bestimmen. Vermindere also den Wert von aum 1 und fahre anschließend bei 2.1 fort!

839.book Seite 1089 Dienstag, 9. September 2008 11:49 11

Page 35: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1090

Lösu

ngen

Das Flussdiagramm:

A 1.3 In unserem Kalender sind zum Ausgleich der astronomischen und derkalendarischen Jahreslänge in regelmäßigen Abständen Schaltjahre einge-baut. Zur exakten Festlegung der Schaltjahre dienen die folgendenRegeln:

4

3.3 3.2

3.1

2.5

2.4

2.3

2.22.1

1.31.2

1.1

Start

Eingabe: z, n, a

x = 0, y = n

y > z? x = x + 1y = y + n

Ausgabe:„Ergebnis: x.“

a > 0 ?

Endeadd = 0, i = 1

k = z-(y-n)

i ≤ 10 ?

add = add +ki = i + 1

z = add

z = 0 ?Ende

x = 0, y = n

y > z ?x = x + 1y = y + n

Ausgabe: „x“ a = a - 1

nein

nein

nein

ja

ja

ja

nein

nein

ja

ja

839.book Seite 1090 Dienstag, 9. September 2008 11:49 11

Page 36: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1091

Kapitel 1

Lösu

ngen

(1) Ist die Jahreszahl durch 4 teilbar, so ist das Jahr ein Schaltjahr.

Diese Regel hat allerdings eine Ausnahme:

(2) Ist die Jahreszahl durch 100 teilbar, so ist das Jahr doch keinSchaltjahr.

Diese Ausnahme hat wiederum eine Ausnahme:

(3) Ist die Jahreszahl durch 400 teilbar, so ist das Jahr doch einSchaltjahr.

Formulieren Sie einen Algorithmus, mit dessen Hilfe man feststellenkann, ob ein bestimmtes Jahr ein Schaltjahr ist oder nicht!

Vorüberlegung:

Wir können diesen Algorithmus bereits anhand der Aufgabenstellung, die bereitsdas gesamte Regelwerk enthält herausarbeiten:

Einsetzen der ersten Regel:

Einsetzen der zweiten Regel:

Regel 1Start

Durch 4 teilbar ?

Ausgabe: „Kein Schaltjahr“

Ausgabe: „Schaltjahr“

Ende

janein

Regel 1Start

Durch 4 teilbar ?

Ausgabe: „Kein Schaltjahr“

Ende

Regel 2Durch 100 teilbar ?

Ausgabe: „Schaltjahr“

Ausgabe: „Kein Schaltjahr“

nein

nein

ja

ja

839.book Seite 1091 Dienstag, 9. September 2008 11:49 11

Page 37: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1092

Lösu

ngen

Einsetzen der dritten Regel:

A 1.4 Sie sollen eine unbekannte Zahl x (1 ≤ x ≤ 1000) erraten und habenbeliebig viele Versuche dazu. Bei jedem Versuch erhalten Sie die Rückmel-dung, ob die gesuchte Zahl größer, kleiner oder gleich der von Ihnen ge-ratenen Zahl ist. Entwickeln Sie einen Algorithmus, um die gesuchte Zahlmöglichst schnell zu ermitteln! Wie viele Versuche benötigen Sie bei Ih-rem Verfahren maximal?

Vorüberlegung:

Um unsere gesuchte Zahl möglichst schnell zu finden, müssen wir zuerst dieWahrscheinlichkeit ermitteln, wo sich diese Zahl im Intervall befinden könnte.Tippen wir z. B. zuerst auf die 1, liegt die Wahrscheinlichkeit bei 99,9 %, dass diein unserem Intervall gesuchte Zahl größer ist; dass sie kleiner ist bei 0 %. Dasheißt, wir müssten noch eventuell 999 mal tippen, wenn wir die Tippreihenfolgeeinfach aufsteigend wählen würden. Wir haben unsere Fehlerwahrscheinlichkeitlediglich um 0,1 % gesenkt.

Wählen wir jedoch die Mitte unseres Bereiches, also 500, liegt unsere Wahr-scheinlichkeit auf der linken Seite bei 49,9 % und auf der rechten bei 50 %. Dasheißt, wir haben unsere maximale Fehlerwahrscheinlichkeit diesmal auf bis zu49,9 % gesenkt !

Regel 1Start

Durch 4 teilbar ?

Ausgabe: „Kein Schaltjahr“

Ende

Regel 2Durch 100 teilbar ?

Ausgabe: „Schaltjahr“

Regel 3

Durch 400 teilbar ?

Ausgabe: „Kein Schaltjahr“

Ausgabe: „Schaltjahr“

nein

nein

ja

ja

ja

nein

839.book Seite 1092 Dienstag, 9. September 2008 11:49 11

Page 38: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1093

Kapitel 1

Lösu

ngen

Die Wahrscheinlichkeit, dass wir beim ersten Mal sofort die richtige Zahl erraten,liegt sowieso bei allen Taktiken bei 0,1 %.

Bereits jetzt wird es einsichtig, dass wir mit dem Verfahren der Intervallhalbie-rung am schnellsten zum Ziel kommen.

Der Algorithmus:

Problem:

Erraten Sie eine unbekannte Zahl im Intervall 1 � x � 1000!

Anfangsdaten:

geheimzahl = Die zu erratende Zahltipp = Die von uns geratene Zahluntergrenze = Die untere Grenze des Intervallsobergrenze = Die obere Grenze des Intervalls

Anweisungen:

1. Setze tipp = (untergrenze+obergrenze)/2!

2. Falls tipp = geheimzahl, beende das Verfahren!

2.1 Überprüfe, ob tipp < geheimzahl ist!

2.1.1 Falls ja, setze untergrenze = tipp + 1!

2.1.2 Falls nein, setze obergrenze = tipp – 1!

3. Fahre mit Punkt 1 fort.

Erläuterungen:

1. Wir tippen auf die Mitte des Intervalls.

2. Ist die gesuchte Zahl größer als die von uns geratene,

2.1 dann können wir unsere untere Intervallgrenze bis auf die nächsthöhereals die von uns geratene Zahl hochziehen. Wir reduzieren also das mögli-che Intervall, in dem sich unsere Geheimzahl befinden kann, auf dieHälfte.

2.2 Das entsprechende tun wir, falls die gesuchte Zahl kleiner ist, als unser ak-tueller Tipp.

Anzahl der maximal benötigten Versuche:

Um die Anzahl der maximal benötigten Versuche zu bestimmen, müssen wir unsnoch einmal vor Augen führen, dass wir unser Intervall immer wieder ganzzahlighalbieren.

839.book Seite 1093 Dienstag, 9. September 2008 11:49 11

Page 39: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1094

Lösu

ngen

Nehmen wir unser Beispiel von 1000 Zahlen, um uns dies deutlich zu machen:

1. Versuch:

2. Versuch:

3. Versuch: usw.

Die Frage ist also, wie oft (x) muss ich die Anzahl meiner Intervallelemente ndurch 2 teilen, um höchstens nur noch eine Möglichkeit zum Auswählen zu ha-ben?

Mathematisch ausgedrückt:

In unserem Falle, also für n=1000, folgt:

Wir benötigen mit unserem Verfahren also höchstens 10 Versuche, um die rich-tige Zahl zu raten.

A 1.5 Formulieren Sie einen Algorithmus, der prüft, ob eine eingegebene Zahleine Primzahl ist oder nicht!

Vorüberlegung:

Eine Primzahl ist eine Zahl , die nur durch sich selbst und durch 1 teilbar ist.Die nahe liegende Lösung wäre, einfach alle Zahlen bis zu unserer eingegebenenPrüfzahl darauf zu testen, ob eine davon ein Teiler unserer Prüfzahl ist. Dann han-delt es sich nicht um eine Primzahl.

Wir können uns den Aufwand an einem Beispiel (Prüfzahl ist die 16) veranschau-lichen:

Bei dieser Methode müssten wir also 14 von 16 Zahlen überprüfen!

1000500

2=

500250

2=

250125

2=

2

12

2

log( )

x

x

n

n

n x

⇔ ≤⇔ ≤

2log(1000)

9,966

10

x

x

x

≥≥=

2≥

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

839.book Seite 1094 Dienstag, 9. September 2008 11:49 11

Page 40: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1095

Kapitel 1

Lösu

ngen

Wir wollen uns jedoch die Frage stellen, ob wir den Algorithmus effizienter ge-stalten können.

Würden wir z. B. nur bis zu der Hälfte der eingegebenen Zahl testen, dann könn-ten wir uns auch sicher sein, ob es sich um eine Primzahl handelt. Alle Zahlen,die größer als die Hälfte der Prüfzahl und kleiner als sie selbst sind, brauchennicht mehr in Betracht gezogen zu werden, da sie nicht mehr ein ganzzahliger Tei-ler der Prüfzahl sein können.

Wir verdeutlichen uns auch diesen Aufwand:

Hier bräuchten wir noch 6 Zahlen zu überprüfen, wir haben unseren Algorithmusalso ca. doppelt so schnell gemacht.

Wenn wir aber nur bis zu der Quadratwurzel der Prüfzahl testen, dann erhaltenwir dieselbe Sicherheit, ob die Prüfzahl eine Primzahl ist oder nicht.

Dies können wir uns folgendermaßen erklären:

Wenn wir einen Teiler x von einer Zahl z gefunden haben, dann gilt:

wobei y der zweite Teiler ist. Wären nun x und y größer als , dann wäre auch.

Deshalb muss ein Teiler auf jeden Fall kleiner oder gleich sein. Also reicht es,die Zahlen bis zu zu untersuchen.

Wir verdeutlichen uns dies grafisch:

Wir überprüfen bei der Zahl 16 nur noch die Zahlen 2, 3 und 4 als mögliche Tei-ler. In diesem Beispiel gibt es noch eine Zahl, die größer ist als die Quadratwurzelaus 16 und die ein ganzzahliger Teiler von 16 ist: die 8.

Die Überprüfung dieser Zahl haben wir aber durch das Testen der Zahl 2 schonerledigt.

Wie Sie erkennen, müssen wir mit dieser Methode nur noch 3 von 16 Zahlen tes-ten!

Wir haben unser Verfahren also erheblich beschleunigt!

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

z x y= ⋅

z

x y z⋅ >

z

z

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

839.book Seite 1095 Dienstag, 9. September 2008 11:49 11

Page 41: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1096

Lösu

ngen

Der Algorithmus:

Problem:

Überprüfen Sie, ob die eingegebene Zahl eine Primzahl ist!

Anfangsdaten:

pruefzahl = Die zu prüfende Zahltest = Die Zahl, die gerade geprüft wird, ob sie ein Teiler von pruefzahl ist.

Anweisungen:

1. Setze test = 2!

2. Überprüfe, ob das Quadrat von test kleiner oder gleich der pruefzahl ist!Trifft dies nicht zu, dann ist pruefzahl eine Primzahl. Beende das Verfahren!

3. Überprüfe, ob pruefzahl durch test teilbar ist!

3.1 Falls ja, dann ist pruefzahl keine Primzahl!Beende das Verfahren!

3.1.1 Erhöhe test um 1 und fahre mit Punkt 2 fort!

A 1.6 Ihr CD-Ständer hat 100 Fächer, die fortlaufend von 1–100 nummeriertsind. In jedem Fach befindet sich eine CD. Formulieren Sie einen Algo-rithmus, mit dessen Hilfe Sie die CDs alphabetisch nach Interpreten sor-tieren können! Das Verfahren soll dabei auf den beiden folgenden Grund-funktionen basieren:

� vergleiche (n,m)

Vergleiche die Interpreten der CDs in den Fächern n und m! Ergebnis:»richtig« oder »falsch« je nachdem, ob die beiden CDs in der richtigenoder falschen Reihenfolge im Ständer stehen.

� tausche (n,m)

Tausche die CDs in den Fächern n und m!

Vorüberlegung:

Die erste Lösung, die Ihnen hier wahrscheinlich einfallen wird, beruht wohl aufdem Verfahren, wie wir Menschen meistens Dinge sortieren. Wir suchen daskleinste Element und legen es an der ersten Stelle ab. Dann das nächst größereauf der zweiten usw. Diese Lösung ist mit den zur Verfügung stehenden Funktio-nen realisierbar. Wir müssten alle CDs durchlaufen und uns unterwegs merken,welche CD die gerade »kleinste« ist, also der Name welchen Musikers gehört andie erste Stelle. Am Ende angekommen, wären wir uns sicher, dass diejenige CD,die wir gerade als »kleinste« in Erinnerung haben, an die erste Stelle gehört. Dann

839.book Seite 1096 Dienstag, 9. September 2008 11:49 11

Page 42: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1097

Kapitel 1

Lösu

ngen

dasselbe für die zweite Stelle usw. Um die Lösung auf diese Weise zu realisieren,bräuchten wir also ein zusätzliches »Gedächtnis«, eine Variable, in der wir uns diegerade »kleinste« CD merken.

Ich möchte jedoch bei dieser Lösung ein Verfahren vorstellen, bei dem wir dieses»Gedächtnis« nicht brauchen.

Wir durchlaufen die CDs in aufsteigender Richtung und vergleichen immer nurdie nebeneinander stehenden CDs. Wenn diese nicht in der richtigen Reihenfolgestehen, vertauschen wir sie sofort. Nach einem Durchlauf können wir uns dannsicher sein, dass die letzte CD auf dem richtigen Platz steht und brauchen diesenicht mehr zu betrachten.

Wir fangen wieder am Anfang an und fahren solange fort, bis wir nur noch dieerste mit der zweiten CD vergleichen müssen.

Danach sind unsere CDs ganz sicher richtig sortiert!

Wir veranschaulichen uns dies grafisch an einem Beispiel:

Wir nehmen an, die Interpreten hätten als Künstlernamen alle jeweils einen ein-zigen Buchstaben gewählt und ständen in unserem CD-Regal in folgender Reihen-folge:

Wir laufen also die CDs durch, vergleichen und vertauschen gegebenenfalls:

Wie Sie sehen, steht die CD mit dem »größten« Interpreter (Künstlernamen »D«)bereits auf der richtigen Stelle. Beim nächsten Durchlauf werden wir diese CDalso nicht mehr beachten müssen:

D B C A

D B C A

B D C A

B C D A

B C A D

B C A D

B C A D

B A C D

839.book Seite 1097 Dienstag, 9. September 2008 11:49 11

Page 43: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1098

Lösu

ngen

Auch hier erkennen Sie, dass die CD »C« schon auf ihrem richtigen Platz steht.Diese brauchen wir beim nächsten Durchlauf nicht mehr zu beachten:

Wie Sie leicht erkennen, sind unsere CDs damit sortiert!

Der Algorithmus:

Problem:

Sortieren Sie Ihre CD-Sammlung alphabetisch!

Anfangswerte:

n = Index der gerade betrachteten CD (erste CD hat den Index 1)a = Gesamtzahl der zu betrachtenden CDs

Anweisungen:

1. Falls a � 2 ist, setze n = 1!Ansonsten beende das Verfahren! Die CDs sind sortiert.

2. Ist n < a, dann fahre mit Punkt 3 fort!Trifft dies nicht zu, erniedrige den Wert von a um 1 und fange wieder vornebei Punkt 1 an!

3. Ist das Ergebnis der Funktion vergleiche(n,n+1) falsch, dann rufe dieFunktion tausche(n,n+1) auf und fahre danach mit Punkt 4 fort. Andern-falls fahre sofort mit Punkt 4 fort.

4. Setze n = n+1 und fahre mit Punkt 2 fort!

B A C D

A B C D

839.book Seite 1098 Dienstag, 9. September 2008 11:49 11

Page 44: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1099

Kapitel 1

Lösu

ngen

Eine bessere Übersicht erhalten wir mithilfe eines Flussdiagramms:

A 1.7 Formulieren Sie einen Algorithmus, mit dessen Hilfe Sie die CDs in IhremCD-Ständer jeweils um ein Fach aufwärts verschieben können! Die dabeiam Ende herausgeschobene CD kommt in das erste Fach. Das Verfahrensoll nur auf der Grundfunktion tausche aus Aufgabe 1.6 beruhen.

Vorüberlegung:

Wir wollen bei diesem Algorithmus von hinten nach vorne arbeiten. Wir fangenbei der letzten CD an und tauschen sie mit der vorletzten, dann die vorletzte mitder vorvorletzten usw.

Dabei wird die letzte CD von hinten nach vorne durchgereicht und landet amEnde auch im ersten Fach, wie es in der Aufgabenstellung gefordert ist.

Verdeutlichen wir uns das Vorgehen grafisch:

4.3.

2.

1.

Start

Eingabe: a

a ≥ 2 ?

a = a - 1

vergleiche(n,n+1)

Ende

n = 1

n < a ?

n = n + 1tausche(n,n+1)

ja

nein

ja

nein

richtigfalsch

A B C D

A B D C

A D B C

D A B C

839.book Seite 1099 Dienstag, 9. September 2008 11:49 11

Page 45: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1100

Lösu

ngen

Der Algorithmus:

Problem:

Verschieben Sie die CDs in Ihrem CD-Ständer um ein Fach!Die herausgeschobene CD kommt in das erste Fach!Verwenden Sie dazu nur die Funktion tausche(n,m) aus Aufgabe 1.6!

Anfangsdaten:

n = Index der gerade betrachteten CD (erste CD hat den Index 1)a = Gesamtanzahl der zu betrachtenden CDs

Anweisungen:

1. Setze n = a!

2. Ist n-1 � 1, dann rufe die Funktion tausche(n,n-1) auf!Ansonsten beende das Verfahren!

2.1 Erniedrige den Wert von n um 1 und fahre mit Punkt 2 fort!

Wir verdeutlichen uns auch diesen Algorithmus anhand eines Flussdiagramms:

A 1.8 Formulieren Sie einen Algorithmus, mit dessen Hilfe Sie die Reihenfolgeder CDs in Ihrem CD-Ständer umkehren können! Das Verfahren soll nurauf der Grundfunktion tausche aus Aufgabe 1.6 beruhen.

Vorüberlegung:

Hier werden wir die Möglichkeit verwenden, dass die Funktion tausche(n,m)nicht nur nebeneinander stehende CDs, sondern auch weit entfernte tauschenkann. Wenn wir die Reihenfolge der CDs umkehren sollen, dann muss am Endedie erste CD auf dem letzten Platz landen, die zweite auf dem vorletzten usw. Dieletzte CD gehört dann hingegen auf den ersten Platz, die vorletzte auf den zweitenusw.

2 .1 .

2 .

1 .

S ta rt

E ingabe : a

n = a

n -1≥ 1 ?

n = n - 1tausche(n ,n -1 )

E nde ne in

ja

839.book Seite 1100 Dienstag, 9. September 2008 11:49 11

Page 46: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1101

Kapitel 1

Lösu

ngen

Die naheliegende Lösung, die wir auch hier benutzen werden, ist also, die ersteCD mit der letzten zu tauschen, die zweite mit der vorletzten usw., bis wir in derMitte angekommen sind. Dann haben wir die gesamte Reihenfolge der CDs um-gekehrt. Im Falle einer ungeraden Anzahl von CDs wird die mittlere CD nichtmehr umgetauscht, da sie sich bereits auf dem richtigen Platz befindet.

Grafisch können wir uns das so veranschaulichen:

Der Algorithmus:

Problem:

Kehren Sie die Reihenfolge der CDs in Ihrem CD-Ständer um! Verwenden Siedazu nur die Funktion tausche(n,m) aus Aufgabe 1.6!

Anfangsdaten:

n,m = Indizes der gerade betrachteten CDs (erste CD hat den Index 1)a = Gesamtanzahl der zu betrachtenden CDs

Anweisungen:

1. Setze n = 1 und m = a!

2. Ist n < m, dann rufe die Funktion tausche(n,m) auf!Ansonsten beende das Verfahren!

2.1 Erhöhe den Werte von n um 1, erniedrige den Wert von m um 1 und fahremit Punkt 2 fort!

Das Flussdiagramm:

A B C D

D B C A

D C B A

A B C D E

E B C D A

E D C B A

2.1.

2.

1.

Start

Eingabe: a

m = an = 1

n < m ?

m = m - 1n = n + 1

tausche(n,m)

Ende nein

ja

839.book Seite 1101 Dienstag, 9. September 2008 11:49 11

Page 47: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

Kapitel 1

1102

Lösu

ngen

A 1.9 In einem Hochhaus mit 20 Stockwerken fährt ein Aufzug. Im Aufzug sind20 Knöpfe, mit denen man sein Fahrziel wählen kann, und auf jeder Etageist ein Knopf, mit dem man den Aufzug rufen kann. Entwickeln Sie einenAlgorithmus, der den Aufzug so steuert, dass alle Aufzugbenutzer gerechtbedient werden! Sie können dabei annehmen, dass der Aufzug über diefolgenden Befehle zur Fahrtsteuerung bzw. zum Auslesen der Bedienele-mente verfügt:

� fahre(n)

Fahre das Stockwerk n an!

� lade()

Lade oder entlade in dem zuletzt angefahrenen Stockwerk Fahrgäste!

� pruefe(n)

Prüfe, ob Stockwerk n (innen oder außen) als Fahrziel gewählt wurde!Ergebnis: »ja« oder »nein«.

� max()

Liefert die höchste Etage, die aktuell als Fahrziel (innen oder außen) ge-wählt wurde. Ergebnis: Etagennummer.

� min()

Liefert die niedrigste Etage, die aktuell als Fahrziel (innen oder außen)gewählt wurde. Ergebnis: Etagennummer.

� loesche(n)

Löscht Etage n als Fahrziel.

Vorüberlegung:

Unter »gerechte Bedienung der Fahrgäste« könnte man verstehen: »Wer zuerstdrückt, der fährt zuerst«. Vielleicht wäre das eine der gerechtesten Lösungen, abersicherlich nicht die effizienteste. Wir nehmen den Fall an, dass jemand erst ganzoben drückt und danach jemand in der Mitte. Nach der jetzigen Strategie müsstenwir den Fahrstuhl an der Person in der Mitte vorbeifahren lassen, weil die Personganz oben ja zuerst gedrückt hat.

Wesentlich effizienter wäre es aber, die Person in der Mitte unterwegs mitzuneh-men. Dies wollen wir in unserem nachfolgendem Algorithmus auch so handha-ben.

Ich möchte an dieser Stelle den Algorithmus direkt in Form eines Flussdiagrammsvorstellen, da er in der textuellen Darstellung nur sehr schwer nachvollziehbarist:

839.book Seite 1102 Dienstag, 9. September 2008 11:49 11

Page 48: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1103

Kapitel 1

Lösu

ngen

S tart

zie l = max()

ziel > akt ?

fahre(akt+1)akt = akt + 1

pruefe(akt)

loesche(akt)

lade()

ziel = m in()

Richtung ?

fahre(akt-1)akt = akt - 1

zie l < akt ?

Richtung=nach oben

ja

nein

nach oben nach unten

ajaj

nein nein

Richtung=nach oben

akt = 1

Richtung=nach unten

839.book Seite 1103 Dienstag, 9. September 2008 11:49 11

Page 49: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1333

Index

2D-Grafikprogrammierung 701

A

Abstrakte Klasse 746, 844, 927Abstrakter Datentyp 479

Queue 485Stack 480

adjacent_find 1054Adjazenzliste 623Adjazenzmatrix 623Adressbus 137Adresse 137, 254Aggregation 753Aktualparameter 182Algorithmus 23

Algorithmus von Dijkstra 661Algorithmus von Floyd 652Algorithmus von Ford 672Algorithmus von Kruskal 682Algorithmus von Warshall 637

Alignment 459and 703and_eq 703Anweisung

break 59, 297, 300catch-Anweisung 978continue 59, 300do...while 300extern 184for 56, 298goto 300if 53if...else 295return 184, 293struct 444, 497switch 297throw-Anweisung 978try-Anweisung 978union 451, 505while 299

Argument 182Array 156, 279

eindimensionaler Array 156mehrdimensionaler Array 160, 279

Array (Forts.)zweidimensionaler Array 158

Arrays und Zeiger 259ASCII-Zeichensatz 143Assertions 223Assoziativgesetz 104Attribut 744, 759Aufzählungstyp 142

automatische Typisierung 708Ausdruck

arithmetischer Ausdruck 290logischer Ausdruck 290L-Wert 291relationaler Ausdruck 290R-Wert 291Zuweisungs-Ausdruck 290

AusgabeAusgabe in C++ 793Ausgabe in eine Datei 213Ausgabe von ganzen Zahlen 51Ausgabe von Gleitkommazahlen 51Ausgabe von Text 50Bildschirmausgabe 208

Ausgeglichene Bäume 570Ausnahmefallbehandlung 219, 976Aussage 97Aussagenlogik 97Automatische Objekte 943

B

BasisklasseZugriff auf die Basisklasse 937Zugriffsspezifikation private 940Zugriffsspezifikation protected 939Zugriffsspezifikation public 937

Baum 543, 619absteigend sortierter Baum 546aufsteigend sortierter Baum 546ausgeglichener Baum 573AVL-Baum 573, 578Balance 572Baum-Modul 559Binärbaum 545Blätter 545

839.book Seite 1333 Dienstag, 9. September 2008 11:49 11

Page 50: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1334

Index

Baum (Forts.)Inorder-Traversierung 550Knoten 545Level 545Level-Order-Traversierung 557linker Teilbaum 546Nachfolger 544Postorder-Traversierung 552Preorder-Traversierung 549rechter Teilbaum 546Teilbaum 545Tiefe 545Traversierung 547vollständiger Baum 571Wurzel 544

Bedingte Compilierung 306Befehlsausführung

bedingte Befehlsausführung 53wiederholte Befehlsausführung 54

Beidseitige Warteschlangen 1012Beispiel

Algorithmus von Dijkstra 666Algorithmus von Floyd 656Algorithmus von Ford 674, 679Algorithmus von Kruskal 684Algorithmus von Warshall 637Ausnahmefallbehandlung 220AVL-Baum-Modul 575Baum-Modul 559Bingo 811Bit-Editor 152Bubblesort 397Buchstaben zählen 167Damenproblem 226Darlehen 74Dateioperationen 214Division ganzer Zahlen 61Fakultäten 88, 188Geldautomat 340Hamiltonsche Wege 690Hashtabellen-Modul 596Heapsort 416Hofstadter-Funktion 190Inorder-Traversierung 550Insertionsort 402Juwelenraub 335Kombinationen mit Wiederholungen 328Kombinationen ohne Wiederholungen

330

Beispiel (Forts.)Kugelspiel 62, 120Labyrinth 234Legotreppe 81Level-Order-Traversierung 558Listen-Modul 533Matrixdruck 170Menge 800Näherungslösung Travelling Salesman

697Partnervermittlung 871Permutationen 193Permutationen mit Wiederholungen 325Permutationen ohne Wiederholungen

332Postorder-Traversierung 552Preorder-Traversierung 549Queue 486Quicksort 411Schaltung 121Selectionsort 400Shellsort 405Stack 481Summation von Zahlen 66Travelling Salesman Problem 693Traversierung von Graphen 631Variable Anzahl von Argumenten 216Vereinigungssuche 645Würfelspiel 850Zeichensatz 150Zusammenhangskomponenten 645

Bildschirmausgabe 793Binärbaum 545binary_search 1066Binomialkoeffizient 319Bit 136

invertieren 149löschen 149prüfen 149setzen 149

bitand 703Bitfelder 516Bit-Operationen 147bitor 703bitset 1002Bitsets 1002Block 274

Schachtelung von Blöcken 275Variablen in Blöcken 275

839.book Seite 1334 Dienstag, 9. September 2008 11:49 11

Page 51: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1335

Index

bool 703, 710Boolesche Funktion 100break-Anweisung 59, 300Bubblesort 396Byte 136

C

Callback 262calloc 466, 510case-Label 297catch 703, 978class 703, 759, 893Coding-Standards 311Compiler 41Compileschalter 306compl 703const_cast 703const-Deklaration 278continue-Anweisung 59, 300copy 1058copy_backward 1058count 1056count_if 1056Crosscast 932C-Runtime-Library 201

D

Darstellung boolescher Funktionen 106Darstellungssatz für boolesche Funktionen

109Dateioperationen 213

Dateioperationen in C++ 797Datenabstraktion 442Datenbus 137Daten-Member 759, 761, 895Datenstruktur 27, 441

anlegen 445, 498Arrays in Datenstrukturen 501automatische Typisierung 708Bitfelder 516Datenstrukturen und Funktionen 506Datenstrukturen und Zeiger 511direkter Zugriff 503dynamische Datenstrukturen 465, 509indirekter Zugriff 503Initialisierung 445, 498

Datenstruktur (Forts.)Initialisierung zusammengesetzter Daten-

strukturen 500Liste 470, 513lokale Datenstruktur 499Optimierung 457struct 497Typvereinbarungen 515unbenannte Datenstruktur 499union 505Vorwärtsverweise 709Zeiger auf Datenstrukturen 503Zeiger und Datenstrukturen 462zusammengesetzte Datenstruktur 500Zuweisung von Datenstrukturen 502

Datentypchar 141double 142enum 142float 142int 141long 141long double 142short 141signed 141skalarer Datentyp 140, 274unsigned 141void 188

Datum-Funktionen 225De Morgan’sches Gesetz 104Debugger 42Default -Werte 722Default-Konstruktor 780default-Label 297delete 703, 782delete-Operator 782deque 1012Dereferenzierung 254Destruktion 780Destruktor 479, 772, 948Dezimaldarstellung 131Disjunktive Normalform 109Diskriminante 452, 505Distributivgesetz 104Division mit Rest 130do...while-Anweisung 300Downcasts 932Dualdarstellung 131Dynamic Cast 716

839.book Seite 1335 Dienstag, 9. September 2008 11:49 11

Page 52: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1336

Index

dynamic_cast 703, 933Dynamische Arrays 1005Dynamische Datenstrukturen 465, 509Dynamische Objekte 944Dynamische Typüberprüfungen 928

E

Editor 40Einerkomplement 138Einfachvererbung 913Eingabe

Eingabe aus einer Datei 213Eingabe in C++ 796Eingabe von ganzen Zahlen 52Eingabe von Zeichenketten 162Tastatureingabe 208

Eingabeparameter 182equal 1055equal_range 1066Erweiterung abgeleiteter Klassen 835Escape-Sequenz 145, 273Eulerscher Weg 614Exception-Handling 976explicit 703Explizite Instantiierung 956export 703extern 730extern-Anweisung 184

F

Fakultät (n!) 88, 188false 703Fehlerbehandlung 219fill 1061fill_n 1061find 1054find_end 1054find_first_of 1054find_if 1054Flussdiagramm 25Folgen 73for_each 1053for-Anweisung 56, 298Formalparameter 182Format-Anweisungen

Ausgabe 209Eingabe 211

free 466, 510Freispeicherverwaltung 225, 467, 474friend 703Friends 785, 911Function Name Encoding 727Funktion 182, 293

Default-Werte 722Function Name Encoding 727Funktionskörper 184Funktionsprototyp 183, 184, 294, 722globale Funktion 293Implementierung 183Inline-Funktion 724Parameter 186, 293Parametersignatur 727Schnittstelle 184, 293Schnittstellenvariablen 186statische Funktion 294Überladen von Funktionen 726, 836

Funktions-Member 759, 764, 896Funktionsprototyp 184, 722Funktionszeiger 262fwprintf 712fwscanf 712

G

Generalisierung 749generate 1061generate_n 1061Generische Klasse 970Geordnete Paare 1038Geschützte Member 936getwchar 712Gigabyte 140Gleitkommazahlen 44Globale Variablen 199goto-Anweisung 301Graph 616

Adjazenzliste 623Adjazenzmatrix 623Algorithmus von Dijkstra 661Algorithmus von Floyd 652Algorithmus von Ford 672Anfangsknoten einer Kante 616Anfangsknoten eines Weges 617Baum 619bewerteter Graph 620Bewertungsfunktion 620

839.book Seite 1336 Dienstag, 9. September 2008 11:49 11

Page 53: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1337

Index

Graph (Forts.)Endknoten einer Kante 616Endknoten eines Weges 617Existenz von Wegen 629gerichteter Graph 616geschlossener Weg 617Hamiltonscher Weg 689Inzidenzmatrix 625Kante 616Kantentabelle 626Kantenzug 617Knoten 616Kostenfunktion 620Kosten-Wege-Matrix 623Kreis 617kürzeste Wege 649Länge eines Weges 617minimal spannender Baum 682Pfad in einem Graphen 617Schleife 617schleifenfreier Weg 617schwach zusammenhängender Graph 619Spannbaum 682stark zusammenhängender Graph 619symmetrischer Graph 616Travelling Salesman Problem 692Traversierung von Graphen 630ungerichteter Graph 616unzerlegbarer Graph 618Verbindbarkeit von Knoten 618Verfahren von Warshall 637Weg in einem Graphen 617Wegematrix 634Wurzelbaum 620zusammenhängender Graph 619Zusammenhangskomponenten 641

Graphentheorie 613

H

Hamiltonscher Weg 689Hashing 593Hashtabelle 594

Hashfunktion 595Kollision 595Synonymkette 595

Hauptprogramm 43, 182Header-Datei 41, 186, 200, 294, 309Heap 413, 467

Heap-Bedingung 413Heapsort 412Hexadezimaldarstellung 134

I

Idempotenzgesetz 104Identifier 271if-Anweisung 53Implementierung 35, 37Implizite Instantiierung 956Include-Direktive 302includes 1068Indirektzugriff 254Initialisierung

eingelagerter Objekte 957virtueller Basisklassen 962von Basisklassen 960

inline 703Inline-Funktion 724Inorder-Traversierung 550inplace_merge 1066Insertionsort 401Instantiierbare Klassen 746Instantiierung 747, 953

automatische Instantiierung 778, 779dynamische Instantiierung 778, 782Instantiierung abgeleiteter Klassen 833Instantiierung von Arrays 784Instantiierungsregeln 964statische Instantiierung 778, 781von Klassen 777

Instanz 747, 893Inzidenzmatrix 625iter_swap 1058Iteratoren 984

K

Kantentabelle 626Karnaugh-Veitch-Diagramm 113Keyword 271Kilobyte 140Klasse 746, 759, 893

abgeleitete Klasse 913abstrakte Klasse 844Aufbau 759Basisklasse 913Instantiierung 777

839.book Seite 1337 Dienstag, 9. September 2008 11:49 11

Page 54: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1338

Index

Klasse (Forts.)Vererbung 823virtuelle Basisklasse 920Zugriff von außen 904Zugriff von innen 907

Klassenhierarchie 750Klassifizierungsfunktionen 204Kombinationen mit Wiederholungen 320Kombinationen ohne Wiederholungen

318Kombinatorik 315Kombinatorische Algorithmen 324Kommentar 49, 707Kommutativgesetz 104Komplementgesetz 104Konfigurationsmanagement 36Königsberger Brückenproblem 613Konstante 278, 712Konstante Member 899Konstruktor 479, 772, 945

Default-Konstruktor 780Kontrollabstraktion 442Kontrollstrukturen 295Konvertierungsfunktionen 204Kosten-Wege-Matrix 623Kürzeste Wege 649

L

Label 301Laufzeitanalyse

Block 361Fallunterscheidung 357Schleife 355

Laufzeitfunktion 369Laufzeitklassen 375Laufzeitkomplexität 377

exponentielle 381logarithmische 379polynomiale 379

Laufzeitsystem 197Leistungsanalyse 352

Bubblesort 420Heapsort 427Insertionsort 423Quicksort 425Selectionsort 421Shellsort 424

Leistungsmessung 364

Level-Order-Traversierung 557lexicographical_compare 1072LIFO-Prinzip 197Linker 42list 1014Liste 471, 513, 530, 1014

doppelt verkettete Liste 531einfach verkettete Liste 531Listenanfang 530Listenende 530logische Sicht 531Nachfolger 530physikalische Sicht 531Vergleich mit Array 532Vorgänger 530

Listenanker 471Lokale Variablen 199longjmp 977lower_bound 1066L-Wert 291

M

main 43, 293make_heap 1070Makros 305malloc 466, 509map 1045Mathematische Funktionen 201Mathematische Grundfunktionen 369

ceiling 369Exponentialfunktionen 372floor 369Logarithmen 373Potenzfunktionen 371

Matrizenprodukt 635max 1070max_element 1070Megabyte 140Mehrdeutige Vererbung 752, 917Mehrfachvererbung 751, 917Member 759, 894

Daten-Member 761, 895Funktions-Member 764, 896geschützte Member 760, 829, 936öffentliche Member 760private Member 760rein virtuelle Member-Funktion 844, 926statische Member 845, 900

839.book Seite 1338 Dienstag, 9. September 2008 11:49 11

Page 55: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1339

Index

Member (Forts.)virtuelle Member-Funktion 841, 922Zugriff auf Member 903

Mengen 1040merge 1066Message-Passing 755Methode 744, 759min 1070min_element 1070mismatch 1055Modifikation von Zugriffsrechten 941Modularisierung 181multimap 1045multiset 1040mutable 703, 900

N

Nachricht 755Namensraum std 740Namensräume 732namespace 703, 733new 703, 782new-Operator 782next_permutation 1073Nil-Zeiger 471not 703not_eq 703nth_element 1065Null-Zeiger 471

O

Objectfile 42Objekt 744Objektorientierte Programmierung 743

abstrakte Klasse 746Aggregation 753Attribut 744dynamisches Binden 756Generalisierung 749instantiierbare Klasse 746Instantiierung 747Instanz 747Klasse 746Klassenhierarchie 750mehrdeutige Vererbung 752Mehrfachvererbung 751Message-Passing 755

Objektorientierte Programmierung (Forts.)Methode 744Nachricht 755persistente Attribute 745Polymorphismus 756Relation 754Spezialisierung 749transiente Attribute 745Vererbung 748wiederholte Vererbung 752

Oktaldarstellung 133Operator 279, 704, 902

Adressoperator (&) 254Äquivalenz 103arithmetische Operatoren 47, 284Assoziativität 280Auswertungsoperatoren 287Bit-Operatoren 147, 286bitshift links (<<) 149bitshift rechts (>>) 149bitweises entweder oder (^) 149bitweises Komplement (~) 148bitweises oder (|) 148bitweises und (&) 148Cast-Operator 466Class-Member-Zugriff 704Datentyp-Operatoren 288Dekrement-Operator 293delete 704delete-Operator 782Dereferenzierungsoperator (*) 254, 503Globalzugriff 704Implikation 105Indirektzugriff (->) 463, 504, 904Infix-Notation 280Inkrement-Operator 293logische Operatoren 98, 285new 704new-Operator 782nicht-Operator 100nicht-Operator (!) 119oder-Operator 101oder-Operator (||) 119Operatoren auf Klassen 788Operatoren und Ausdrücke 289Pointer to Member 966Pointer to Member (.*) 704Pointer to Member (->*) 704

839.book Seite 1339 Dienstag, 9. September 2008 11:49 11

Page 56: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1340

Index

Operator (Forts.)Postfix-Notation 280Präfix-Notation 280Priorität 102, 280Scope Resolution 725sizeof-Operator 509Stelligkeit 280Strukturzugriff (.) 445, 503Überladen von Operatoren 728, 788und-Operator 101und-Operator (&&) 119Vergleichsoperatoren 49, 285Zugriff (.) 762Zugriffsoperator (.) 904Zugriffsoperatoren 286Zuweisungsoperator (=) 46Zuweisungsoperatoren 289

operator 703or 703or_eq 703

P

pair 1038Parameter 182Parametersignatur 726partial 1065partial_sort 1065partial_sort_copy 1065partition 1064Performance-Analyse 367Permutationen mit Wiederholungen 316Permutationen ohne Wiederholungen

317Pointer 254Pointer to Member 966Polymorphe Klasse 928Polymorphismus 756pop_heap 1069Postorder-Traversierung 552Preorder-Traversierung 549Preprozessor 302Preprozessor-Direktiven 302prev_permutation 1073Prioritätswarteschlangen 1032priority_queue 1032private 703, 894, 904, 936, 940Produkte 87Programm 29

Programmabbruch 223Programmcode 43Programmdateien 308Programmiersprache 29

maschinenorientierte 30spezielle 30universelle 30

Programmrahmen 43Projektplan 36Projektplanung 36protected 703, 894, 904, 936, 939Prozessor 137Prozesssteuerung 226public 703, 894, 936, 937push_heap 1069putwchar 712

Q

Qualitätssicherung 37Quellcode-Datei 41, 310Queue 485, 558

get 486put 486

queue 1030Quicksort 407

R

random_shuffle 1064Realisierung 35realloc 466, 511Referenz 717

Initialisierung von Referenzen 720konstante Referenz 720Referenz auf Variablen 720Referenzen als Rückgabewert 718Referenzen in Funktionsschnittstellen 717

Rein virtuelle Funktion 927Reinterpret Cast 715reinterpret_cast 703Rekursion 188, 196Relationen 754, 1045remove 1062remove_copy 1062remove_copy_if 1062remove_if 1062replace 1059replace_copy 1060

839.book Seite 1340 Dienstag, 9. September 2008 11:49 11

Page 57: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1341

Index

replace_copy_if 1060replace_if 1059return-Anweisung 184, 293Returnwert 182reverse 1064reverse_copy 1064Review 36rotate 1064rotate_copy 1064Rückgabeparameter 182Rückgabewert 182Rücksprungadresse 198Runtime-Library

abort 224abs 202acos 202asctime 225asin 202atan 202atan2 202atexit 224atof 204atoi 204atol 204bsearch 216calloc 225, 466, 510ceil 202clearerr 223clock 226cos 202cosh 202ctime 225difftime 225div 202exit 224exp 202fabs 202fclose 213feof 213ferror 213fflush 213fgetc 213fgetpos 213fgets 213floor 202fmod 202fopen 213fprintf 213fputc 213

Runtime-Library (Forts.)fputs 213fread 213free 225, 466, 510frexp 203fscanf 213fseek 213fsetpos 213ftell 213fwrite 213getc 213getchar 208getenv 226gets 208gmtime 225isalnum 204isalpha 204iscntrl 204isdigit 205isgraph 205islower 205isprint 205ispunct 205isspace 205isupper 205isxdigit 205labs 202ldexp 203ldiv 202localtime 225log 203log10 203longjmp 220malloc 225, 466, 509memchr 225memcmp 225memcpy 225memmove 225memset 225mktime 225modf 203perror 223pow 203printf 208putc 213putchar 208puts 208qsort 216raise 226

839.book Seite 1341 Dienstag, 9. September 2008 11:49 11

Page 58: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1342

Index

Runtime-Library (Forts.)rand 203realloc 225, 466, 511remove 213rename 213rewind 213scanf 206, 208setbuf 213setjmp 220setvbuf 213signal 226sin 203sinh 203sprintf 206sqrt 203srand 203strcat 206strchr 206strcmp 206strcpy 206strcspn 207strerror 223strlen 207strncat 207strncmp 207strncpy 207strpbrk 207strrchr 207strspn 207strstr 207strtod 205strtok 207strtol 205strtoul 205system 226tan 203tanh 203time 225tmofile 214tmpnam 214toascii 205tolower 205toupper 205ungetc 214va_arg 216va_end 216va_start 216vfprintf 219vprintf 219

Runtime-Library (Forts.)vsprintf 219

R-Wert 291

S

Schleife 298Initialisierung 54Inkrement 55Kopf 55Körper 55Test 54

Schlüsselwörter 271, 703and 703and_eq 703bitand 703bitor 703bool 703catch 703class 703compl 703const_cast 703delete 703dynamic_cast 703explicit 703export 703false 703friend 703inline 703mutable 703namespace 703new 703not 703not_eq 703operator 703or 703or_eq 703private 703protected 703public 703reinterpret_cast 703static_cast 703template 703this 703throw 703true 703try 703typeid 703typename 703

839.book Seite 1342 Dienstag, 9. September 2008 11:49 11

Page 59: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1343

Index

Schlüsselwörter (Forts.)using 703virtual 703wchar_t 703xor 703xor_eq 703

Schnittstelle 182, 293search 1054search_n 1054Seiteneffekt 182, 187Selectionsort 398set 1040set_difference 1068set_intersection 1068set_symmetric_difference 1068set_union 1068setjmp 977Shellsort 403sizeof-Operator 509sort 1065sort_heap 1070Sortierverfahren 395, 434

Bubblesort 396Distributionsort 435Heapsort 412Insertionsort 401Leistungsanalyse 418Quicksort 407Selectionsort 398Shellsort 403Vergleich und Bewertung 428

Speicherfunktionen 225Spezialisierung 749Sprunganweisung 300Sprungleisten 296stable_partition 1064stable_sort 1065Stack 197, 480, 553

pop 197, 480push 197, 480

stack 1027Stackpointer 197Stacks 1027static 845Static Cast 714static_cast 703Statische Objekte 943

Statische Variablen 199string 987Stringbearbeitung 206Strings 161, 987struct-Anweisung 444, 497Suchen und Sortieren 216Suffix 272Summen 80swap 1058swap_ranges 1058Symbolische Konstanten 303Systemanalyse 35, 37Systementwurf 35, 37

T

Tastatureingabe 796Tautologie 104Template 970template 703Terabyte 140this 703this-Pointer 799, 910throw 703, 978transform 1053Travelling Salesman Problem 692Traversierung 547true 703try 703, 978type_info 928typeid 703, 928typename 703Typumwandlungen 713Typvereinbarungen 515

U

Überdeckungsanalyse 366Überladen von Funktionen 726Überladen von Operatoren 728union-Anweisung 451, 505unique 1062unique_copy 1062Unterprogramm 182Upcast 931upper_bound 1066using 703, 737

839.book Seite 1343 Dienstag, 9. September 2008 11:49 11

Page 60: Ulrich Kaiser, Christoph Kecher...Ulrich Kaiser, Christoph Kecher C/C++ 839.book Seite 1 Dienstag, 9. September 2008 11:49 11

1344

Index

V

Variable Anzahl von Argumenten 216Variablen 45, 274

automatische Variablen 277Definition von Variablen 716Externverweis 200globale statische Variablen 277globale Variablen 187, 199, 277Initialisierung von Variablen 276lokale statische Variablen 277lokale Variablen 199, 276Register-Variablen 277statische Variablen 199

Variablendefinitionen 43Variablendeklarationen 266vector 1005Vereinigungssuche 644Vererbung 748, 823, 913

Einfachvererbung 832, 913mehrdeutige Vererbung 917Mehrfachvererbung 833, 917Modifikation von Zugriffsrechten 941wiederholte Vererbung 918Zugriffsschutz 935Zugriffsspezifikation 936

Verfahren von Warshall 637Verschmelzungsgesetz 104Virtual 703, 842Virtuelle Basisklasse 920Virtuelle Destruktoren 925Virtuelle Funktion 923Virtuelle Member-Funktionen 841vollständiger Baum 571Vorgehensmodell 35

W

Wahrheitstafel 100Warteschlangen 1030wchar_t 703, 711wcscat 712wcscmp 712wcscpy 712

wcslen 712Wegematrix 634while-Anweisung 299Wide Character 711Wiederholte Vererbung 752wprinf 712wscanf 712Wurzel 620Wurzelbaum 620

X

xor 703xor_eq 703

Z

ZahlenDezimalzahlen 131, 272Dualzahlen 131ganze Zahlen 44, 129Gleitkommazahlen 44, 142Hexadezimalzahlen 134, 272Oktalzahlen 133, 272

Zahlendarstellungen 129Zahlenfolge 73

explizite Definition 73induktive Definition 74

Zeichen 273Bildschirm-Steuerzeichen 144druckbares Zeichen 143nicht druckbares Zeichen 143

Zeichenkette 161, 273, 279Länge berechnen 166Terminator 161Zeichenkette kopieren 165Zeichenketten vergleichen 165

Zeichensatz 143Zeiger 254, 463Zeigerarithmetik 257Zeigervariable 254Zeit-Funktionen 225Zusammenhangskomponente 641Zweierkomplement 138

839.book Seite 1344 Dienstag, 9. September 2008 11:49 11