E-Book, Deutsch, 547 Seiten
Reihe: Rheinwerk Computing
Theis Einstieg in C++
2. Auflage 2020
ISBN: 978-3-8362-7865-2
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection
Ideal zum Programmieren lernen
E-Book, Deutsch, 547 Seiten
Reihe: Rheinwerk Computing
ISBN: 978-3-8362-7865-2
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection
Mit diesem Buch gelingt Ihnen der Einstieg in die C++-Entwicklung mühelos. Anschauliche Erklärungen, praxisnahe Beispiele und Übungen begleiten Sie von den ersten Schritten bis zum fertigen Programm. Sie lernen alle wichtigen Themen wie Vererbung, Objektorientierung, Polymorphie, GUI-Entwicklung und Datenbanken. Kenntnisse in C oder einer anderen Sprache werden nicht vorausgesetzt.
Aus dem Inhalt:
- Sprachgrundlagen
- Referenzen und Pointer
- Objektorientierte Programmierung
- Vererbung und Polymorphie
- Moderne Bibliotheken: chrono, random, thread, filesystem
- Arbeiten mit Containern
- GUI-Entwicklung mit Qt
- Datenbanken mit SQLite verwalten
Die Fachpresse zur Vorauflage:
iX - Magazin für professionelle Informationstechnik: »Wer C++ lernen will oder eine Auffrischung auf C++11 benötigt, dürfte Gefallen an dem knapp 520 Seiten starken Lehrbuch finden.«
Thomas Theis ist Dipl.-Ing. für Technische Informatik und arbeitet als Berater und Trainer. Seit vielen Jahren gibt er als EDV-Dozent Kurse in verschiedenen Programmiersprachen. Er ist Autor vieler erfolgreicher Fachbücher.
Autoren/Hrsg.
Weitere Infos & Material
Materialien zum Buch ... 17 1. Eine erste Einführung ... 19 1.1 ... Was machen wir mit C++? ... 19 1.2 ... Was benötige ich zum Programmieren? ... 20 1.3 ... Die Entwicklung von C++ ... 20 1.4 ... So sieht das erste Programm aus ... 21 1.5 ... Kommentieren Sie Ihre Programme ... 22 2. Arbeiten mit Zahlen und Operatoren ... 25 2.1 ... Wie speichere ich Zahlen? ... 25 2.2 ... Rechnen mit Operatoren ... 27 2.3 ... Fehler suchen ... 29 2.4 ... Wie können Daten eingegeben werden? ... 31 2.5 ... Zahlen formatieren mit Manipulatoren ... 33 2.6 ... Zuweisungen kürzer schreiben ... 34 2.7 ... Übung ... 36 2.8 ... Mehr über die Speicherung von Zahlen ... 37 2.9 ... Feste Werte in Konstanten speichern ... 41 2.10 ... Konstanten in Enumerationen zusammenfassen ... 42 2.11 ... Zahlensysteme ... 43 2.12 ... Initialisierung ... 45 2.13 ... Wie erzeuge ich zufällige Zahlen? ... 47 2.14 ... Übung ... 48 3. Mehrere Zweige in einem Programm ... 49 3.1 ... Zwei Zweige mit »if« und »else« ... 49 3.2 ... Bedingungen benötigen Vergleiche ... 51 3.3 ... Mehr als zwei Zweige ... 53 3.4 ... Wie kann ich Bedingungen kombinieren? ... 55 3.5 ... Zweige zusammenfassen mit »switch« und »case« ... 57 3.6 ... Was ist mit dem Rest? ... 58 3.7 ... Welcher Operator hat Vorrang? ... 59 3.8 ... Übungen ... 60 3.9 ... Wie speichere ich Wahrheitswerte? ... 63 3.10 ... Die Kurzform: der bedingte Ausdruck ... 65 4. Teile von Programmen wiederholen ... 67 4.1 ... Regelmäßige Wiederholungen mit »for« ... 67 4.2 ... Wiederholungen für einen Bereich ... 70 4.3 ... Bedingte Wiederholungen mit »do-while« ... 71 4.4 ... Besser vorher prüfen mit »while« ... 72 4.5 ... Wiederholungen abbrechen oder fortsetzen ... 73 4.6 ... Die Wiederholung der Wiederholung ... 75 4.7 ... Übungen ... 76 5. Programme aufteilen in Funktionen ... 79 5.1 ... So schreibe ich eine eigene Funktion ... 79 5.2 ... Wie übergebe ich Daten? ... 81 5.3 ... Wie erhalte ich ein Ergebnis zurück? ... 87 5.4 ... Mehr Ordnung im Programm ... 88 5.5 ... Statische Variablen behalten ihren Wert ... 90 5.6 ... Fehler suchen ... 91 5.7 ... Übungen ... 92 5.8 ... Standardwerte vorgeben ... 93 5.9 ... Beliebig viele Parameter ... 94 5.10 ... Funktionen mehrfach definieren ... 96 5.11 ... Funktionen, die sich selbst aufrufen ... 98 5.12 ... Anonyme Funktionen ... 99 5.13 ... Funktionen als Parameter ... 105 6. Große Datenmengen speichern in Feldern ... 109 6.1 ... Wie werden Felder unterschieden? ... 109 6.2 ... Einfache Felder mit fester Größe ... 110 6.3 ... Intelligente Felder mit fester Größe ... 111 6.4 ... Ausnahmen behandeln ... 113 6.5 ... Einfache und intelligente Zeiger ... 115 6.6 ... Intelligente Felder mit variabler Größe ... 122 6.7 ... Felder initialisieren ... 124 6.8 ... Felder als Parameter ... 125 6.9 ... Daten in mehreren Dimensionen speichern ... 127 6.10 ... Übungen ... 131 7. Arbeiten mit Zeichen und Texten ... 133 7.1 ... Einzelne Zeichen ... 133 7.2 ... Einfache Zeichenketten ... 134 7.3 ... Intelligente Zeichenketten: Strings ... 137 7.4 ... Wie wandle ich Zahlen in Strings um? ... 143 7.5 ... Wie verarbeite ich Eingaben? ... 144 7.6 ... Felder von Zeichenketten ... 147 7.7 ... Suchen und Ersetzen ... 149 7.8 ... Übungen ... 154 8. Daten in Strukturen zusammenfassen ... 157 8.1 ... Wie speichere ich zusammengehörige Daten? ... 157 8.2 ... Besser einen Typ definieren ... 159 8.3 ... Strukturen und Felder ... 161 8.4 ... Strukturen und Funktionen ... 165 8.5 ... Eine Hierarchie von Strukturen ... 170 8.6 ... Übung ... 172 9. Vorhandene Funktionen nutzen ... 175 9.1 ... Umgang mit Datum und Uhrzeit ... 175 9.2 ... Bessere zufällige Zahlen ... 181 9.3 ... Mehrere Threads zur gleichen Zeit ... 184 9.4 ... Nützliche mathematische Funktionen ... 193 9.5 ... Übungen ... 202 9.6 ... Rechnen mit komplexen Zahlen ... 203 9.7 ... Daten mit dem Betriebssystem austauschen ... 210 9.8 ... Zugriff auf Dateien und Verzeichnisse ... 219
10. Eigene Klassen entwerfen ... 237 10.1 ... Klassen umfassen Eigenschaften und Methoden ... 237 10.2 ... Schützen Sie die Daten ... 240 10.3 ... Wie erzeuge und lösche ich Objekte? ... 244 10.4 ... Statische Elemente einer Klasse ... 248 10.5 ... Wie überlade ich Operatoren? ... 252 10.6 ... Objekte und Felder ... 256 10.7 ... Objekte ausgeben ... 260 10.8 ... Eigenschaften können Objekte sein ... 262 10.9 ... Übungen ... 264
11. Vererbung und Polymorphie ... 269 11.1 ... Basisklasse und abgeleitete Klassen ... 269 11.2 ... Welche Elemente sind an welcher Stelle erreichbar? ... 276 11.3 ... Konstruktoren in abgeleiteten Klassen ... 277 11.4 ... Was bedeutet Polymorphie? ... 281 11.5 ... Erben von mehreren Klassen ... 284
12. Datenströme verarbeiten ... 289 12.1 ... Sequenzielles Schreiben und Lesen ... 289 12.2 ... Schreiben und Lesen an beliebiger Stelle ... 296 12.3 ... Wie leiten Sie Datenströme? ... 305 12.4 ... Wie ist das CSV-Format zum Austausch aufgebaut? ... 308 12.5 ... Übung ... 315
13. Container sind vielfältige Datenstrukturen ... 319 13.1 ... Wie durchlaufe ich Container? ... 320 13.2 ... Intelligente Felder mit fester Größe ... 322 13.3 ... Intelligente Felder mit variabler Größe ... 326 13.4 ... Eine Warteschlange mit zwei Enden ... 330 13.5 ... Daten in Listen verketten ... 334 13.6 ... Drei einfache Container ... 344 13.7 ... Zwei nützliche Typen ... 351 13.8 ... Eine Menge von Elementen ... 355 13.9 ... Schlüssel und Werte in einer Map ... 362 13.10 ... Algorithmen für Bereiche ... 369 13.11 ... Mengenlehre ... 374 13.12 ... Eine Menge von Bits ... 378
14. Mehr zu eigenen Klassen ... 383 14.1 ... Objekte initialisieren, kopieren und erzeugen ... 383 14.2 ... Klassen können Freunde haben ... 386 14.3 ... Namen müssen eindeutig sein ... 389 14.4 ... Fehler behandeln mit Ausnahmen ... 392 14.5 ... Innere Klassen ... 400 14.6 ... Templates sind Vorlagen ... 402
15. Präprozessor-Anweisungen ... 409 15.1 ... Einbinden von Dateien ... 409 15.2 ... Definitionen und Makros ... 410 15.3 ... Definitionen und Verzweigungen ... 412 15.4 ... Eine Systemweiche ... 414
16. Grafische Benutzeroberflächen mit der Qt-Bibliothek ... 417 16.1 ... Die erste GUI-Anwendung ... 418 16.2 ... Ein einfacher Kopfrechentrainer ... 429 16.3 ... Ein erweiterter Kopfrechentrainer ... 434 16.4 ... Weitere Widgets ... 441
17. Datenbanken mit SQLite verwalten ... 449 17.1 ... Der Aufbau einer Datenbank ... 449 17.2 ... Wie erzeuge ich Datenbank und Tabelle? ... 450 17.3 ... Wie speichere ich Daten in einer Tabelle? ... 455 17.4 ... So zeige ich alle Daten einer Tabelle an ... 457 17.5 ... Wie wähle ich bestimmte Daten aus? ... 460 17.6 ... Der Benutzer wählt Daten aus ... 464 17.7 ... Daten sollten sortiert werden ... 465 17.8 ... Wie ändere ich Daten? ... 466 17.9 ... Vorsicht beim Löschen von Daten ... 468 17.10 ... Eine Datenbank mit mehreren Tabellen ... 469 17.11 ... Projekt Vokabeln ... 476 17.12 ... Übung ... 497 Anhang ... 501 A ... Installationen ... 501 B ... Hilfestellungen und Übersichten ... 525 Index ... 531
2.8 Mehr über die Speicherung von Zahlen
Sie können an dieser Stelle bereits mit dem nächsten Kapitel fortfahren und die weiteren Abschnitte dieses Kapitels bei Bedarf später bearbeiten. Sie dienen der Ergänzung Ihres Wissens.
Für ganze Zahlen werden häufig Variablen des Datentyps int genutzt. Es gibt aber noch weitere ganzzahlige Datentypen. Ihre Gemeinsamkeit: Ganze Zahlen werden in den Variablen mathematisch genau gespeichert. Die verschiedenen Datentypen unterscheiden sich im Speicherbedarf und im gültigen Wertebereich.
Für Fließkommazahlen werden häufig Variablen des Datentyps double genutzt. Auch hier gibt es weitere Datentypen. Sie unterscheiden sich ebenfalls im Speicherbedarf und im gültigen Wertebereich. Zudem bieten sie eine unterschiedliche Genauigkeit. Sie sind allerdings niemals mathematisch genau.
2.8.1 Ganzzahlige Datentypen
Zunächst ein Programm mit den ganzzahligen Datentypen:
#include
using namespace std;
int main()
{
cout << "short: " << sizeof(short) << " Byte, ";
cout << "von " << SHRT_MIN << " bis " << SHRT_MAX << endl;
cout << "unsigned short: "
<< sizeof(unsigned short) << " Byte, ";
cout << "von 0 bis " << USHRT_MAX << endl;
cout << "int: " << sizeof(int) << " Byte, ";
cout << "von " << INT_MIN << " bis " << INT_MAX << endl;
int a = 42;
cout << "unsigned int: " << sizeof(unsigned int) << " Byte, ";
cout << "von 0 bis " << UINT_MAX << endl;
unsigned int b = 42U;
cout << "long: " << sizeof(long) << " Byte, ";
cout << "von " << LONG_MIN << " bis " << LONG_MAX << endl;
long c = 42L;
cout << "unsigned long: " << sizeof(unsigned long) << " Byte, ";
cout << "von 0 bis " << ULONG_MAX << endl;
unsigned long d = 42UL;
cout << "long long: " << sizeof(long long) << " Byte, ";
cout << "von " << LLONG_MIN << " bis " << LLONG_MAX << endl;
long long e = 42LL;
cout << "unsigned long long: "
<< sizeof(unsigned long long) << " Byte, ";
cout << "von 0 bis " << ULLONG_MAX << endl;
unsigned long long f = 42ULL;
int x = 2'000'000'000;
cout << "Viele Ziffern: " << x << endl;
}
Listing 2.6 Datei »datentyp_ganz.cpp«
Es werden die ganzzahligen Datentypen short, int, long und long long zusammen mit ihren vorzeichenlosen Varianten vorgestellt.
Die Bezeichnung unsigned bedeutet vorzeichenlos, also ohne Vorzeichen. Das Gegenteil von unsigned ist signed und bedeutet vorzeichenbehaftet, also mit Vorzeichen. Variablen eines vorzeichenlosen Datentyps können nur den Wert 0 oder einen positiven Wert annehmen. Allerdings ist ihr Wertebereich doppelt so groß wie der Wertebereich des zugehörigen vorzeichenbehafteten Datentyps.
Der Operator sizeof liefert den compiler-abhängigen Speicherbedarf des genannten Datentyps oder der genannten Variablen in Byte.
Konstanten dienen zur Speicherung von unveränderlichen Werten. C++ stellt eine Reihe von Systemkonstanten zur Verfügung, u. a. zur Speicherung der Grenzen der verschiedenen Wertebereiche. Sie werden mithilfe des Headers climits zur Verfügung gestellt. In Abschnitt 2.9, »Feste Werte in Konstanten speichern«, sehen Sie, wie Sie eigene Konstanten definieren können.
Ganze Zahlen werden standardmäßig dem passenden Datentyp zugeordnet. Falls Sie den Datentyp selbst festlegen möchten, müssen Sie die zugehörigen Literale verwenden. Die Zahl 42 wird als int-Wert erkannt, die Zahl 42U als unsigned int-Wert, die Zahl 42L als long-Wert, die Zahl 42UL als unsigned long-Wert, die Zahl 42LL als long long-Wert und die Zahl 42ULL als unsigned long long-Wert. Bei den Literalen können auch Klein- statt Großbuchstaben genutzt werden.
Seit C++14 kann der Apostroph als Trennzeichen zur besseren Lesbarkeit von langen Ziffernfolgen eingesetzt werden.
Die Angaben für den Speicherbedarf und den Wertebereich sind compiler-abhängig. Bei der Nutzung von MinGW unter Windows sehen Sie die folgende Ausgabe:
unsigned short: 2 Byte, von 0 bis 65535
int: 4 Byte, von -2147483648 bis 2147483647
unsigned int: 4 Byte, von 0 bis 4294967295
long: 4 Byte, von -2147483648 bis 2147483647
unsigned long: 4 Byte, von 0 bis 4294967295
long long: 8 Byte, von -9223372036854775808 bis 9223372036854775807
unsigned long long: 8 Byte, von 0 bis 18446744073709551615
Viele Ziffern: 2000000000
Bei der Nutzung des GCC-Compilers unter Ubuntu Linux oder des Clang-Compilers unter macOS stehen dem Datentyp long acht Byte zur Verfügung. Es folgt der zugehörige Teil der Ausgabe:
unsigned long: 8 Byte, von 0 bis 18446744073709551615
2.8.2 Datentypen für Fließkommazahlen
Es folgt ein Programm mit den Datentypen für Fließkommazahlen:
#include
#include
using namespace std;
int main()
{
cout << "float: " << sizeof(float) << " Byte, ";
cout << "von " << FLT_MIN << " bis " << FLT_MAX << endl;
cout << "double: " << sizeof(double) << " Byte, ";
cout << "von " << DBL_MIN << " bis " << DBL_MAX << endl;
cout << "long double: " << sizeof(long double) << " Byte, ";
cout << "von " << LDBL_MIN
<< " bis " << LDBL_MAX << endl;
cout << fixed << setprecision(30);
cout << "1/7 in float: " << 1.0F / 7 << endl;
cout << "1/7 in double: " << 1.0 / 7 << endl;
cout << "1/7 in long double: " << 1.0L / 7 << endl;
}
Listing 2.7 Datei »datentyp_fliesskomma.cpp«
Sie sehen die Angaben für die Datentypen float, double und long double. Die Konstanten für die Grenzen der Wertebereiche werden mithilfe des Headers cfloat zur Verfügung gestellt.
Bei der Ausgabe und bei der Eingabe sehr großer oder sehr kleiner Zahlenwerte empfiehlt sich die Exponentialschreibweise, also mit kleinem e oder auch großem E. Sie sehen sie bei der Ausgabe der Grenzen der Wertebereiche. Zwei weitere Beispiele:
5.2e3 = 5.2 * 103 = 5.2 * 1000 = 5200
5.2e-3 = 5.2 * 10-3 = 5.2 * 0.001 = 0.0052
Anhand der Division von 1 durch 7 wird die unterschiedliche Genauigkeit verdeutlicht. Das mathematisch genaue Ergebnis enthält unendlich oft die Zahlenfolge 142857. Beim Datentyp float wird ab der 9. Stelle nach dem Komma davon abgewichen, beim Datentyp double ab der 17. Stelle, beim Datentyp long double ab der 21. Stelle.
Fließkommazahlen werden standardmäßig dem Datentyp double zugeordnet. Falls Sie den Datentyp selbst festlegen möchten, müssen Sie auch hier die zugehörigen Literale verwenden....