15,99 €
Stephen R. Davis fängt von vorn an: Wie arbeitet ein Programm? Wie installiert man die Programmierumgebung und den Compiler? Und was ist das überhaupt? Als nächstes lernen Sie grundlegende Programmiertechniken kennen: Variablendeklaration, Schleifen, Funktionen und anderes mehr. Fünf Kapitel widmen sich den unterschiedlichen Variablentypen, sodass Sie für die berühmten C++-Zeiger gut gerüstet sind. War gar nicht schwer? Es folgt eine Einführung in das objektorientierte Programmieren, und bevor Sie es sich versehen, liegen auch die Vererbung von Klassen, das Überladen von Operatoren und der Ausnahmemechanismus in Ihrer Reichweite. Mit den Programmbeispielen zum Herunterladen können Sie das Gelernte direkt ausprobieren.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 413
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
1. Auflage 2016
© 2016 WILEY-VCH Verlag GmbH & Co. KGaA, Weinheim
Original English language edition Beginning Programming with C++ For Dummies
© 2015 by Wiley Publishing, Inc.
All rights reserved including the right of reproduction in whole or in part in any form.
This translation published by arrangement with John Wiley and Sons, Inc.
Copyright der englischsprachigen Originalausgabe Beginning Programming with C++ For Dummies
© 2015 by Wiley Publishing, Inc.
Alle Rechte vorbehalten inklusive des Rechtes auf Reproduktion im Ganzen oder in Teilen und in jeglicher Form.
Diese Übersetzung wird mit Genehmigung von John Wiley and Sons, Inc. publiziert.
Wiley, the Wiley logo, Für Dummies, the Dummies Man logo, and related trademarks and trade dress are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States and other countries. Used by permission.
Wiley, die Bezeichnung »Für Dummies«, das Dummies-Mann-Logo und darauf bezogene Gestaltungen sind Marken oder eingetragene Marken von John Wiley & Sons, Inc., USA, Deutschland und in anderen Ländern.
Das vorliegende Werk wurde sorgfältig erarbeitet. Dennoch übernehmen Autoren und Verlag für die Richtigkeit von Angaben, Hinweisen und Ratschlägen sowie eventuelle Druckfehler keine Haftung.
Coverfoto: © Denys Rudyi – Fotolia.com
Korrektur: Isolde Kommer, Großerlach
Satz: inmedialo Digital- und Printmedien UG, Plankstadt
Print ISBN: 978-3-527-71318-9
ePub ISBN: 978-3-527-80465-8
mobi ISBN: 978-3-527-80464-1
Stephen R. Davis (auch »Randy« genannt) lebt mit seiner Frau und zwei Hunden in Corpus Christi, Texas. Randy hat drei Kinder und drei Enkelkinder, weitere sind unterwegs (Enkelkinder, nicht Kinder). Randy entwickelt browserbasierte Anwendungen für Versicherungsagenturen.
Für Janet, die Liebe meines Lebens.
Inhaltsverzeichnis
Über den Autor
Widmung
Einführung
Über dieses Buch
Törichte Annahmen über den Leser
Wie dieses Buch organisiert ist
Teil I: Programmieren in C++ – die ersten Schritte
Teil II: Ein Programm schreiben: Entscheidungen, Entscheidungen
Teil III: Prozedural programmieren
Teil IV: Datenstrukturen
Teil V: Objektorientierte Programmierung
Teil VI: Für Fortgeschrittene
Teil VII: Der Top-Ten-Teil
Symbole in diesem Buch
Wie es weitergeht
Teil I Programmieren in C++ – die ersten Schritte
1 Was ist ein Programm?
Worin unterscheidet sich mein Sohn von einem Computer?
Einen »menschlichen Computer« programmieren
Den Algorithmus erstellen
Die Entwicklung der Reifenwechsel-Sprache
Das Programm erstellen
Computerprozessoren
Computersprachen
Höhere Sprachen
Die Sprache C++
2 Code::Blocks installieren
Der Kompilierungsvorgang
Code::Blocks installieren
Installation unter Windows
Installation unter Ubuntu Linux
Installation unter Mac OS
Code::Blocks einrichten
Die Code::Blocks-Installation testen
Das Projekt anlegen
Ihr Standardprojekt testen
3 Ihr erstes Programm
Ein neues Projekt anlegen
Dateinamenerweiterungen
Die Eingabe Ihres Programms
Das Programm erstellen
Was alles schiefgehen kann
Falsch geschriebene Befehle
Fehlendes Semikolon
Die Beispieldateien verwenden
Das Programm ausführen
Wie das Programm funktioniert
Die Vorlage
Das Conversion-Programm
Teil II Ein Programm schreiben: Entscheidungen, Entscheidungen
4 Integer-Ausdrücke – für ganze Zahlen
Variablen deklarieren
Variablennamen
Einer Variablen einen Wert zuweisen
Eine Variable bei der Deklaration initialisieren
Ganzzahlige Konstanten
Ausdrücke
Binäre Operatoren
Zusammengesetzte Ausdrücke auflösen
Unäre Operatoren
Die speziellen Zuweisungsoperatoren
5 Zeichenausdrücke
Character-Variablen definieren
Zeichen codieren
Beispiel für die Zeichencodierung
Zeichenketten codieren
Sonderzeichen-Konstanten
6 Entscheidungen, Entscheidungen!
Die if-Anweisung
Vergleichsoperatoren
Geschweifte Klammern sind kein Luxus
Und andernfalls?
Verschachtelte if-Anweisungen
Zusammengesetzte bedingte Ausdrücke
7 Ausführungspfade wechseln
Mit der switch-Anweisung den Programmablauf steuern
Durchgerasselt: Habe ich es kaputtgemacht?
Implementierung eines einfachen Taschenrechners mit der switch-Anweisung
8 Programme debuggen, Teil I
Fehlertypen identifizieren
Fehler vermeiden
Codieren mit Stil
Namenskonventionen für Variablen festlegen
Den ersten Fehler finden – mit ein bisschen Unterstützung
Den Laufzeitfehler finden
Testdaten formulieren
Tests durchführen
Sehen wir nach, was das Programm macht
Teil III Prozedural programmieren
9 while – ein ewiger Kreislauf
while-Schleifen
Aus einer Schleife ausbrechen
Verschachtelte Schleifen
10 Weiter mit for-Schleifen
Die vier Teile jeder Schleife
Wir betrachten ein Beispiel
Mit dem Komma-Operator mehr erledigen
11 Funktionen
Aufgaben in Funktionen zerlegen
Die Arbeitsweise von Funktionen verstehen
Eine Funktion schreiben und verwenden
Dinge zurückgeben
Ein Beispiel
An Funktionen Argumente übergeben
Funktion mit Argumenten
Funktionen mit mehreren Argumenten
main()
Funktionsprototyp-Deklarationen definieren
12 Programme in Module unterteilen
Programme aufsplitten
Teilen ist gar nicht so schwer
Factorial.cpp erstellen
Eine #include-Datei erstellen
#include-Dateien einbinden
main.cpp erstellen
Das Ergebnis erstellen
Verwendung der C++-Standardbibliothek
Gültigkeitsbereiche von Variablen
13 Programme debuggen, Teil 2
Debugging eines Programms mit Rechenschwäche
Einheitentests durchführen
Eine Funktion für Tests ausstatten
Zurück zum Einheitentest
Teil IV Datenstrukturen
14 Andere numerische Variablentypen
Die Grenzen von Integern in C++
Integer-Abrundung
Begrenzter Wertebereich
Ein »doppelter« Typ für reelle Zahlen
Eine Lösung für das Abrundungsproblem
Wenn ein Integer kein Integer ist
Die Grenzen eines double erkennen
Variablengröße – die lange und die kurze Form
Wie weit reichen Zahlen?
Konstantentypen
Funktionen unterschiedliche Typen übergeben
Funktionsnamen überladen
Gemischtes Überladen
15 Arrays
Was ist ein Array?
Ein Array deklarieren
Array-Elemente über einen Index ansprechen
Ein Beispiel
Ein Array initialisieren
16 Arrays mit Charakter
Das ASCII-Zero-Character-Array
Ein ASCIIZ-Array deklarieren und initialisieren
Ein Beispiel
Ein detaillierteres Beispiel
Hackerabwehr
Muss ich das wirklich alles machen?
17 Zeiger in C++
Was ist ein Zeiger?
Einen Zeiger deklarieren
Einer Funktion Argumente übergeben
Argumente als Wert übergeben
Argumente als Referenz übergeben
Das große Ganze
Typen von Referenzargumenten
Speicherstapel
Brauchen Sie wirklich ein neues Schlüsselwort?
Vergessen Sie nicht, zum Schluss wieder aufzuräumen!
Ein Beispiel
18 C++-Zeiger – auf den zweiten Blick
Zeiger und Arrays
Operationen für Zeiger
Zeiger-Addition im Vergleich zur Indizierung eines Arrays
Der Inkrementoperator für Zeiger
Warum plagen wir uns mit Array-Zeigern?
Operationen für verschiedene Zeigertypen
Die Sache mit den Konstanten
Unterschiede zwischen Zeigern und Arrays
Meine Argumente von main()
Zeigerarrays
Arrays mit Argumenten
19 Programmieren mit Klasse
Daten gruppieren
Die Klasse
Das Objekt
Arrays von Objekten
Ein Beispiel
20 Programme debuggen, Teil 3
Ein neuer Ansatz für das Debugging
Die Lösung
Debuggen Schritt für Schritt
Den Debugger starten
Navigation durch ein Programm mit dem Debugger
Den (ersten) Fehler korrigieren
Den zweiten Fehler finden und korrigieren
Teil V Objektorientierte Programmierung
21 Was ist objektorientierte Programmierung?
Abstraktion und Mikrowellenöfen
Prozedurale Nachos
Objektorientierte Nachos
Klassifizierung und Mikrowellenöfen
Warum sollten wir Objekte auf diese Weise aufbauen?
Abgeschlossene Klassen
22 Strukturiertes Spiel: Wie Klassen Dinge erledigen
Unsere Objekte aktivieren
Eine Elementfunktion erstellen
Eine Elementfunktion definieren
Namen für Klassenelemente
Aufruf einer Elementfunktion
Zugriff auf andere Elemente von einer Elementfunktion aus
Eine Elementfunktion hinter der Klasse halten
Elementfunktionen überladen
23 Zeiger auf Objekte
Zeiger auf Objekte
Pfeilsyntax
Aufruf aller Elementfunktionen
Funktionen Objekte übergeben
Aufruf einer Funktion mit einem Objektwert
Aufruf einer Funktion mit einem Objektzeiger
Ein Beispiel
Objekte auf dem Stapel reservieren
24 Bitte nicht stören: Geschützte Elemente
Elemente schützen
Warum Sie geschützte Elemente brauchen
Elemente schützen
Also?
Ein Freund, ein guter Freund …
25 Objekten einen guten Start verschaffen
Der Konstruktor
Einschränkungen von Konstruktoren
Kann ich ein Beispiel sehen?
Datenelemente konstruieren
Destruktoren
Ein Beispiel
Datenelemente zerstören
26 Konstruktive Argumente
Konstruktoren mit Argumenten
Ein Beispiel
Den Konstruktor überladen
Der Standard-Standardkonstruktor
Datenelemente konstruieren
Datenelemente mit dem Standardkonstruktor initialisieren
Datenelemente mit einem anderen Konstruktor initialisieren
Ein Beispiel
Neu in C++ 2011
27 Kopieren mit dem Copy-Konstruktor
Ein Objekt kopieren
Der Standard-Copy-Konstruktor
Ein Beispiel
Einen Copy-Konstruktor erstellen
Kopien vermeiden
Teil VI Für Fortgeschrittene
28 Eine Klasse vererben
Vorteile der Vererbung
Die Sprachbesonderheiten
Vererbung in C++ implementieren
Ein Beispiel
Eine HAT_EIN-Beziehung
29 Virtuelle Funktionen – Realität?
Elementfunktionen überschreiben
Frühes Binden
Mehrdeutiger Fall
Eine späte Bindung eingehen
Wann nicht virtuell?
Virtuelle Aspekte
30 Zuweisungsoperatoren überladen
Einen Operator überladen
Das Überladen des Zuweisungsoperators ist kritisch
Ein Beispiel
Ihren Eigenen schreiben (oder nicht)
31 Stream-I/O
Wie Stream-I/O funktioniert
Stream-Eingabe/Ausgabe
Ein Eingabe-Objekt erstellen
Ein Ausgabe-Objekt erstellen
Öffnen-Modi
Was ist der Binärmodus?
Und in welchem Status ist eine Datei?
Weitere Elementfunktionen der fstream-Klassen
Streams direkt lesen und schreiben
Formatsteuerung
Und was macht eigentlich endl?
Manipulatoren manipulieren
Die stringstream-Klassen
32 Machen wir eine Ausnahme!
Der Ausnahmemechanismus
Betrachten wir den Ausnahmemechanismus im Detail!
Spezielle Aspekte für das Aufwerfen von Ausnahmen
Eine benutzerdefinierte Ausnahmeklasse erstellen
Einschränkungen von Ausnahmeklassen
Teil VII Der Top-Ten-Teil
33 Zehn Methoden, Fehler zu vermeiden
Aktivieren Sie alle Warnungen und Fehlermeldungen!
Gewöhnen Sie sich einen klaren und konsistenten Programmierstil an!
Kommentieren Sie den Code, während Sie ihn schreiben!
Durchlaufen Sie jeden Pfad mindestens einmal im Einzelschrittmodus im Debugger!
Begrenzen Sie die Sichtbarkeit!
Verwalten Sie Ihren Stapel!
Überschreiben Sie Zeiger mit 0, nachdem Sie gelöscht haben, worauf sie zeigen!
Verarbeiten Sie Fehler mit Ausnahmen!
Deklarieren Sie Destruktoren als virtuell!
Stellen Sie einen Copy-Konstruktor und einen überladenen Zuweisungsoperator bereit!
34 Zehn Dinge, die in diesem Buch nicht abgedeckt sind
Der goto-Befehl
Der ternäre Operator
Binäre Logik
Aufzählungstypen
Namensräume
Rein virtuelle Funktionen
Die string-Klasse
Mehrfachvererbung
Templates und die Standard Template Library
Lambda-Funktionen
Stichwortverzeichnis
Willkommen bei C++ programmieren lernen für Dummies. Dieses Buch wurde für Leser geschrieben, die programmieren lernen möchten.
Im Laufe der Jahre wurde die Programmierung immer mehr mit Mathematik und Logik und anderen komplizierten Dingen gleichgesetzt. Ich habe das nie verstanden. Programmieren ist eine Fertigkeit wie Werbetexten, Zeichnen oder Fotografieren. Man muss in der Lage sein, eine Aufgabenstellung zu durchdenken, aber ich kenne ein paar wirklich hervorragende Programmierer, die keine Ahnung von Mathematik haben. Einige Menschen haben ein Talent dafür und lernen es wirklich schnell, andere sind nicht so gut und nicht so schnell. Aber jeder, der genügend Geduld und Durchhaltevermögen hat, kann lernen, einen Computer zu programmieren. Ich bin das beste Beispiel dafür.
Über dieses Buch
Um programmieren zu lernen, müssen Sie eine Programmiersprache erlernen. Dieses Buch basiert auf der Programmiersprache C++. Versionen des dafür vorgeschlagenen Compilers für Windows und Macintosh sind in dem Online-Material zu diesem Buch enthalten. Linux-Versionen können unter www.codeblocks.org heruntergeladen werden. (Keine Sorge: Ich werde Ihnen in diesem Buch schrittweise erklären, wie das Paket installiert wird und wie Sie Ihr erstes Programm erstellen.)
Ziel dieses Buchs ist es, Ihnen die Grundlagen der Programmierung in C++ zu vermitteln, und nicht, Sie mit jedem noch so kleinen Detail dieser Programmiersprache vertraut zu machen. Nachdem Sie das Buch gelesen haben, können sie relativ umfangreiche Programme schreiben. Außerdem werden Sie viele andere, vergleichbare Sprachen sofort verstehen, beispielsweise Java oder C#.NET.
In diesem Buch erfahren Sie, was ein Programm ist und wie es funktioniert. Außerdem lernen Sie, wie Folgendes zu bewerkstelligen ist:
Den C++ Compiler Code::Blocks installieren und ein Programm damit erstellen
Ausdrücke erstellen und auswerten
Den Kontrollfluss in Ihrem Programm regeln
Datenstrukturen erstellen, die Ihnen helfen, die reale Welt zu modellieren
C++-Zeiger definieren und verwenden
Zeichenketten manipulieren, um Ausgaben so zu erstellen, wie Sie sie haben wollen
Dateien schreiben und aus ihnen lesen
Törichte Annahmen über den Leser
Ich versuche, in diesem Buch so wenige Annahmen über den Leser zu treffen wie möglich, aber ich gehe einfach von Folgendem aus:
Sie haben einen Computer. Die meisten Leser haben Windows-Computer . Die Programme in diesem Buch laufen unter Windows, Macintosh, Linux und Unix gleich gut. C++ ist eine standardisierte Sprache, deshalb sollten diese Programme auf jedem Computer laufen, auf dem ein C++-Compiler vorhanden ist.
Sie kennen die Grundlagen der Nutzung Ihres Computers. Beispielsweise gehe ich davon aus, dass Sie wissen, wie ein Programm gestartet wird, wie eine Datei kopiert wird, wie ein Ordner erstellt wird usw.
Sie wissen, wie Sie sich innerhalb der Menüs bewegen. Sie finden in diesem Buch immer wieder Anweisungen wie »Klicken Sie auf FILE und dann auf OPEN«. Wenn Sie dieser Anweisung folgen können, dann können Sie loslegen.
Sie sind ein Programmierneuling. Ich gehe nicht davon aus, dass Sie etwas über Programmierung wissen. Ich gehe nicht einmal davon aus, dass Sie wissen, was Programmierung ist.
Um Ihnen dabei zu helfen, sich in diesem Buch zurechtzufinden, verwende ich einige Konventionen:
C++-Begriffe und andere Teile von Computercode werden in nichtproportionaler Schrift dargestellt, etwa so.
Neue Begriffe werden kursiv hervorgehoben (und definiert).
Nummerierte Schritte, denen Sie folgen müssen, und Zeichen, die Sie eingeben müssen, sind fett ausgezeichnet.
Ich empfehle Ihnen, jeweils einen Teil des Buchs zu lesen, es dann wegzulegen und ein bisschen mit C++ zu experimentieren, bevor Sie den nächsten Teil lesen. Dieses Buch ist so organisiert, dass Sie nach jedem Teil genügend neue Dinge gelernt haben, um Programme zu schreiben.
Ich möchte Ihnen außerdem die folgenden Ratschläge geben:
Wenn sie bereits wissen, was Programmierung ist, aber noch nichts über C++, können Sie Kapitel 1 überspringen.
Ich empfehle Ihnen, den Compiler Code::Blocks zu verwenden, den Sie zusammen mit dem Buch erhalten, auch wenn Sie später einen anderen C++-Compiler verwenden wollen. Wenn Sie jedoch Code::Blocks keinesfalls verwenden wollen, können Sie Kapitel 2 überspringen.
Wenn Sie bereits ein wenig Erfahrung mit der Programmierung von Computern gemacht haben, brauchen Sie Kapitel 3 nur zu überfliegen.
Ab Kapitel 4 sollten Sie sich jedoch genau konzentrieren, selbst wenn Sie bereits Erfahrung mit anderen Programmiersprachen gesammelt haben, wie beispielsweise BASIC.
In Kapitel 20 können Sie aufhören zu lesen, wenn Sie denken, es sei jetzt genug. Ab Kapitel 21 geht es um ein neues Thema, die objektorientierte Programmierung – dies sollten Sie erst in Angriff nehmen, wenn Sie mit dem bisher Gelernten gut vertraut sind.
Text mit dem Techniker-Symbol können Sie jederzeit überspringen.
Wie dieses Buch organisiert ist
C++ programmieren lernen für Dummies ist in sieben Teile unterteilt. Sie müssen diese Teile nicht nacheinander lesen und Sie müssen nicht einmal alle Abschnitte in einem Kapitel lesen. Anhand des Inhaltsverzeichnisses und des Index finden Sie die jeweils benötigte Information. In diesem Abschnitt beschreibe ich kurz, was Sie in den jeweiligen Teilen finden.
Teil I: Programmieren in C++ – die ersten Schritte
Dieser Teil beschreibt, was Programme sind und wie sie funktionieren. Anhand eines fiktiven Reifenwechsel-Computers zeige ich Ihnen verschiedene Algorithmen für das Abmontieren eines Reifens von einem Auto, um Ihnen ein Gefühl dafür zu verschaffen, wie Programme arbeiten. Außerdem richten Sie Code::Blocks auf Ihrem Computer ein, bevor Sie diesen Teil wieder verlassen.
Teil II: Ein Programm schreiben: Entscheidungen, Entscheidungen
Dieser Teil stellt Ihnen die Grundlagen der Programmierung mit C++ vor. Sie lernen, wie ganzzahlige Variablen deklariert und wie einfache Ausdrücke geschrieben werden. Nachdem Sie diesen Teil gelesen haben, haben Sie sogar gelernt, wie Sie Entscheidungen in einem Programm treffen – ein kleiner Schritt hin zum Profi.
Teil III: Prozedural programmieren
Hier lernen Sie, wie Sie den Kontrollfluss durch Ihre Programme regeln. Sie erfahren, wie Sie Schleifen erstellen, Ihren Code in Module zerlegen (und warum), und wie Sie diese separaten Module zu einem einzigen Programm zusammensetzen. Nach diesem Teil können Sie echte Programme schreiben, die echte Probleme lösen.
Teil IV: Datenstrukturen
Dieser Teil erweitert Ihr Wissen über Datentypen. In den ersten Teilen dieses Buchs waren Sie auf ganze Zahlen beschränkt. In diesem Teil arbeiten Sie mit Zeichen, Dezimalzahlen und Arrays. Und Sie können sogar Ihre eigenen Typen definieren. Und in diesem Teil werden Sie auch das gefürchtetste Thema meistern: C++-Zeiger.
Teil V: Objektorientierte Programmierung
Hier steigen Sie in die objektorientierten Techniken ein – die Dinge, die C++ wirklich von seinen Vorgängern unterscheiden, insbesondere C. (Machen Sie sich keine Gedanken, wenn Sie nicht wissen, was objektorientierte Programmierung ist – Sie werden es erfahren.) Sie sollten sich jedoch mit den Themen aus den Teilen I bis IV gut vertraut machen, bevor Sie diesen Teil in Angriff nehmen, aber Sie werden ein sehr viel ernstzunehmender Programmierer sein, wenn Sie damit fertig sind.
Teil VI: Für Fortgeschrittene
Dies ist eine Sammlung von Themen, die wichtig sind, aber nicht in den vorherigen Teilen untergebracht werden konnten. Beispielsweise geht es hier darum, wie Sie Dateien erstellen, sie lesen und schreiben.
Teil VII: Der Top-Ten-Teil
In diesem Teil liste ich auf, was Sie bei der Programmierung tun (oder vermeiden) sollten, um keine unnötigen Fehler zu erzeugen. Außerdem finden Sie in diesem Teil Hinweise, was Sie als Nächstes lernen sollten, falls Sie Ihre C++-Kenntnisse erweitern möchten.
Symbole in diesem Buch
Was wäre ein echtes Für Dummies-Buch ohne die Symbole, die Sie auf wichtige Informationen hinweisen, die auf Ihrem Weg nützlich sind? In diesem Abschnitt beschreibe ich kurz die in diesem Buch verwendeten Symbole.
Das Tipp-Symbol verweist auf praktische Informationen, die Ihnen sehr wahrscheinlich das Leben leichter machen werden.
Dieses Symbol kennzeichnet allgemein interessante und praktische Fakten – die Sie sich vielleicht für später merken sollten. Außerdem verwende ich dieses Symbol, um Sie an Dinge zu erinnern, die Sie vielleicht in einem früheren Kapitel überlesen haben.
Das Warnsymbol kennzeichnet lauernde Gefahren. Mit diesem Symbol mache ich Sie darauf aufmerksam, dass Sie aufpassen und vorsichtig vorgehen sollten.
Wenn Sie dieses Symbol sehen, wissen Sie, jetzt kommen sehr technische Informationen. Wenn Sie sich das nicht antun wollen, können Sie diese Information einfach überspringen.
Wie es weitergeht
C++ programmieren lernen für Dummies beinhaltet die folgenden Online-Goodies, die Sie ganz einfach herunterladen können:
Den Quellcode für alle Beispiele im Buch finden Sie unter www.wiley-vch.de/publish/dt/books/ISBN3-527-71318-2. Die Programme sind nach Kapitelnummer angeordnet. Außerdem gibt es eine Projektdatei für Code::Blocks (weitere Informationen über Code::Blocks finden Sie unter dem nächsten Punkt. Um Projektdateien wird es in Kapitel 2 gehen).
Dieses Buch verwendet die kostenlose Open-Source-Umgebung Code::Blocks und den GCC-C++-Compiler. Die für dieses Buch verwendete Code::Blocks-Version (13.12) steht zum Download unter www.dummies.com/extras/beginningprogrammingcplus plus zur Verfügung. Ich habe Versionen für Windows (2000 und später) und Macintosh (10.6 und später) bereitgestellt. In Kapitel 2 finden Sie Anweisungen für das Herunterladen und die Installation von Code::Blocks. Neuere Versionen von Code::Blocks und Versionen für unterschiedliche Linux-Versionen finden Sie unter www.codeblocks.org/downloads/binaries.
Falls Sie www.codeblocks.org besuchen, laden Sie unbedingt auch eine Version mit gcc-Compiler herunter.
Aber jetzt habe ich Sie lange genug aufgehalten. Blättern Sie weiter zu Kapitel 1 und fangen Sie an, programmieren zu lernen!
Teil I
Programmieren in C++ – die ersten Schritte
In diesem Teil . . .
Ihr erstes »Programm« schreiben
Die Entwicklungsumgebung installieren
Das Programm testen
Typische Fehlerquellen kennenlernen
www.wiley-vch.de/dummies besuchen, um die online bereitgestellten Beispieldateien herunterzuladen
1
Was ist ein Programm?
In diesem Kapitel
Programme verstehen
Ihr erstes »Programm« schreiben
Computersprachen genauer betrachten
In diesem Kapitel erfahren Sie, was ein Programm ist, und was es bedeutet, ein Programm zu schreiben. Sie lernen einen menschlichen Computer kennen und werden einige Programmausschnitte sehen, die für einen realen Computer geschrieben sind. Und schließlich sehen Sie Ihren ersten Codeausschnitt, geschrieben in C++.
Bisher wurden alle Programme auf Ihrem Computer von jemandem anderen geschrieben. Sehr bald schon wird das nicht mehr der Fall sein. Sie werden sich stolz in die Gemeinschaft der Programmierer einreihen.
Worin unterscheidet sich mein Sohn von einem Computer?
Ein Computer ist eine bemerkenswert schnelle, aber unglaublich dumme Maschine. Ein Computer kann alles, was Sie ihm befehlen (im zulässigen Bereich, versteht sich), aber er macht genau das, was Sie ihm befehlen – nicht mehr und nicht weniger.
In dieser Hinsicht ist ein Computer fast genau das Gegenteil eines Menschen: Menschen reagieren intuitiv. Als ich eine zweite Fremdsprache lernte, stellte ich fest, dass es nicht ausreichend ist, zu verstehen, was gesagt wird – es ist genauso wichtig und deutlich schwieriger, zu verstehen, was ungesagt bleibt. Dabei handelt es sich um Informationen, die der Sprecher durch gemeinsame Erfahrungen oder Ausbildung mit dem Zuhörer gemein hat – Dinge, die nicht gesagt werden müssen.
Beispielsweise sage ich zu meinem Sohn Dinge wie »Wasch das Geschirr ab« (weil es eben gemacht werden muss). Diese Anweisungen scheinen ausreichend klar zu sein, aber ein Großteil der Informationen in diesem Satz sind implizit und unausgesprochen.
Angenommen, mein Sohn weiß, was Geschirr ist, und dass sich schmutziges Geschirr normalerweise im Spülbecken befindet. Aber was ist mit Messern und Gabeln? Schließlich habe ich nur vom Geschirr gesprochen, nicht vom Essbesteck, geschweige denn von Gläsern. Und bedeutet waschen, dass er das von Hand machen muss, oder kann er das Ganze auch in die Spülmaschine packen, wo es automatisch gewaschen, gespült und getrocknet wird?
Tatsächlich ist »Wasch das Geschirr ab« für meinen Sohn eine ausreichende Anweisung. Er kann diesen Satz zerlegen und ihn mit Informationen kombinieren, die wir beide kennen, unter anderen umfangreiches Arbeitswissen über schmutziges Geschirr, um daraus auf sinnvolle Weise abzuleiten, was ich von ihm will – ob er es dann macht, steht wieder auf einem anderen Blatt. Ich nehme an, er kann genauso schnell begreifen, worum es geht, wie ich es gesagt habe – innerhalb von etwa 1 bis 2 Sekunden.
Ein Computer kann eine so unpräzise Aussage wie »Wasch das Geschirr ab« nicht erweitern oder kürzen. Sie müssen dem Computer genau sagen, was er mit jedem einzelnen Geschirrteil machen soll, Sie müssen ihm mitteilen, dass auch Besteck dazugehört, und ihm erklären, wie eine Gabel, ein Löffel oder eine Tasse abzuwaschen sind. Wann hört das Programm auf, ein Geschirrteil zu waschen (d. h. wie erkennt es, dass es sauber ist)? Wann hört es auf, abzuwaschen (d. h. woher weiß es, dass seine Aufgabe abgeschlossen ist)?
Mein Sohn hat ein enormes Gedächtnis – man weiß nicht genau, wie viel Merkkapazität ein durchschnittlicher Mensch besitzt, aber es ist in jedem Fall sehr viel. Leider ist das Gedächtnis des Menschen nicht immer geordnet. Die Zeugen von Verbrechen erinnern sich meistens an keinerlei Details, selbst nicht unmittelbar nach dem Vorfall. Und zwei Zeugen desselben Vorfalls sind sich meistens höchst uneinig darüber, was eigentlich passiert ist.
Auch Computer haben ein enormes Gedächtnis, und das ist extrem gut. Nachdem eine Tatsache gespeichert wurde, kann ein Computer sie beliebig oft abrufen, ohne dass sich irgendetwas daran ändert. Anfang der 1980er-Jahre war Speicher noch teuer, deshalb hatte der erste IBM-PC nur 16 KB (das sind 16.000 Bytes). Er war auf überwältigende 64 KB aufrüstbar. Vergleichen Sie dies mit dem Arbeitsspeicher von 2 GB bis 6 GB, wie er uns in den meisten modernen Computern zur Verfügung steht (ein 1 GB, ein Gigabyte, entspricht einer Million Bytes)!
In den frühen Tagen der PCs war Speicher teuer. Deshalb enthielt der IBM-PC zusätzliche Speicherchips und Decodier-Hardware, die feststellen konnte, wenn ein Speicherfehler auftrat. Fiel ein Speicherchip aus, konnte diese Schaltung das Problem erkennen und melden, bevor das Programm abstürzte. Dieser sogenannte Paritätsspeicher wurde schon nach ein paar Jahren verworfen. Soweit ich weiß, gibt es ihn heute nicht mehr, außer in ganz speziellen Anwendungen, die extrem zuverlässig sein müssen – die Speicherkarten von heute fallen so gut wie nicht mehr aus.
Andererseits beherrschen Menschen verschiedene Verarbeitungsformen, mit denen sich Computer extrem schwertun. Beispielsweise können Menschen sehr gut die Bedeutung eines Satzes erkennen, der durch sehr viel Hintergrundlärm gestört wird. Digitale Mobiltelefone dagegen (die mindestens so sehr Computer wie Telefon sind) haben die unangenehme Eigenschaft, dass sie stumm werden, wenn der Lärmpegel über eine eingebaute Schwelle steigt.
Das restliche Kapitel beschäftigt sich mit Anweisungen, die dem Computer schon sehr viel besser mitteilen, wie er »das Geschirr abwaschen« (oder eine vergleichbar unübersichtliche Aufgabe erledigen) soll.
Einen »menschlichen Computer« programmieren
Bevor ich anfange, Ihnen beizubringen, wie Sie Programme für Computer schreiben, zeige ich Ihnen ein Programm, mit dem Sie das menschliche Verhalten lenken. Dann werden Sie besser verstehen, worum es geht. Die Entwicklung eines Programms für die Lenkung eines Menschen ist sehr viel einfacher als die Entwicklung von Programmen für Computer-Hardware. Das liegt daran, dass wir Menschen sehr geübt im Umgang miteinander sind – woraus sich eine Vertrautheit damit ergibt, wie Menschen ticken und wie sie arbeiten (und auch ein gewisses Verständnis dafür). Außerdem haben wir eine gemeinsame Sprache, wir müssen nicht alles in Einsen und Nullen übersetzen. Aber wir wollen davon ausgehen, dass der menschliche Computer in diesem Gedankenexperiment jede Anweisung sehr wörtlich nimmt – das Programm muss also äußerst genau sein.
Die Aufgabenstellung, die ich für dieses Experiment gewählt habe, ist es, unseren menschlichen Computer anzuweisen, einen platten Reifen zu wechseln.
Den Algorithmus erstellen
Die Anweisungen für das Wechseln eines platten Reifens sind ganz einfach und könnten etwa wie folgt aussehen:
1. Hebe das Fahrzeug an.
2. Entferne die Radmuttern, mit denen der defekte Reifen am Auto befestigt ist.
3. Entferne den Reifen.
4. Montiere den neuen Reifen.
5. Bringe die Radmuttern an.
6. Senke das Fahrzeug ab.
Selbst diese alltäglichen Begriffe können unübersichtlich sein. Technisch gesehen, halten die Radmuttern das Rad, nicht den Reifen am Auto. Der Einfachheit halber wollen wir annehmen, dass die Begriffe »Rad« und »Reifen« synonym verwendet werden können und dass der Computer sie als dasselbe Konzept versteht.
Zunächst scheinen diese Anweisungen ganz detailliert zu sein, aber sie stellen noch lange kein Programm dar. Eine solche Anweisungsmenge wird als Algorithmus bezeichnet – eine Beschreibung der auszuführenden Schritte, die normalerweise sehr abstrakt ist. Ein Algorithmus ist detailliert, aber allgemein. Ich könnte diesen Algorithmus verwenden, um jeden platten Reifen zu reparieren, den ich je hatte, und den ich je haben werde. Ein Algorithmus enthält jedoch nicht ausreichend viele Details, um selbst unserem bewusst einfach gehaltenen menschlichen Computer zu gestatten, die Aufgabe auszuführen.
Die Entwicklung der Reifenwechsel-Sprache
Bevor wir ein Programm schreiben können, brauchen wir eine Sprache, auf die wir uns alle einigen können. Im restlichen Buch wird das die Sprache C++ sein, aber für dieses Beispiel verwende ich eine imaginäre Sprache: RWS (die Reifenwechsel-Sprache). Ich habe RWS speziell auf die Aufgabe zugeschnitten, Reifen zu wechseln.
RWS enthält ein paar Substantive, die in der Welt des Reifenwechsels üblicherweise vorkommen:
Auto
Reifen
Mutter
Wagenheber
Werkzeugkasten
Ersatzreifen
Schraubenschlüssel
Außerdem enthält RWS die folgenden Verben:
nehmen
bewegen
lösen
drehen
Außerdem muss der Prozessor für die Ausführung der RWS in der Lage sein, zu zählen und einfache Entscheidungen zu treffen. Und schließlich kennt der RWS-Prozessor Richtungen wie oben und unten, links und rechts sowie im Uhrzeigersinn und gegen den Uhrzeigersinn.
Diese Wörter in RWS sind alles, was der Reifenwechsel-Roboter (der imaginäre menschliche Computer) versteht. Jeder andere Befehl, der nicht Teil der Reifenwechsel-Sprache ist, bewirkt einen verständnislosen Blick des menschlichen Reifenwechsel-Prozessors.
Das Programm erstellen
Jetzt wollen wir den Algorithmus, der in natürlicher Sprache geschrieben war, in ein Programm in RWS umwandeln. Das ist nicht ganz so einfach, wie es scheinen mag. Betrachten Sie beispielsweise den Satz »Entferne die Radmuttern.« In diesem Satz fehlen einige Aussagen. Das Wort entferne ist nicht im Vokabular des Prozessors enthalten. Außerdem wurde in diesem Satz das Wort Schraubenschlüssel nicht erwähnt (das der Computer kennt), obwohl wir alle wissen, dass ein Schraubenschlüssel beteiligt sein muss. Wir können nicht davon ausgehen, dass der Computer weiß, was wir wissen.
(Falls Sie noch keinen platten Reifen gewechselt haben und nicht wissen, dass für das Entfernen einer Radmutter ein Schraubenschlüssel benötigt wird – oder was eine Radmutter überhaupt ist –, dann machen wir einfach weiter. Sie werden es herausfinden.)
Die folgenden Schritte implementieren den Satz »Entferne eine Radmutter«, wobei nur die Verben und Substantive der RWS verwendet werden:
1. Nimm den Schraubenschlüssel.
2. Bewege den Schraubenschlüssel zur Radmutter.
3. Drehe den Schraubenschlüssel fünfmal gegen den Uhrzeigersinn.
4. Bewege den Schraubenschlüssel zum Werkzeugkasten.
5. Lasse den Schraubenschlüssel los.
Jetzt betrachten wir diese Aspekte der Syntax (der erforderlichen Anordnung der Wörter), die in diesem Beispiel der RWS vorgegeben ist:
Jeder Befehl beginnt mit einem Verb.
Für das Verb nehmen ist ein einzelnes Substantiv als Objekt erforderlich.
Das Verb drehen benötigt ein Substantiv, eine Richtung und eine Anzahl, wie viele Umdrehungen gemacht werden sollen.
Der Programmausschnitt sollte jedoch ganz einfach zu lesen sein (schließlich ist dies kein Buch über RWS).
Sie könnten diesen kleinen Exkurs in die Reifenwechsel-Sprache überspringen, aber Sie müssen die Grammatik jedes C++-Befehls lernen. Sonst funktioniert es nicht.
Das Programm beginnt mit Schritt 1 und durchläuft die einzelnen Schritte bis hin zu Schritt 5. In Programmier-Terminologie sagen wir, das Programm läuft von Schritt 1 bis Schritt 5. Natürlich geht das Programm nirgendwo hin – der Prozessor erledigt die gesamte Arbeit – aber der Programmablauf ist ein üblicher Begriff für diese reibungslose Ausführung der einzelnen Schritte.
Selbst bei einer beiläufigen Betrachtung dieses Programms ist ein Problem offensichtlich: Was passiert, wenn es keine Radmutter gibt? Ich nehme an, es ist harmlos, den Schraubenschlüssel an einem Bolzen ohne Mutter zu drehen, aber man vergeudet Zeit und unter einer guten Lösung stelle ich mir etwas Besseres vor. Die Reifenwechsel-Sprache braucht eine Verzweigungsmöglichkeit, die gestattet, dass das Programm abhängig von externen Bedingungen den einen oder den anderen Pfad einschlägt. Wir brauchen eine if-Anweisung, etwa wie folgt:
1. Nimm den Schraubenschlüssel.
2. Falls eine Radmutter vorhanden ist
3. {
4. Bewege den Schraubenschlüssel zur Radmutter.
5. Drehe den Schraubenschlüssel fünfmal gegen den Uhrzeigersinn.
6. }
7. Bewege den Schraubenschlüssel zum Werkzeugkasten.
8. Lasse den Schraubenschlüssel los.
Das Programm beginnt mit Schritt 1, wie bereits zuvor, und nimmt einen Schraubenschlüssel. Bevor es im zweiten Schritt den Schraubenschlüssel sinnlos um eine leere Schraube dreht, prüft es, ob eine Radmutter vorhanden ist. Ist dies der Fall, wird der Ablauf wie zuvor mit den Schritten 3, 4 und 5 fortgesetzt. Ist es nicht der Fall, überspringt der Programmablauf diese unnötigen Schritte und fährt direkt mit Schritt 7 fort, um den Schraubenschlüssel wieder in den Werkzeugkasten zu legen.
In Computer-Sprache sagen Sie, dass das Programm den logischen Ausdruck »Ist eine Radmutter vorhanden?« ausführt. Dieser Ausdruck gibt entweder true zurück (ja, richtig, die Radmutter ist vorhanden), oder false (nein, falsch, es gibt keine Radmutter).
Was ich hier als Schritt bezeichne, würde in einer Programmiersprache normalerweise als Anweisung bezeichnet. Ein Ausdruck ist eine Art Aussage, die einen Wert zurückgibt. Beispielsweise ist 1 + 2 ein Ausdruck. Ein logischer Ausdruck ist ein Ausdruck, der den Wert true (richtig) oder false (falsch) zurückgibt. Beispielsweise ist der Wert von »Ist der Autor dieses Buches ein schöner Mann?« gleich true.
Die geschweiften Klammern { } in der Reifenwechsel-Sprache sind erforderlich, um dem Programm mitzuteilen, welche Schritte übersprungen werden sollen, wenn die Bedingung nicht true ist. Die Schritte 4 und 5 werden nur ausgeführt, wenn die Bedingung true ist.
Ich weiß, dass es nicht notwendig ist, einen Schraubenschlüssel zur Hand zu nehmen, wenn keine Schraubenmutter zu entfernen ist, aber das wollen wir hier einfach ignorieren.
Dieses verbesserte Programm weist immer noch ein Problem auf: Woher erkennen Sie, dass fünf Umdrehungen des Schraubenschlüssels ausreichend sind, um die Radmutter zu entfernen? Für die meisten Reifen, die ich kenne, genügt das. Sie könnten die Anzahl der Umdrehungen erhöhen, um wirklich auf der sicheren Seite zu sein, beispielsweise auf 25. Wenn sich die Radmutter beispielsweise nach der 20. Umdrehung löst, dann dreht sich der Schraubenschlüssel eben fünfmal umsonst. Das ist eine harmlose Lösung, aber vergeudete Arbeitskraft.
Ein besserer Ansatz ist eine Art Anweisung, die in einer Schleife abläuft und eine Prüfung durchführt – in unserer Reifenwechsel-Sprache:
1. Nimm den Schraubenschlüssel.
2. Falls eine Radmutter vorhanden ist
3. {
4. Bewege den Schraubenschlüssel zur Radmutter.
5. Solange (Radmutter noch am Fahrzeug sitzt)
6. {
7. Drehe den Schraubenschlüssel einmal gegen den Uhrzeigersinn.
8. }
9. }
10. Bewege den Schraubenschlüssel zum Werkzeugkasten.
11. Lasse den Schraubenschlüssel los.
Hier verläuft das Programm von Schritt 1 bis Schritt 4 wie zuvor. In Schritt 5 muss der Prozessor jedoch eine Entscheidung treffen: Sitzt die Radmutter noch am Fahrzeug? Bei dem ersten Durchlauf nehmen wir dies an, sodass der Prozessor Schritt 7 ausführt und den Schraubenschlüssel einmal gegen den Uhrzeigersinn dreht. An dieser Stelle kehrt das Programm zu Schritt 5 zurück und wiederholt die Überprüfung. Sitzt die Radmutter immer noch am Fahrzeug, wiederholt der Prozessor Schritt 7 und kehrt wieder zu Schritt 5 zurück. Irgendwann ist die Radmutter gelöst und die Bedingung in Schritt 5 ergibt den Wert false. An dieser Stelle geht die Steuerung im Programm zu Schritt 9 weiter und das Programm wird fortgesetzt wie zuvor.
Diese Lösung ist der vorhergehenden Lösung überlegen: Sie trifft keine Annahmen im Hinblick darauf, wie viele Umdrehungen erforderlich sind, um eine Radmutter zu lösen. Es wird also keine überflüssige Arbeit ausgeführt, bei der der Prozessor eine Radmutter dreht, die schon gar nicht mehr vorhanden ist, und es passiert auch nicht, dass eine Radmutter zurückbleibt, die noch nicht ganz gelöst wurde.
So elegant diese Lösung ist, gibt es immer noch ein Problem: Sie montiert nur eine einzige Radmutter vom Fahrzeug. Die meisten mittelgroßen Fahrzeuge haben fünf Radmuttern an jedem Rad. Wir könnten die Schritte 2 bis 9 fünfmal wiederholen, einmal für jede Radmutter. Aber auch das funktioniert nicht optimal. Die meisten Kleinwagen haben nur vier Radmuttern, große Pickups haben bis zu acht.
Das folgende Programm erweitert unsere Grammatik um die Möglichkeit, die Radmuttern zu durchlaufen. Dieses Programm funktioniert unabhängig von der Anzahl der Radmuttern am Rad:
1. Nimm den Schraubenschlüssel.
2. Für jede Radmutter am Rad
3. {
4. Falls eine Radmutter vorhanden ist
5.
{6.
7. Bewege den Schraubenschlüssel zur Radmutter.
8. Solange (Radmutter noch am Fahrzeug sitzt)
9. {
10. Drehe den Schraubenschlüssel einmal gegen den Uhrzeigersinn.
11.
}12. }
13. }
14. Bewege den Schraubenschlüssel zum Werkzeugkasten.
15. Lasse den Schraubenschlüssel los.
Dieses Programm beginnt wie zuvor damit, einen Schraubenschlüssel aus dem Werkzeugkasten zu nehmen. Ab Schritt 2 durchläuft es jedoch für jede Radmutter am Rad die Schritte bis 12.
Beachten Sie, dass die Schritte 7 bis 10 für jede Schraube wiederholt werden. Man spricht auch von einer verschachtelten Schleife. Die Schritte 7 bis 10 werden als die innere Schleife bezeichnet. Die Schritte 2 bis 12 bilden die äußere Schleife.
Das vollständige Programm entsteht durch die Ergänzung ähnlicher Implementierungen in jedem Schritt des Algorithmus.
Computerprozessoren
Es scheint eine ganz einfache Aufgabe zu sein, ein Rad von einem Auto zu montieren, und dennoch braucht man 11 Anweisungen in einer Sprache, die speziell für das Wechseln von Reifen entwickelt wurde, um die Radmuttern zu entfernen. Das fertige Programm enthält mehr als 60 oder 70 Schritte mit zahlreichen Schleifen. Und wenn man eine Logik für die Prüfung auf Fehlerbedingungen einbaut, wie beispielsweise festsitzende oder fehlende Radmuttern, braucht man noch mehr Schritte.
Stellen Sie sich jetzt vor, wie viele Anweisungen ausgeführt werden müssten, um etwas Einfaches zu bewerkstelligen, wie beispielsweise ein Fenster über den Anzeigebildschirm zu bewegen (denken Sie daran, dass ein typischer Bildschirm 1280 × 1024 Pixel anzeigt, das ist etwas mehr als eine Million). Glücklicherweise ist ein Computerprozessor zwar dumm, aber extrem schnell. Der Prozessor in Ihrem PC beispielsweise kann mehrere Milliarden Anweisungen pro Sekunde ausführen. Die Anweisungen in Ihrem generischen Prozessor leisten nicht besonders viel – man braucht mehrere Anweisungen, nur um ein Pixel zu verschieben –, aber wenn Sie gleichzeitig eine Milliarde bewegen können, ist die Manipulation einer lächerlichen Million Pixel ein Kinderspiel.
Der Computer macht nichts, wofür er nicht programmiert wurde. Die Bereitstellung der Reifenwechsel-Sprache war nicht ausreichend, um meinen platten Reifen zu wechseln – jemand musste die Programmanweisungen schreiben, um Schritt für Schritt festzulegen, was der Computer tun sollte. Und die Entwicklung eines realen Programms, das alle etwa auftretenden speziellen Bedingungen berücksichtigt, ist keine einfache Aufgabe. Ein Programm zu schreiben, das industriell einsetzbar ist, kann eine echte Herausforderung sein.
Die Frage lautet also: »Warum machen wir uns die Mühe überhaupt?« Weil der Computer, nachdem er einmal programmiert ist, die gewünschte Funktion immer wieder, unermüdlich und in der Regel sehr viel schneller als jeder Mensch ausführen kann.
Computersprachen
Die Reifenwechsel-Sprache ist natürlich keine reale Computersprache. Für reale Computer gibt es keine Maschinenanweisungen wie nimm oder drehe. Und noch schlimmer ist: Computer »denken« in einer Abfolge aus Einsen und Nullen. Jeder interne Befehl ist nichts anderes als eine Reihe von Binärzahlen. Reale Computer befolgen Anweisungen wie 01011101, womit beispielsweise einer Zahl in einem speziellen Register 1 hinzugefügt wird. So schwierig die Programmierung in der Reifenwechsel-Sprache sein mag, die Programmierung mit langen Zahlenketten ist noch schwieriger.
Die Muttersprache der Computer wird als Maschinensprache bezeichnet und wird in der Regel durch eine Zahlenfolge in Binärform (Basis 2) oder in Hexadezimalform (Basis 16) dargestellt. Nachfolgend sehen Sie die ersten 64 Byte aus dem Programm Conversion in Kapitel 3.
<main+0>: 01010101 10001001 11100101 10000011 11100100
11110000 10000011 11101100
<main+8>: 00100000 11101000 00011010 01000000 00000000
00000000 11000111 01000100
<main+16>:00100100 00000100 00100100 01110000 01000111
00000000 11000111 00000100
<main+24>:00100100 10000000 01011111 01000111 00000000
11101000 10100110 10001100
<main+32>:00000110 00000000 10001101 01000100 00100100
00010100 10001001 01000100
Glücklicherweise schreibt niemand mehr Programme in Maschinensprache. Schon sehr früh hat jemand festgestellt, dass es für einen Menschen sehr viel einfacher ist, eine Anweisung wie ADD 1 , REG 1 (»Addiere 1 zu dem Wert in Register 1«) zu verstehen statt 01011101. In der Ära unmittelbar nach der Maschinensprache schrieben die Programmierer ihre Programme in der sogenannten Assembler-Sprache und übergaben sie dann einem Programm, das als Assembler bezeichnet wird und das alle diese Anweisungen in äquivalente Befehle in Maschinensprache übersetzte.
Das von Menschen geschriebene Programm wird als Quellcode bezeichnet, weil es die Quelle allen Ungemachs ist. Nur ein Scherz – natürlich heißt er so, weil er die Quelle für das Programm darstellt. Die vom Computer ausgeführten Einsen und Nullen werden hingegen als Objektcode bezeichnet.
Nachfolgend sehen Sie die ersten Assembler-Anweisungen des Programms Con version, kompiliert für die Ausführung auf einem Intel-Prozessor unter dem Betriebssystem Windows. Dies ist dieselbe Information, die oben in Binärform gezeigt wurde.
<main>: push ebp
<main+1>: mov ebp,esp
<main+3>: and esp, 0xfffffff0
<main+6>: sub esp, 0x20
<main+9>: call 0x40530c <_main>
<main+14>: movl [esp+0x04],0x477024
<main+22>: movl [esp],0x475f80
<main+29>: call 0x469fac <operator<<>
<main+34>: lea eax,[esp+0x14]
<main+38>: mov [esp+0x04],eax
Das ist immer noch nicht gut verständlich, aber schon sehr viel besser als nur eine Folge aus Nullen und Einsen. Machen Sie sich aber keine Gedanken – in diesem Buch werden wir keine Programme in Assembler-Sprache schreiben.
Der Computer führt auch nie Anweisungen in Assembler-Sprache aus. Er führt die Maschinenbefehle aus, die aus der Umwandlung der Assembler-Anweisungen entstehen.
Höhere Sprachen
Die Assembler-Sprache merkt man sich vielleicht leichter als die Maschinensprache, aber es besteht immer noch ein riesiger Unterschied zwischen einem Algorithmus wie dem Reifenwechsel-Algorithmus und einer Abfolge von MOVE- und ADD-Anweisungen. In den 1950er-Jahren begann man, immer aussagekräftigere Sprachen zu entwickeln, die von einem sogenannten Compiler automatisch in Maschinensprache umgewandelt werden konnten. Man sprach auch von höheren Programmiersprachen, weil sie mit einem höheren Abstraktionsgrad geschrieben wurden als die Assembler-Sprache.
Eine der ersten dieser Sprachen war COBOL (Common Business-Oriented Language). Die Idee hinter COBOL war es, dem Programmierer zu ermöglichen, Befehle zu schreiben, die englischen Sätzen so ähnlich wie möglich waren. Plötzlich konnten die Programmierer Sätze wie die folgenden schreiben, um Temperatur von Celsius in Fahrenheit umzuwandeln (ob Sie es glauben oder nicht, das ist genau das, was die oben gezeigten Ausschnitte aus den Programmen in Maschinen- und Assemblersprache machen):
INPUT CELSIUS_TEMP
SET FAHRENHEIT_TEMP TO CELSIUS_TEMP * 9/5 + 32
WRITE FAHRENHEIT_TEMP
Die erste Zeile dieses Programms liest eine Zahl von der Tastatur oder aus einer Datei ein und speichert sie in der Variablen CELSIUS_TEMP. Die nächste Zeile multipliziert diese Zahl mit 9/5 und addiert 32 zum Ergebnis, um die äquivalente Temperatur in Grad Fahrenheit zu berechnen. Dieses Ergebnis speichert das Programm in einer Variablen namens FAHRENHEIT_ TEMP. Die letzte Programmzeile gibt diesen umgewandelten Wert auf dem Display aus.
Man fuhr damit fort, weitere Programmiersprachen zu entwickeln, die alle ihre ganz eigenen Stärken und Schwächen hatten. Einige Sprachen, wie beispielsweise COBOL, waren sehr wortreich, aber einfach zu lesen. Andere Sprachen, wie Datenbanksprachen oder die Sprachen für die Erstellung interaktiver Webseiten, wurden für sehr spezifische Aufgaben entworfen. Diese Sprachen verwenden leistungsstarke Konstrukte, um spezifische Problembereiche zu behandeln.
Die Sprache C++
C++ (ausgesprochen übrigens als »C plus plus«) ist eine symbolisch ausgelegte höhere Sprache. C++ entstand zunächst in den 1970er-Jahren als einfaches C in den Bell Labs. Ein paar Leute arbeiteten an einem neuen Konzept für ein Betriebssystem, das als Unix bezeichnet wurde (der Vorgänger von Linux und Mac OS und in der Industrie und der akademischen Welt heute noch verwendet). Die Originalsprache C, wie sie in den 1970er-Jahren in den Bell Labs entwickelt wurde, wurde 1989 leicht verändert und als weltweiter ISO-Standard eingeführt. C++ wurde als Erweiterung der grundlegenden Sprache C entwickelt, hauptsächlich, indem die Funktionen eingefügt wurden, die in den Teilen V und VI dieses Buchs beschrieben werden.
Wenn ich sage, C++ ist symbolisch, bedeutet das, dass es nicht sehr wortreich ist. Es verwendet Symbole statt der langen Wörter in Sprachen wie COBOL. C++ ist jedoch einfach zu lesen, wenn man sich erst einmal an die Bedeutung der Symbole gewöhnt hat. Der bereits in COBOL gezeigte Code für die Umwandlung von Celsius in Fahrenheit sieht in C++ wie folgt aus:
cin >> celsiusTemp;
fahrenheitTemp = celsiusTemp * 9 / 5 + 32;
cout << fahrenheitTemp;
Die erste Zeile liest einen Wert in die Variable celsiusTemp ein. Die nachfolgende Berechnung wandelt diese Celsius-Temperatur in Fahrenheit um, wie zuvor: Die dritte Zeile gibt das Ergebnis aus.
C++ hat noch mehrere weitere Vorteile im Vergleich zu anderen höheren Sprachen. Erstens ist C++ universell. Es gibt für fast jeden Computer einen C++-Compiler.
Darüber hinaus ist C++ effizient. Je mehr Aufgaben eine höhere Sprache automatisch erledigen will (um Ihnen die Programmierung zu erleichtern), desto weniger effizient ist der daraus erstellte Maschinencode in der Regel. Bei kleinen Programmen, wie sie in diesem Buch gezeigt werden, spielt das keine Rolle. Sehr relevant wird es jedoch, wenn Sie wirklich große Datenmengen manipulieren, wie beispielsweise die Bewegung von Pixeln auf dem Bildschirm, oder wenn Sie hervorragende Echtzeitleistung benötigen. Es ist kein Zufall, dass Unix und Windows in C++ geschrieben sind und das Macintosh-Betriebssystem in einer Sprache, die C++ sehr ähnlich ist.
Das Ziel der verbleibenden Kapitel in diesem Buch ist es, Ihnen die Programmierung in C++ näherzubringen. Sie brauchen sich nicht jedes Detail über C++ zu merken. Aber zum Schluss werden Sie es so gut kennen, dass Sie schon richtig gute Programme damit schreiben können.
2
Code::Blocks installieren
In diesem Kapitel
Den Kompilierungsvorgang genauer betrachten
Die Entwicklungsumgebung Code::Blocks installieren
Ihre Installation mit einem Standardprogramm testen
Häufige Fehler bei der Installation kennenlernen
In diesem Kapitel erfahren Sie, was Sie brauchen, um mit C++-Quellcode ausführbare Programme zu erstellen, die Sie auf Windows-, Linux- oder Macintosh-Computern ausführen können. Anschließend installieren Sie die integrierte Entwicklungsumgebung Code::Blocks, die im weiteren Verlauf des Buchs verwendet wird. Außerdem erstellen Sie ein Testprogramm, mit dem Sie Ihre Installation überprüfen können. Sobald alles funktioniert, also am Ende dieses Kapitels, können Sie schon anfangen, C++-Programme zu schreiben und zu kompilieren – natürlich mit ein bisschen Unterstützung!
Der Kompilierungsvorgang
Um Ihre eigenen C++-Programme schreiben zu können, brauchen Sie zwei Anwendungen: zunächst einen Texteditor, in den Sie Ihre C++-Anweisungen eingeben können. Dafür können Sie jeden beliebigen Editor nutzen, mit dem Sie einfache ASCII-Text-Buchstaben erzeugen können. Ich habe schon Programme im Editor von Windows geschrieben. Allerdings ist ein Editor zu bevorzugen, der die Syntax von C++ besser versteht. Damit ersparen Sie sich eine Menge Tipparbeit und manchmal erkennt das Programm Fehler, die Sie möglicherweise bei der Eingabe machen, ganz ähnlich wie eine Textverarbeitung falsch geschriebene Wörter kennzeichnet.
Das zweite Programm, das Sie brauchen, ist ein Compiler, der Ihre C++-Quellanweisungen in die Maschinensprache umwandelt, die der Computer versteht und interpretieren kann. Die Umwandlung von C++-Anweisungen aus dem Quellcode in Maschinensprache wird auch als Build oder Erstellungsprozess bezeichnet. Sie können sich das Ganze vorstellen, wie in Abbildung 2.1 gezeigt.
Der Erstellungsprozess für ein Programm besteht eigentlich aus zwei Schritten: Zuerst wandelt der C++-Compiler Ihre C++-Quellcodeanweisungen in ein von der Maschine ausführbares Format um. Diesen Schritt bezeichnet man auch als Kompilieren. Anschließend kombiniert er die Maschinenanweisungen aus Ihrem Befehl mit Anweisungen aus einem Satz Bibliotheken, die standardmäßig in C++ enthalten sind. Dieser zweite Schritt wird auch als Linken bezeichnet, wodurch ein vollständiges, ausführbares Programm erstellt wird.
Abbildung 2.1: Der Erstellungsprozess von C++-Programmen
Die meisten modernen C++-Compiler sind in einem Softwarepaket enthalten, das auch als IDE (Integrated Development Environment, Integrierte Entwicklungsumgebung) bezeichnet wird. IDEs enthalten den Editor, den Compiler sowie verschiedene andere Entwicklungsprogramme in einem Paket. Damit ersparen Sie sich nicht nur den einzelnen Kauf der Programme, sondern profitieren auch von der Produktivität, die die Kombination in einem einzigen Paket mit sich bringt:
Der Editor kann den Compiler schnell aufrufen, ohne dass Sie manuell umschalten müssen.
Die Editoren der meisten IDEs unterstützen schnelle und effiziente Methoden, Codierfehler zu finden und zu beheben.
Einige IDEs bieten visuelle Programmierwerkzeuge, die dem Programmierer gestatten, allgemeine Fenster auf dem Display mit Hilfe grafischer Bausteine anzulegen, wie beispielsweise Dialogfelder.
Die IDE erzeugt den C++-Code, der erforderlich ist, um Fenster auf dem Bildschirm automatisch anzuzeigen.
So gut sich das anhört, der automatisch erstellte Code zeigt die Fenster nur an. Der eigentliche Code, der ausgeführt werden soll, wenn der Benutzer Schaltflächen in diesen Fenstern anklickt, muss trotzdem vom Programmierer erstellt werden.
Zweifellos sind diese visuellen IDEs eng mit einem spezifischen Betriebssystem verknüpft. Beispielsweise ist das beliebte Visual Studio eng mit der .NET-Umgebung in Windows verbunden. Ohne Kenntnisse über die .NET-Umgebung – und ein bisschen Windows – kann man Visual Studio nicht mit C++ (oder einer der anderen .NET-Sprachen) benutzen. Darüber hinaus laufen die resultierenden Programme nur in einer .NET-Umgebung.
In diesem Buch verwenden Sie eine C++-IDE aus dem Public Domain-Bereich, Code::Blocks. Es gibt Code::Blocks-Versionen für Windows, Linux und Mac OS. Die verschiedenen Versionen von Code::Blocks für diese drei Betriebssysteme (und ein paar weitere) stehen unter www.codeblocks.org zum kostenlosen Download zur Verfügung. Beim Schreiben dieses Buchs habe ich die Version 13.12 verwendet. Sie können die Programmdatei 13.12 für Windows auch unter www.dummies.com/extras/beginningprogrammingcplus plus herunterladen.
Für die Programme aus diesem Buch werden Sie Code::Blocks verwenden. Diese Programme sind so genannte Konsolenanwendungen, weil sie Eingaben aus einem Konsolenfenster entgegennehmen – und Text dort anzeigen. Das Ganze ist nicht so prickelnd wie die Programmentwicklung in Bildschirmfenstern, aber auf diese Weise können Sie sich ganz auf C++ konzentrieren, ohne sich um die Anforderungen einer fensterorientierten Umgebung kümmern zu müssen. Außerdem ermöglicht Ihnen die Verwendung von Konsolenanwendungen, dass alle Programme aus dem Buch in sämtlichen Umgebungen eingesetzt werden können, die Code::Blocks unterstützen.
Code::Blocks installieren
Die folgenden Anweisungen beschreiben die Installation von Code::Blocks auf einem Computer unter Windows, Mac OS oder Linux. Blättern Sie einfach zu dem Abschnitt für Ihr Betriebssystem.
Installation unter Windows
In diesem Abschnitt finden Sie detaillierte Installationsanweisungen für die Installation von Code::Blocks für Windows Version 13.12, das Sie unter www.dummies.com/extras/begin ningprogrammingcplus plus herunterladen können.
1. Laden Sie die Datei codeblocks-13.12mingw-setup.exe herunter.
Das ist ganz einfach.
2. Doppelklicken Sie auf die heruntergeladene Datei, um den Installationsprozess zu starten.
Abhängig davon, welche Windows-Version Sie verwenden, wird Ihnen möglicherweise eine Warnung wie die folgende angezeigt:
MÖCHTEN SIEZULASSEN, DASSDURCHDASFOLGENDE PROGRAMMVONEINEMUNBEKANNTEN HERSTELLER ÄNDERUNGENANDIESEM COMPUTERVORGENOMMENWERDEN?
3. Wählen Sie JA.
Das Setup-Programm entpackt die Dateien, die es benötigt, um den Setup-Assistenten von Code::Blocks zu starten und auszuführen. Dies kann ein paar Minuten dauern. Nachdem der Prozess abgeschlossen ist, wird das Startfenster angezeigt, wie in Abbildung 2.2 gezeigt.
Abbildung 2.2: Der Setup-Assistent von Code::Blocks führt Sie durch den Installationsprozess.
4. Schließen Sie alle anderen Programme, die möglicherweise gerade ausgeführt werden, und klicken Sie auf NEXT.
Der Setup-Assistent zeigt die generische Endbenutzer-Lizenzvereinbarung (EULA, End User License Agreement) an. Nichts, worüber man sich aufregen müsste.
5. Wählen Sie I AGREE.
Der Setup-Assistent zeigt eine Liste der Komponenten an, die Sie installieren können, wie in Abbildung 2.3 gezeigt. Sie können bedenkenlos die Standardwerte übernehmen.
Es ist unabdingbar, dass die Option MINGW COMPILER SUITE aufgelistet und markiert ist. Mit dieser Option wird der C++-Compiler installiert.
6. Wählen Sie NEXT.
Im nächsten Fenster werden Sie aufgefordert, den Installationsstandort zu wählen. Außerdem erfahren Sie hier, wie viel Speicherplatz Code::Blocks auf Ihrer Festplatte benötigt (ca. 250 MB, abhängig von den ausgewählten Optionen) und wie viel Speicher zur Verfügung steht. Falls Sie nicht über genügend Festplattenspeicher verfügen, müssen Sie ein paar Ihrer YouTube-Videos löschen, um Platz zu schaffen.
7. Der standardmäßig angebotene Installationsort ist in Ordnung, wenn Sie also davon überzeugt sind, über genügend Festplattenspeicher zu verfügen, klicken Sie auf INSTALL.
Abbildung 2.3: Durch Markieren von MINGW COMPILER SUITE wird der GNU-C++-Compiler installiert, den Code::Blocks für die Kompilierung Ihrer Programme verwendet.
Jetzt macht sich der Setup-Assistent von Code::Blocks wirklich an die Arbeit. Er extrahiert Dutzende Dateien, die in unzähligen Unterverzeichnissen gespeichert werden, und das in einer Geschwindigkeit, der wir Sterbliche nicht folgen können. Dieser Prozess kann mehrere Minuten dauern.
8. Nachdem die Installation abgeschlossen ist, wird ein Dialogfeld angezeigt, in dem Sie gefragt werden, ob Sie Code::Blocks jetzt ausführen wollen. Klicken Sie auf NO.
Wenn bisher alles geklappt hat, sollte Ihr Fenster mit der Fertigmeldung der Installation wie in Abbildung 2.4 gezeigt aussehen.
Abbildung 2.4: Das Fenster mit der Fertigmeldung der Installation zeigt an, dass Code::Blocks erfolgreich installiert wurde.
9. Klicken Sie auf NEXT.
Schließlich wird ein Fenster angezeigt, in dem Sie darüber informiert werden, dass der Assistent (Code::Blocks Setup Wizard) beendet wird. In diesem letzten Schritt werden die Symbole für das Starten der Anwendung erstellt.
10. Klicken Sie auf FINISH.
Damit haben Sie Code::Blocks installiert, Sie müssen aber noch sicherstellen, dass es ordnungsgemäß für die Programme in diesem Buch eingerichtet wurde. Lesen Sie weiter im Abschnitt »Code::Blocks einrichten« später in diesem Kapitel.
Installation unter Ubuntu Linux
Code::Blocks enthält in der Linux-Installation den gcc-Compiler nicht, die Installation erfolgt deshalb in zwei Schritten. Zuerst müssen Sie gcc installieren. Anschließend installieren Sie Code::Blocks.
gcc installieren
Der gcc-Compiler steht in Linux unmittelbar zur Verfügung. Gehen Sie wie folgt vor, um ihn zu installieren:
1. Geben Sie an einer Eingabeaufforderung die folgenden Befehle ein:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install g++
Die Standard-Distribution von Ubuntu Linux enthält einen GNU C-Compiler, aber nicht die C++-Erweiterungen. Insbesondere umfasst es nicht die C++ 2011 Standard-Erweiterungen. Die beiden ersten Befehle führen ein Update und ein Upgrade für die bereits vorhandenen Tools durch. Der dritte Befehl installiert C++.
2. Geben Sie an einer Eingabeaufforderung den folgenden Befehl ein:
gcc ––version
Mein Ubuntu 13.04 hat GNU C++ Version 4.7.3 heruntergeladen. Sie sollten jedoch auch mit Version 4.7.1 oder älter zurechtkommen. Wenn Sie eine ältere Version haben, werden einige der Merkmale von C++ 2011 nicht funktionieren, aber im Prinzip sollte sie ausreichend sein.
Auch bei Debian Linux werden diese Befehle verwendet. Wenn Sie Red Hat Linux verwenden, ersetzen Sie den Befehl apt -get durch yum, dann erhalten Sie schließlich
sudo yum install g++
Code::Blocks installieren
Zum Glück für alle Beteiligten gibt es im Ubuntu Software Center eine Ubuntu-fähige Version von Code::Blocks. Für viele andere Linux-Versionen gibt es etwas Ähnliches im Software Center. Gehen Sie wie folgt vor, um Code::Blocks zu installieren:
1. Klicken Sie auf dem Ubuntu-Desktop auf das Symbol SOFTWARE CENTER.
2. Wählen Sie in der Liste der verfügbaren Software Code::Blocks aus.
Der Installationsprozess beginnt.
Code::Blocks durchsucht Ihre Festplatte nach Ihrem C++-Compiler. Wenn es Ihren C++-Compiler gefunden hat, sind Sie fertig.
Wenn Code::Blocks Ihren C++-Compiler nicht findet, führen Sie die folgenden Schritte aus.
3. Starten Sie Code::Blocks.
4. Wählen Sie SETTINGS | COMPILER.
5. Gehen Sie auf die Registerkarte COMPILER FLAGS.
6. Gehen Sie auf die Registerkarte TOOLCHAIN EXECUTABLES.
7. Wählen Sie das Symbol »…«.
8. Wechseln Sie zu /usr, es sei denn, Sie haben Ihren gcc-Compiler an einer anderen Stelle als am Standardinstallationsort /user/bin abgelegt.
9. Stellen Sie im Dialogfeld die folgenden Optionen ein: »C compiler« sollte gcc sein, der »C++ compiler« sollte g++ sein, und der »Linker for dynamic libs« sollte g++ sein.
10. Wählen Sie OK, um das Fenster zu schließen.
Blättern Sie zum Abschnitt »Code::Blocks einstellen« in diesem Kapitel, um sicherzustellen, dass Code::Blocks ordnungsgemäß für die Programme in diesem Buch eingerichtet ist.
Installation unter Mac OS
Die Macintosh-Version von Code::Blocks basiert auf der Xcode-Distribution von Apple für seinen Computer.
Xcode installieren
Xcode ist ein kostenloses Entwicklungspaket von Apple. Sie brauchen es. Gehen Sie wie folgt vor, um es zu installieren:
1. Öffnen Sie den Safari-Browser und wählen Sie http://developer.apple.com.
2. Klicken Sie auf Download Xcode, um die neueste Version zu erhalten.