Montag, 28. Mai 2012

Buchempfehlung: Kalista, Heiko - C++ für Spieleprogrammierer (2009)

  • geeignet für: Anfänger
  • Erklärt alle wichtigen Aspekte der C++-Programmierung sehr verständlich
  • Bietet anschauliche Beispiele aus dem Bereich der Spieleprogrammierung
  • Leitet den Leser sehr gut von den grundlegenden Kenntnissen zum ersten selbst programmierten Spiel
ISBN: 978-3-446-42140-0 Preis: 34,90€

Randomizer

Der Randomizer (Zufallsgenerator) ist eines meiner ersten Projekte in C++. Mit ihm ist es möglich aus beliebig viele Eingaben eine zufällige auszuwählen. Wer möchte kann den Randomizer auch weiterentwickeln und an seine Bedürfnisse anpassen. Viel Spass beim Ausprobieren!

Update: 24.02.2013 - Bugfixes, kann nun mit beliebig vielen Eingaben umgehen
Update: 28.02.2013 - Bugfixes, verschiedene Versionen für Linux und Windows
Update: 09.05.2013 - kann nun auch Dateien lesen (Ein Element pro Zeile)

Downloads:
Download 1 (Sourcecode)
Download 2 (Programm Linux)
Download 3 (Programm Windows)

Sonntag, 27. Mai 2012

Die C++ Standard-Bibliothek

Die C++ Standard-Bibliothek stellt einige "Werkzeuge" zur Verfügung, mit deren Hilfe das Programmieren sehr viel einfacher wird. Einen Bestandteil dieser Library haben wir bereits in meinem ersten C++ Tutorial kennengelernt, nämlich die Datei iostream, welche durch #include eingebunden wurde. Neben der Ein- und Ausgabe von Text stellt die C++-Standard-Library noch 8 weitere Klassen bzw. Funktionen zur Verfügung. Die 9 Bestandteile sind:
  • String
  • Numerische Berechnungen
  • Fehlerbehandlung
  • Ein- und Ausgabe
  • Laufzeit-Typerkennung
  • Nationale Besonderheiten
  • Speicher-Verwaltung
  • Hilfsfunktionen
  • Standard Template Library (STL)
Was diese Funktionen und Klassen bewirken und wie man sie anwendet werde ich später in diesem Post noch erklären.
Wer meinen Artikel Einführung in C++ gelesen hat weiß, dass der Vorgänger von C++ die Programmiersprache C ist. Aus diesem Grund beinhaltet die C++ Standard-Library auch die C-Standard-Library, welche 18 Header-Dateien bereitstellt. Diese werde ich in der folgenden Tabelle vorstellen.

Header-Datei Erklärung
<cassert> Wenn der Ausdruck nicht wahr ist, bricht das Programm mit einer Fehlermeldung ab
<cctype> Klassifizierung von Zeichen
<cerrno> Error-Fehlernummern für Bibliotheksfunktionen
<climits> Minimaler und maximaler Wert von Ganzzahl-Typen
<cfloat> Minimaler und maximaler Wert von Fließkommazahl-Typen
<ciso646> Operatormakros
<clocale> Kulturelle Besonderheiten abbilden
<cmath> Mathematische Funktionen
<csetjmp> Ausführung von nicht lokalen goto-Anweisungen
<csignal> Aktion, die bei einem bestimmten Signal ausgelöst wird
<cstdarg> Variable Argumentenlisten für Funktionen mit einer variablen Anzahl von Parametern
<cstddef> Definition von einfachen Typen und Makros wie z.B. den NULL-Zeiger
<cstdio> Ein- und Ausgabe auf die Konsole oder in Dateien
<cstdlib> Allgemeine Funktionen, z.B. zur Erstellung von Zufallszahlen
<cstring> C-Funktionen für nullterminierte Zeichenfelder
<ctime> Zeit- und Datumsfunktionen
<cwchar> Umwandlung von Strings zu Zahlen für den Unicode-Zeichensatz
<cwctype Zeichenuntersuchung für den Unicode-Zeichensatz

Diese Headerdateien müssen mit der Anweisung #include eingebunden werden. Desweiteren nutzen alle Header den Namensraum std, den wir im ersten C++ Tutorial bereits kennengelernt haben.

