| |
| |
| 1 |
- 1.1 Was heißt Programmieren?
| 1 |
- 1.2 Algorithmen und Spezifikationen
| 2 |
- 1.2.1 Problemlösen durch Algorithmen
| 2 |
| 3 |
| 6 |
- 1.2.4 Verifikation von Algorithmen
| 6 |
- 2 Grafische Darstellungsmittel
| 9 |
| 9 |
| 11 |
| 15 |
- 3 Die Entwicklungsumgebung
| 19 |
| 19 |
- 3.2 Erstellen eines Projekts
| 20 |
- 3.3 Compiler oder Interpreter?
| 21 |
- 3.4 Übersetzen von Programmen
| 22 |
| 24 |
| 25 |
| 25 |
- 3.7.1 Die #include – Anweisung
| 26 |
- 3.7.2 Die #define – Anweisung
| 27 |
| 27 |
- 3.7.4 Vordefinierte Präprozessorkonstanten
| 29 |
- 3.7.5 Die #if – Anweisung
| 30 |
- 3.7.6 Die Anweisungen #ifdef und #ifndef
| 31 |
| 33 |
| 33 |
| 33 |
| 34 |
| 35 |
| 35 |
| 35 |
| 35 |
| 36 |
| 37 |
| 38 |
| 39 |
| 39 |
| 39 |
- 4.9.3 Quelltext temporär ausschneiden
| 40 |
| 41 |
- 5.1 Eigenschaften von Variablen und Konstanten
| 41 |
| 41 |
- 5.2.1 Definition von Variablen
| 42 |
- 5.2.2 Namen von Variablen
| 42 |
- 5.2.3 Initialisierung von Variablen
| 43 |
| 44 |
- 5.4 Arbeiten mit Variablen und Konstanten
| 44 |
| 45 |
- 5.5.1 Berechnung der Fläche und des Umfanges eines Rechtecks
| 45 |
- 5.5.2 Versuch einer zirkularen Zuweisung
| 45 |
| 45 |
| 47 |
| 47 |
| 47 |
| 48 |
| 48 |
| 49 |
- 6.1.3.2 Zahlensysteme in C
| 51 |
- 6.1.3.3 Umwandlung von Binär-, Oktal- und Hexadezimalzahlen
| 52 |
- 6.1.3.4 Umwandlung einer Binärzahl ins Dezimalsystem
| 52 |
- 6.1.3.5 Umwandlung einer Dezimalzahl ins Binärsystem
| 53 |
| 53 |
| 54 |
- 6.2.1 Gleitpunkt-Zahlensysteme in C
| 56 |
| 56 |
| 57 |
- 6.2.4 Mathematische Funktionen
| 57 |
| 58 |
| 59 |
| 59 |
| 61 |
- 6.3.4 Funktionen für Zeichen
| 61 |
| 62 |
| 62 |
| 62 |
| 64 |
| 64 |
- 6.8.1 Umfang und Fläche eines Kreises
| 64 |
- 6.8.2 Lösen quadratischer Gleichungen
| 65 |
| 67 |
| 67 |
- 7.1.1 Ausgabe einer ganzen Zahl
| 68 |
- 7.1.2 Ausgabe einer Gleitpunkt-Zahl
| 69 |
- 7.1.3 Ausgabe von Adressen
| 70 |
- 7.1.4 Ausgabe eines Zeichens
| 70 |
- 7.1.5 Ausgabe einer Zeichenkette
| 71 |
- 7.1.6 Weitere Formatierungsmöglichkeiten
| 71 |
- 7.1.7 Probleme mit printf
| 72 |
- 7.1.8 Die Platzhalter von printf
| 72 |
| 72 |
- 7.2.1 Eingabe einer ganzen Zahl
| 73 |
- 7.2.2 Eingabe einer Gleitpunkt-Zahl
| 73 |
- 7.2.3 Eingabe eines Zeichens
| 73 |
- 7.2.4 Eingabe einer Zeichenkette
| 74 |
| 74 |
- 7.2.6 Die Platzhalter von scanf
| 75 |
- 7.3 Ein- und Ausgabe von Zeichen
| 76 |
| 76 |
- 7.4.1 Umfang und Fläche eines Kreises
| 76 |
| 76 |
| 77 |
| 77 |
- 8.2 Reihenfolge der Auswertung
| 78 |
| 78 |
| 80 |
| 81 |
- 8.3.1 Arithmetische Operatoren
| 81 |
| 82 |
- 8.3.2.1 Inkrement und Dekrement
| 83 |
| 87 |
- 8.3.3 Logische Operatoren
| 87 |
- 8.3.3.1 Vergleichsoperatoren
| 88 |
| 90 |
| 92 |
| 93 |
| |
| |
| |
| |
| |
| |
| |
| 94 |
| 95 |
| 95 |
| 96 |
- 8.5.1 Teilbarkeit einer Zahl
| 96 |
- 8.5.2 Übungen zu logischen Ausdrücken
| 96 |
- 8.5.3 Berechnung der Signum-Funktion
| 97 |
- 8.5.4 Berechnung des Schaltjahres
| 97 |
| 99 |
| 99 |
- 9.2 Die switch – Anweisung
| 103 |
| 104 |
- 9.3.1 Lösen quadratischer Gleichungen
| 104 |
- 9.3.2 Berechnung der Einkommensteuer
| 105 |
| 107 |
- 9.3.4 Osterregel nach Gauß
| 107 |
| 109 |
| 109 |
- 10.2 Die while - Anweisung
| 111 |
- 10.3 Die do - while - Anweisung
| 112 |
- 10.4 Besonderheiten der for - Anweisung
| 113 |
- 10.4.1 Weglassen von Ausdrücken
| 113 |
| 115 |
- 10.5 Die break - Anweisung
| 115 |
- 10.6 Die continue - Anweisung
| 116 |
- 10.7 Schachteln von Schleifen
| 117 |
| 118 |
| 118 |
- 10.8.2 Der Euklidische Algorithmus
| 121 |
| 122 |
- 10.8.4 Gerade und ungerade Zahlen
| 123 |
- 10.8.5 Der Weihnachtsbaum
| 123 |
| 127 |
- 10.8.7 Ein Zahlenratespiel
| 128 |
| 131 |
- 11.1 Definition einer Funktion
| 131 |
- 11.1.1 Namen von Funktionen
| 131 |
| 132 |
| 133 |
- 11.1.4 Der Rückgabewert der Funktion main
| 134 |
- 11.1.5 Ablauf eines Funktionsaufrufes
| 135 |
- 11.2 Deklaration einer Funktion
| 137 |
- 11.2.1 Externe Funktionen
| 140 |
- 11.2.2 Statische Funktionen
| 140 |
| 140 |
- 11.3.1 Leeren des Eingabepuffers
| 140 |
- 11.3.2 Kalender für ein Jahr
| 141 |
- 11.3.3 Einfacher Taschenrechner
| 148 |
| 151 |
| 151 |
- 12.1.1 Die Blockstruktur von C
| 151 |
- 12.1.2 Variablen der Speicherklasse auto
| 153 |
- 12.1.3 Variablen der Speicherklasse register
| 153 |
- 12.1.4 Variablen der Speicherklasse static
| 154 |
| 154 |
- 12.2.1 Variablen der Speicherklasse extern
| 155 |
- 12.2.2 Variablen der Speicherklasse static
| 156 |
- 12.3 Übersicht über alle Speicherklassen in C
| 156 |
| 159 |
- 13.1 Eindimensionale Felder
| 159 |
- 13.2 Mehrdimensionale Felder
| 161 |
- 13.3 Initialisierung von Feldern
| 163 |
| 165 |
- 13.5 Felder als Parameter
| 165 |
- 13.6 Einfache Sortierverfahren
| 166 |
| 166 |
| 168 |
- 13.7 Einfache Suchverfahren
| 169 |
- 13.7.1 Sequenzielles Suchen
| 169 |
| 170 |
| 171 |
- 13.8.1 Multiplikation von Matrizen
| 171 |
- 13.8.2 Berechnung der Einkommensteuer – verbesserte Variante
| 173 |
- 13.8.3 Kopieren von Feldern
| 174 |
| 175 |
| 175 |
- 14.2 Zeiger als Parameter
| 179 |
- 14.3 Die „Dualität“ von Zeigern und Feldern
| 180 |
| 182 |
- 14.5 Komplexere Fälle: Felder von Zeigern, Zeiger auf Zeiger
| 183 |
| 187 |
- 14.7 Zeiger auf Funktionen
| 188 |
- 14.7.1 Adressen von Funktionen
| 188 |
| 188 |
| 189 |
- 14.7.4 Typdefinitionen mit typedef
| 190 |
| 191 |
- 14.8.1 Inkrement-Funktion
| 191 |
- 14.8.2 Lösen quadratischer Gleichungen – verbesserte Variante
| 192 |
| 195 |
| 195 |
| 196 |
| 197 |
- 15.4 Initialisierung von Zeichenketten
| 198 |
- 15.5 Elementare Funktionen für Zeichenketten
| 199 |
- 15.6 Felder von Zeigern auf Zeichenketten
| 201 |
- 15.7 Argumente der Funktion main
| 203 |
| 204 |
- 15.8.1 Vorzeitiges Ende einer Zeichenkette
| 204 |
- 15.8.2 Die Funktion strcpy
| 204 |
- 15.8.3 Die Funktion strlen
| 206 |
- 15.8.4 Die Funktion strcmp
| 206 |
| 207 |
- 15.8.6 Kalender für ein Jahr – verbesserte Variante
| 208 |
- 15.8.7 Sortieren von Zeichenketten
| 209 |
- 15.8.8 Einfaches Verschlüsseln nach Julius Cäsar
| 210 |
- 16 Abgeleitete Datentypen
| 211 |
| 211 |
| 212 |
- 16.2.1 Einfache Strukturen
| 213 |
- 16.2.2 Funktionen und Strukturen
| 216 |
- 16.2.3 Zeiger auf Strukturen
| 217 |
- 16.2.4 Felder von Strukturen
| 218 |
| 221 |
| 222 |
| 224 |
- 16.5 Rekursive Strukturen
| 228 |
- 16.6 Deklaration von abgeleiteten Datentypen
| 228 |
- 16.7 Typdefinition mit typedef
| 230 |
| 231 |
| 231 |
- 16.8.2 Eine Adressverwaltung
| 233 |
| 239 |
| 239 |
- 17.2 Öffnen und Schließen von Datenströmen
| 240 |
| 243 |
| 245 |
- 17.4.1 Kopieren von Dateien
| 245 |
- 17.4.2 Ausgeben von Dateien
| 246 |
- 17.4.3 Eine Adressverwaltung – verbesserte Variante
| 246 |
| 253 |
- 18.1 Rekursive Algorithmen
| 253 |
- 18.2 Rekursive Funktionen in C
| 254 |
| 256 |
| 256 |
| 257 |
| 261 |
- 19.1 Datenstrukturen und abstrakte Datenstrukturen
| 261 |
| 262 |
- 19.2.1 Eigenschaften und Terminologie
| 262 |
- 19.2.2 Methoden und Implementierung
| 263 |
- 19.2.2.1 Einfügen eines neuen Elementes
| 265 |
- 19.2.2.2 Entfernen eines Elementes
| 267 |
- 19.2.3 Weitere Arten von Listen
| 269 |
- 19.3 Stapel und Schlangen
| 270 |
| 270 |
| 271 |
| 271 |
| 272 |
- 19.4.1 Eigenschaften und Terminologie
| 272 |
| 274 |
| 276 |
| 277 |
- 19.4.4.1 Traversieren von Bäumen
| 277 |
- 19.4.4.2 Suchen eines Elementes in einem binären Suchbaum
| 278 |
- 19.4.4.3 Einfügen eines neuen Elementes in einen binären Suchbaum
| 279 |
- 19.4.4.4 Löschen eines Elementes in einem binären Suchbaum
| 279 |
| 283 |
| 283 |
| 284 |
- 19.5.2.1 Die Methode UpHeap
| 284 |
- 19.5.2.2 Die Methode DownHeap
| 285 |
- 19.5.2.3 Entfernen von Elementen
| 286 |
- 19.5.2.4 Aufbau eines Heaps durch Einfügen von Elementen
| 287 |
- 19.5.2.5 Aufbau eines Heaps in einem Feld
| 287 |
- 19.5.2.6 Sortieren mit Heaps
| 287 |
| 289 |
| 293 |
- 19.6.2 Getrennte Verkettung
| 294 |
| 296 |
- 19.7 Vergleich der Datenstrukturen
| 296 |
| 299 |
- 20.1 Aufgaben der Speicherverwaltung
| 299 |
- 20.2 Anfordern von Speicher
| 300 |
- 20.3 Verändern der Größe von Speicherblöcken
| 303 |
- 20.4 Freigeben von Speicher
| 304 |
| 304 |
- 20.5.1 Kein Speicher mehr frei
| 305 |
- 20.5.2 Freigabe mit einer falschen Adresse
| 305 |
- 20.5.3 Freigabe eines bereits freigegebenen Speichers
| 305 |
- 20.5.4 Freigabe eines Feldes
| 306 |
- 20.5.5 Freigabe einer Variable
| 306 |
- 20.5.6 Freigabe eines nicht initialisierten Zeigers
| 306 |
- 20.5.7 Zugriff auf einen ungültigen Speicher
| 306 |
- 20.5.8 Zugriff auf bereits freigegebenen Speicher
| 307 |
- 20.5.9 Zugriff mit falschen Indizes
| 307 |
- 20.5.10 Zugriff auf nicht initialisierten Speicher
| 307 |
- 20.5.11 Verlust des Speichers durch Überschreiben des Zeigers
| 308 |
- 20.5.12 Verlust des Speichers durch Verlust des Zeigers
| 308 |
- 20.5.13 Verlust des Speichers durch Rücksprung
| 309 |
- 20.5.14 Verlust des Speichers bei Rückgabe
| 309 |
- 20.5.15 Zu große Speicherblöcke
| 310 |
| 311 |
| 311 |
| 311 |
| 311 |
| 312 |
| 312 |
- 21.2 Mathematische Grundbegriffe
| 312 |
| 313 |
| 313 |
- 21.3 Sehr kleine und sehr große Zahlen
| 315 |
| 315 |
| 315 |
- 21.3.3 Summation von Punktzahlen
| 316 |
| 318 |
| 319 |
- 22.1 Behandlung von Fehlern im Programm
| 322 |
| 322 |
| 324 |
- 22.2 Fehlerbehandlung mit Funktionen der Standard-Bibliothek
| 325 |
- 22.2.1 Die Fehlervariable errno
| 325 |
| 326 |
- 22.2.3 Programmende mit exit
| 327 |
- 22.2.4 Die Funktion atexit
| 327 |
- 22.2.5 Die Funktion assert
| 327 |
| 328 |
- 22.3.1 Definition von Signalbehandlungsfunktionen
| 329 |
| 330 |
- 23 Ein exemplarisches Software-Projekt
| 331 |
| 331 |
- 23.2 Präzisierung der Spezifikation
| 332 |
| 333 |
- 23.3.1 Wahl der Bibliothek
| 334 |
- 23.3.2 Verwendung von Bibliotheken
| 334 |
- 23.4 Realisierungsmöglichkeiten
| 335 |
- 23.4.1 Ansatz mit rekursiven Funktionen
| 336 |
| 337 |
- 23.4.3 Der Auswertungsstapel
| 338 |
| 339 |
- 23.5.1 Beschreibung der Funktionen
| 339 |
| 340 |
- 23.6 Implementierung des virtuellen Taschenrechners für den Textmodus
| 340 |
| 341 |
- 23.6.2 Das Modul berechnung.o
| 343 |
- 23.6.3 Das Modul stapel.o
| 346 |
- 23.6.4 Das Modul eingabe.o
| 349 |
- 23.6.5 Die grafische Benutzeroberfläche
| 351 |
| 353 |
| |