E-Book, Deutsch, 547 Seiten
Reihe: Rheinwerk Computing
Theis Einstieg in C++
2. Auflage 2020
ISBN: 978-3-8362-7865-2
Verlag: Rheinwerk
Format: PDF
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: PDF
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....