Nun werde ich, wie versprochen, die einzelnen Bestandteile der C++ Standard-Bibliothek vorstellen, die es neben der C-Standard-Library noch gibt.

String
Header-Datei Erklärung
<string> Ermöglicht die Erstellung und Manipulation von Strings

Numerische Berechnungen
Header-Datei Erklärung
<complex> Komplexe Zahlen
<valarray> Gleitkommaberechnung mit großen Datenmengen, die auf eindimensionale Zahlenfeldern basieren
<limits> Größeninformationen, wie z.B der minimale Wert
<numeric> Funktionen zur Summenbildung, der Differenz und des Skalarprodukts

Fehlerbehandlung
Header-Datei Erklärung
<exception> Ausnahmebehandlung
<stdexept> Fehlerreports

Ein- und Ausgabe
Header-Datei Erklärung
<istream> Eingabe
<ostream> Ausgabe
<iostream> Ein- und Ausgabe mit cin, cout und cerr
<iomanip> Manipulatoren für Ein- und Ausgabe
<ios> Grundlage für die Ein- und Ausgabe
<iofwd> Grundlage für die Ein- und Ausgabe
<fstream> Zeichen aus Dateien lesen oder in Dateien schreiben
<streambuf> Ein- und Ausgabe auf gebufferten Streams
<sstream> Zeichenketten lesen und in String-Objekte schreiben

Laufzeit-Typerkennung
Header-Datei Erklärung
<typeinfo> Laufzeit-Typinformation als Text

Nationale Besonderheiten
Header-Datei Erklärung
<local> Kulturelle Unterschiede der Zeichen

Speicherverwaltung
Header-Datei Erklärung
<memory> Speicheranforderung und -freigabe
<new> Speicheranforderung

 Hilfsfunktionen
Header-Datei Erklärung
<utility> Fügt 2 Werte zu einem Paar zusammen. Elemente bestehen aus einem Wert und einem Schlüssel. Der Schlüssel dient der Identifizierung
<functional> Definiert STL-Funktionen, die helfen Objekte zu konstruieren

Donnerstag, 24. Mai 2012

Textformatierung in C++

In C++ gibt es die Möglichkeit seinen Text mit Hilfe von sogenannten Escape-Sequenzen zu formatieren. Escape-Sequenzen kennzeichnen sich dadurch, dass sie immer mit einem Backslash beginnen. In der folgenden Tabelle werden die wichtigsten von ihnen vorgestellt.

Escape-Sequenz Bedeutung
\\ fügt einen Backslash ein
\" fügt ein Anführungszeichen ein
\0 Nullzeichen (Ende einer Zeichenkette)
\n Zeilenumbruch (new line)
\t horizontaler Tabulator
\v vertikaler Tabulator
\r kehrt zum Zeilenanfang zurück (carriage return)
\b löscht das letzte Zeichen (backspace)
\a akustisches Signal


Die Einbindung von Escape-Sequenzen in einen Quelltext funktioniert sehr leicht, wie das nachfolgende Beispiel zeigt.

C++

   cout << "Textformatierung\nin \"C++\"\nist\nsehr\neinfach\n";

