Hey ya! ✌️ Willkommen in unserem C++ Kurs im Wintersemester 2018/19. Bevor es losgeht, ein paar Details zu unserem Kurs
- Dienstags, 3. DS
- Ort: APB/E046
- Kursseite: www.cplusplus.wtf
Unser Kurs besteht aus drei Komponenten
Sämtliche Slides sowie Praxisaufgaben findest du auf der Kursinternetseite der jeweiligen Kurseinheit zum Download bereit. Das Skript ist separat auf der Webseite erreichbar.
!> Für das Sammeln von Credits ist ein Nutzerkonto auf unserer Kursseite erforderlich. Eine Freischaltung erfolgt über https://cplusplus.wtf/enrollment.
Ein Programm ist eine Vorschrift, nach der Informationen verarbeitet werden. Es besteht aus einer Folge von Vereinbarungen und Anweisungen. Es löst gestellte Aufgaben durch Manipulation von Daten.
Ein Editor ist eine Software zur Bearbeitung und Eingabe von Programmcode (Quelltext). Er unterscheidet sich von einer komfortablen Textverarbeitung dadurch, dass er keine unsichtbaren Formatierungsanweisungen in den Text einfügt, um ihn Absätze, Listen und Tabellen zu gliedern.
Prozessoren des Computers können nur Maschinenbefehle ausführen. Compiler übersetzen den Quellcode bereits vor der Laufzeit des Programms in Maschinenbefehle.
helfen dem Programmierer beim Suchen von logischen Fehlern. Man kann Haltepunkte setzen (Breakpoints) um Variablen auf Fehler zu testen.
Eine IDE ist eine Integrierte Entwicklungsumgebung (Abk. für **I**ntegrated **D**evelopment **E**nvironment) und vereint Editor, Compiler und Debugger unter einer einheitlichen Oberfläche.
Die strukturierte Programmierung ist die einfachste Art und Weise in der Programmierung. Innerhalb des Programmes geht man von Phasen aus, die abgegrenzt und hierarchisch sequentiell und/oder nebenläufig ausgeführt werden.
Programme werden immer komplexer, Quelltexte füllen hunderte von Seiten (führte zu einer Softwarekrise im Jahr 1970).
?> Wie können Programmerweiterungen, Verbesserungen usw. nachträglich eingebaut werden? Wie werden sie dokumentiert?
Erwartungen an das objektorientierte Paradigma
- Wiederverwendbarkeit
- Erweiterbarkeit
- Leichte Wartbarkeit
Um deinen C++ Quelltext auszuführen, gibt es zwei verschiedene Wege. Einen einfachen sowie einen etwas komplexeren Weg.
1️⃣ Der bequemste Weg ist die Ausführung mittels einer IDE. Wir empfehlen für den Einstieg JetBrains CLion. Diese wird im Kurs weiter thematisiert.
2️⃣ Alternativ via Compiler/Linker
- Quellcode in einem Texteditor eintippen und speichern
- Datei mit einem Compiler übersetzen und eine Objektdatei (
*.obj
oder*.o
) erzeugen lassen - Objektdatei mittels Linker binden, wodurch eine ausführbare Datei generiert wird.
#include <iostream>
using namespace std;
int main() {
return 0;
}
Bibliotheken werden ganz am Anfang mit einer Raute (#
) definiert. Der Name der Bibliothek steht dabei in spitzen Klammern.
iostream
deklariert die C++ Basisstreamroutinen (Input/Output)
Für weitere spezielle Funktionen gibt es viele weite Bibliotheken, die nach Bedarf eingebunden werden müssen.
Der komplette abzulaufende Programmcode findet im Hauptprogramm, innerhalb der main()
-Funktion statt. Dieses wird als Dateityp int (Ganzzahl) deklariert, da wir einen Rückgabewert von „0
“, also einer Zahl zurückgeben.
!> ☝️ Der Rückgabewert ist in C++ essentiell. C++ verlangt für jegliche Funktion einen Rückgabewert.
?>WTF!? Konsole wird automatisch geschlossen
Wenn ein Programm in einer Entwicklungsumgebung übersetzt wird und ausgeführt wird, passiert es oft, dass das Programm ausgeführt wird aber direkt wieder geschlossen wird. Um das Problem zu umgehen, wird zusätzlich die Bibliothek <cstdlib>
sowie die Funktion system("PAUSE");
im Hauptprogramm definiert.
Jede Anweisung in C++ wird mit einem abschließenden Semikolon beendet. Funktionen stehen innerhalb eines Codeblocks zwischen { }
.
Bezeichner sind Namen mit einer beliebigen Länge für Klassen, Objekte, Funktionen, Variablen sowie benutzerdefinierte Datentypen.
Dabei werden nur Buchstaben von a bis z, A bis Z, Unterstriche und Ziffern berücksichtigt. Umlaute oder sonstige (Sonder-)Zeichen sind nicht gestattet.
Sonderfall: Das erste Zeichen muss ein Buchstabe oder ein Unterstrich sein.
!> Groß- und Kleinschreibung beachten!
Art | Datentyp |
---|---|
Boolean | bool |
Charakter | char |
Ganze Zahl | int |
Floating-Point | float |
Doppel Gleitkomma | double |
Wertlos/Nulltyp | void |
Breitzeichen | wchar_t |
Eine Konstante wird behandelt wie eine Variable, welche einmalig bei ihrer Deklaration definiert wird. Für die Konstante wird const
genutzt.
Der Wert lässt sich nicht innerhalb des Programms ändern.
const float Pi = 3.14159;
const double Kosten = 1.85;
const char Zeichen = 'a';
Operatoren | Bezeichnung |
---|---|
* / % |
Multiplikation, Division und Rest |
+ − |
Addition und Subtraktion |
<< >> |
bitweise Rechts- und Linksverschiebung |
< <= |
kleiner-als und kleiner-gleich |
> >= |
größer-als und größer-gleich |
== != |
gleich und ungleich |
& |
bitweises AND |
^ |
bitweises XOR (entweder-oder) |
&& |
logisches AND |
= |
einfache Zuweisung (automatische Unterstützung ist in C++-Klassen Vorgabe) |
+= −= |
Zuweisung nach Addition/Subtraktion |
*= /= %= |
Zuweisung nach Multiplikation, Division, und Rest |
Für die Eingaben legen wir zunächst eine Variable inklusive des Datentyps fest, unter welcher Variable die Eingabe zwischengespeichert werden soll.
int Variable;
Wir haben nun eine Variable vom Datentyp int
(Ganzzahl) deklariert. Dies initiiert, dass unsere Eingabe auch eine Ganzzahl sein soll.
Die eigentliche Eingabe funktioniert mittels dem Befehl std::cin >>
std::cin >> Variable;
Im Gesamtbild mit dem C++ Grundgerüst sieht die Eingabe folgenderweise aus:
#include <iostream>
using namespace std;
int main() {
int Variable;
std::cin >> Variable;
return 0;
}
Für Ausgaben im Programm verwenden wir den Befehl std::cout <<
mit einer anschließenden Zeichenkette in Anführungszeichen.
std::cout<< "C++WTF!? ist cool." << std::endl;
Ein Zeilenumbruch wird über << std::endl
initiiert.
Im Gesamtbild mit dem C++ Grundgerüst sieht die Eingabe folgenderweise aus:
#include <iostream>
using namespace std;
int main() {
std::cout << "C++WTF!? ist cool." << std::endl;
return 0;
}
JetBrains ist ein tschechisches Software-Unternehmen und wurde im Jahr 2000 von den drei Russen gegründet. Das Unternehmen ist seitdem für seine seit 2001 entwickelte Java-Entwicklungsumgebung (IDE) IntelliJ IDEA bekannt.
⬇️ Für die Programmiersprachen C und C++ entwickelte JetBrains die IDE CLion. Die Software ist Cross-Plattform kompatibel und somit für die Betriebssysteme macOS, Linux und Windows erhältlich.
- CMake mind. Version 2.8.11, make
- GCC / G ++ oder Clang
- GDB 1 in Version 7.8.x-8.1.x
Die jeweiligen Tools sind abhängig von der Plattform (Windows, Linux, macOS). Alle Hinweise zur Installation findest du in den Installationshinweisen.
https://cplusplus.wtf/clioninstall
❤️ Studierende können über das JetBrains Education Programm sämtliche Software des Herstellers nutzen. JetBrains bietet auch außerhalb von C++ interessante Software für den Studienalltag an.
Die Anmeldung als Studierender erfolgt über die Webseite von JetBrains. Dafür ist die Verwendung der E-Mail-Adresse der TU Dresden (@mailbox.tu-dresden.de) notwendig.
https://cplusplus.wtf/jetbrains
Bis zum aktuellen Stand waren die bisher erstellten Programm in ihrer Ablauffolge sehr simpel. Es handelte sich bei den Programmen ausschließlich um Sequenzen von Anweisungen, die nach und nach ausgeführt wurden. Im Prinzip handelte es sich um das EVA-Prinzip.
In vielen Fällen lässt sich die lineare Programmstruktur nicht anwenden, da Anweisungen in eine Abhängigkeit gesetzt werden müssen. Realisiert wird dieser Programmablauf durch Auswahlstrukturen.
Bedingung mit einem positiven Zweig
if (Bedingung) {
<Anweisung für ja>
}
Bedingung mit einem positiven und negativen Zweig
if (Bedingung) {
<Anweisung für ja>
}
else {
<Anweisung für nein>
}
Bedingung mit einem positiven und geschachtelten negativen Zweig
if (Bedingung) {
<Anweisung für ja>
}
else (
if (Bedingung) {
<Anweisung für ja>
}
else {
if (Bedingung) {
<Anweisung für ja>
}
else {
<Anweisung für nein>
}
}
}
Alternative Variante
if (Bedingung) {
<Anweisung für ja>
}
else if (Bedingung) {
<Anweisung für ja>
}
else if (Bedingung) {
<Anweisung für ja>
}
else {
<Anweisung für nein>
}
Wird eine Anweisung mehrmals nacheinander ausgeführt, so handelt es sich um eine zyklische Wiederholung.
Typ | Definition |
---|---|
Feste Schleife | Besitzen eine festgelegte Anzahl von Schleifendurchläufen. |
Bedingte Schleifen | Iterieren so lange, bis eine getestete Bedingung wahr wird. Der Test kann am Anfang und Ende der Schleife sein. |
Endlose Schleife | Iterieren unendlich lang, bis ein bestimmter Mechanismus sie beendet (Warten auf Eingabe) Tastenkombination: Strg + Pause |
Bevor eine Schleife ausgelöst wird, muss ein Großteil der Variablen auf einem Anfangswert gesetzt werden.
Diesen Anfangswert (Vorbedingung) kann man durch Abfrage von Eingangswerten erhalten oder durch Festlegen von Anfangswerten, die sich später innerhalb der Schleife verändern.
!> Macht man das nicht, nimmt das Programm irgendwelche alte (irre) Werte an.
- Es werden die Anzahl der Wiederholungen in einem Zähler festgehalten und bei Erreichen des Zählerendstandes eingestellt.
- Anweisungen werden mindestens einmal ausgeführt, bis zum Erreichen des Endstartes (So lange, bis die Bedingung wahr geworden ist)
- fehlt eine Bedingung, dann wahr
- Anweisungsblöcke zwischen
{ }
var++
(heißt Schleifendurchlauf +1)var--
(heißt Schleifendurchlauf -1)
for(A = 1; A <= 10; A = A + 2)
{
Anweisung1;
Anweisung2;
Anweisungn;
}
Was heißt das?
Code | Erklärung |
---|---|
A = 1 |
Schleife beginnt bei A = 1, Anfangswert ist 1 |
A <= 10 |
Schleife wird solange ausgeführt, bis A = 10 --> danach abgebrochen „wie wird A = 10?“ |
A = A + 2 |
bei jedem Schleifendurchlauf wird A um 2 erhöht, die Schrittweite um 2 erweitert |
!> Besonderheiten der Zählschleife
Der Datentyp der Laufvariable ist nicht auf int beschränkt, jedoch müssen Startwert und Endwert gleichen Typs sein und zur Laufvariable kompatibel.
- Bedingung ist oft ein integer-Ausdruck
- Separater Schleifenzähler erforderlich
- Anweisungsblöcke zwischen
{ }
while(A <= 10)
{
Anweisung1;
Anweisung2;
Anweisungn;
}
- Bedingung ist ein integer-Ausdruck
- Wiederholung der Anweisungen solange Bedingung richtig ist
- Anzahl der Schleifendurchläufe unbekannt
- Auswertung der Bedingung im Schleifenfuß
- Anweisungsblöcke zwischen
{ }
char Zeichen;
do {
Anweisung1;
Anweisung2;
Anweisungn;
}
while((Zeichen == 'j' ) || Zeichen == 'J'));