Java

   System.out.println("Textformatierung\nin \"Java\"\nist ebenfalls\neinfach\n";

Dienstag, 22. Mai 2012

Das erste Programm in C++

Zunächst wird eine geeignete Entwicklungsumgebung (IDE) benötigt, um C++ Programme zu programmieren. In diesem Tutorial werde ich Visual C++ 2010 Express von Microsoft verwenden, es gibt jedoch auch gute Alternativen, wie z.B Code::Blocks oder Dev-C++. Solltest du sich gegen Visual C++ 2010 Express entscheiden achte beim Download der IDE darauf, dass ein Compiler integriert ist, der im besten Fall den neusten Standard C++11 unterstützt. Anderenfalls kann der Quelltext nicht in eine ausführbare Datei (exe) umgewandelt werden. Nachdem die IDE heruntergeladen und installiert wurde, steht dem ersten Programm nichts mehr im Wege.

Jetzt geht es los

Erstelle nun ein neues Projekt und wähle "Win32-Konsolenanwendung" aus. Nun muss noch ein Name eingegeben und auf OK geklickt werden. Im nächsten Fenster muss auf "Weiter" geklickt werden und dann unter "Zusätzliche Optionen" einen Haken bei "Leeres Projekt" gesetzt werden. Nachdem das Projekt erstellt wurde fehlt noch die C++-Datei, in welcher der Code gespeichert wird. Klicke dazu auf "Neues Element hinzufügen" und wähle "C++-Datei" aus. Nachdem du auf "Hinzufügen" geklickt hast kannst du dich endlich dem wesentlichen Teil widmen, dem Code.

Der Code

In der Regel beginnt jeder Programmierer mit einem sogenannten "Hello World"-Programm, da wir dieses Ritual natürlich nicht brechen wollen, schreiben wir uns ebenfalls ein solches Programm. Zunächst werde ich hier den Code vorstellen und ihn danach erklären.

1  #include <iostream>
2  
3  using namespace std;
4  
5  int main()
6  {
7      cout << "Hello World!" << endl;
8      
9      return 0;
10 } 

Wie, nur 10 Zeilen? Ist das nicht ein bisschen wenig? Nein, dieses Programm weist bereits die grundlegende Struktur auf, die in fast jedem C++ Programm gleich ist. Aus diesem Grund wird es auch so gerne als erstes Beispiel in Tutorials genommen. Kommen wir nun zur Erklärung.

In der ersten Zeile wird die Headerdatei "iostream" durch die Präprozessor-Direktive "#include" eingebunden. Dadurch werden bestimmte Funktionen zur Verfügung gestellt, die den Input und Output, also die Ein- und Ausgabe von Text regeln. Präprozessor-Direktiven werden immer vor dem nachfolgenden Code durch den Compiler eingebunden. Es gibt neben "#include" noch viele weitere Präprozessor-Direktiven.

In der dritten Zeile wird der Standard-Namensbereich (std) eingebunden, somit können wir Funktionen oder Variablen, welche in diesem Namensbereich gespeichert sind einfacher verwenden. Anderenfalls müsste man vor jeder std-Funktion oder Variable "std::" schreiben.

Nun kommen wir zum "Herz" unseres kleinen Programms, der main-Funktion. Die main-Funktion ist Teil eines jeden C++ Programms, diese wird beim Programmstart immer als erstes aufgerufen, von ihr ausgehend wird also das komplette Programm gesteuert.
Der Code einer jeden Funktion steht innerhalb von geschweiften Klammern { }, diese signalisieren den Beginn und das Ende einer jeden Funktion.
Die main-Funktion gibt immer einen Wert vom Datentyp int zurück, wird der Wert Null zurückgegeben bedeutet dies, dass keine Fehler aufgetreten sind. Eine solche Rückgabe erfolgt in Zeile 9 durch das Schlüsselwort return.

In Zeile 7 kommt nun der interessante Teil des Programms, für diese Zeile haben wir sowohl den Header "iostream" als auch den Namensbereich "std" eingebunden. Mit Hilfe des Befehls "cout" ist es möglich Text auf den Bildschirm auszugeben. Unschwer zu erkennen ist, dass hier der Text "Hello World!" ausgegeben werden soll. Dieser Text wird mit Hilfe des Umleitungsoperators "<<" an "cout" übergeben und muss immer in Anführungszeichen stehen. Durch den Befehl "endl" wird ein Zeilenumbruch erzeugt, wodurch möglicher folgender Code in eine neue Zeile gerückt wird.

Was ebenfalls auffällt ist, dass jede Befehlszeile mit einem Semikolon endet. Dies ist notwendig, damit der Compiler erkennt, dass ein Befehl zu Ende ist. Präprozessor-Direktiven und Funktionsköpfe benötigen jedoch kein Semikolon.

Nachdem der Code vollständig eingetippt wurde muss er nur noch kompiliert werden. In Visual C++ 2010 Express muss dazu F5 gedrückt werden. Sollten ihr eine andere Entwicklungsumgebung nutzen, schaut bitte in der Anleitung nach, welche Taste für das Kompilieren verwendet wird. Nun sollte sich ein Konsolenfenster öffnen, in welchem die Worte "Hello World!" zu lesen sind.
Manchmal kommt es vor, dass sich das Konsolenfenster nach einem kurzen Moment wieder von alleine schließt. Tritt dieser Fehler auf, so könnt ihr ihn durch den Aufruf cin.get()  (vor return 0) beheben.