Online-Material zum C++ Crash Course
Inhaltsverzeichnis
→ auf Discord in “BB.209”
→ zu den Ãœbungen besteht Anwesenheitspflicht.
PROG3/B
C++ C
r
na Crash Course
Coronasemester 2020/21
Voraussetzungen: Kenntnisse in C
Benötigt: Rechner mit Ubuntu
Anmeldung: in SVN mit Kursname “ccc”
Abgabe der Übungen im SVN: bis spätestens 30.09.2020 24:00 Uhr
Testat: laut Ergebnisliste (Update ca. 60min)
Ziel des Kurses ist nicht C++ perfekt programmieren zu können. Dazu braucht man Jahrzehnte und selbst dann… Ziel ist es vielmehr C++ Programme lesen zu können und die folgenden vier wichtigsten C++ Programmierprinzipien anwenden zu können:
- Ableiten
- Spezialisieren
- Aggregieren
- STL Templates
Zu diesem Ziel wird jeweils in der Vormittags-Demo entsprechender Code exemplarisch entwickelt und die angewandten Prinzipien erläutert. In der Nachmittags-Übung wenden Sie anhand eines ähnlichen Beispiels die Prinzipien selber an. Wir verwenden den C++98 Standard.
Tag #1
Themen #1:
- OO (Objekt-Orientierte Programmierung)
- Klassen
- Objekt und Zustand
- Bauplan und Instantiierung
- Konstruktoren und Destruktoren
- Datenkapselung und Instanzvariablen (Members)
- Zugriffsfunktionen (Methoden)
- Prototypen und Implementierung
- OO-Literatur und weiteres Material siehe Skript
- OO-Spezialitäten bei C++
- Namespace Operator ::
- Ãœberladen und Standardwerte
- statische Methoden und Instanzvariablen
- Call-By-Name
- operator <<
- Copy-Ctor
- Lernzielkontrolle:
- Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
- 1.2 1.3 1.4 1.5 1.6 2.1 2.2 2.4 2.5
- Geben Sie jeweils ein konkretes Beispiel!
- Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
Videos #1
erscheinen hier …
Ãœbung #1
- Schreiben Sie eine Klasse Account, welches ein Konto mit einem gewissen Kontostand repräsentiert.
- Implementieren Sie den Konstruktor, so dass anfangs der Kontostand 0 ist und ein Kontrolltext ausgegeben wird.
- Implementieren Sie den Destruktor (bis auf Kontrolltextausgabe leer).
- Implementieren Sie zusätzlich die folgenden Zugriffsmethoden:
- deposit(…) → zahlt einen Betrag auf das Konto ein
- withdraw(…) → hebt einen Betrag vom Konto ab (nur wenn genug Guthaben vorhanden ist, in diesem Fall soll außerdem der Wahrheitswert true zurückgegeben werden)
- balance() → liefert den aktuellen Kontostand zurück
- Testen Sie Ihre Klasse, indem Sie 5x 100 EUR einzahlen und 5x 150 EUR abheben und danach den Kontostand ausgeben. Der Kontostand muss danach 50 EUR betragen.
- Geben Sie den Kontostand in main() zurück.
Schreiben Sie Ihren Code basierend auf dem folgenden Lückencode:
svn export svn://schorsch.efi.fh-nuernberg.de/CCC-exc/exc1
- D.h. ergänzen Sie die mit … gekennzeichneten Stellen!
Geben Sie Ihren Code im Verzeichnis “exc1” im SVN ab!
Tipp: Fügen Sie den exportierten Code gleich nach dem Export ihrem SVN Repository hinzu (svn add exc1) und arbeiten im Folgenden mit diesem Verzeichnis (svn commit -m “…”).
Also nochmal alles zusammen:
svn co <repo> // svn co line aus der EMail nach der Anmeldung cd <repo> svn export svn://schorsch.efi.fh-nuernberg.de/CCC-exc/exc1 svn add exc1 svn commit -m "let's get started" cd exc1 cmake . make && ./main
Tag #2

Themen #2:
- Vererbung
- Ableitungen
- Ãœberschreiben und Spezialisieren
- Klassen und Polymorphismen
- Basisklassen und Initializer Lists
- Virtuelle Methoden
- Templates
- Templatisierte Klassen
- Dynamische Arrays als Template
- Header-only Klassen
- STL (Standard Template Library)
- std::vector und std::map
- Iteratoren und Aufzählung
- Iteratoren vs. Pointer
- [auto-Variablen]
- std::string
- infix vs. prefix Notation
- Operator Overloading
- Lernzielkontrolle:
- Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
- 1.1 1.2 1.4 2.1 2.3 2.5 2.6
- Geben Sie jeweils ein konkretes Beispiel!
- Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
Videos #2
erscheinen hier …
Ãœbung #2
- Schreiben Sie eine Klasse CheckingAccount, welches ein GiroKonto mit einem gewissen Überziehungskredit (Giro) repräsentiert und sich von Account als Basisklasse ableitet.
- Implementieren Sie den Konstruktor, so dass der Giro-Kreditrahmen als Parameter des Konstruktors übergeben wird. Standardmäßig soll der Giro 0 sein. Verwenden Sie den Konstruktor der Basisklasse.
- Ãœberschreiben Sie die folgende Zugriffsmethode:
- withdraw() → hebt einen Betrag vom Konto ab (nur wenn genug Guthaben in Bezug auf den Giro-Kreditrahmen vorhanden ist, in diesem Fall soll außerdem der Wahrheitswert true zurückgegeben werden)
- Testen Sie Ihre Klasse mit einem Giro von 0 bzw. 100 EUR, indem Sie 5x 100 EUR einzahlen und 5x 150 EUR abheben und danach den Kontostand ausgeben. Der Kontostand muss danach 50 bzw. −100 EUR betragen.
- Geben Sie den Kontostand für 100 EUR Giro in main() zurück.
Schreiben Sie Ihren Code basierend auf dem folgenden Lückencode:
svn export --username=student --password=... svn://schorsch.efi.fh-nuernberg.de/CCC-exc/exc2
- D.h. ergänzen Sie die mit … gekennzeichneten Stellen!
Geben Sie Ihren Code im Verzeichnis “exc2” im SVN ab!
Tipp: gleich nach dem Export adden!
Tag #3

Themen #3:
- Aggregierung
- is vs. has
- Ableiten vs. Aggregieren
- Aggregieren mit der STL
- Abstrakte Methoden
- Abstrakte Klassen und Klassenhierarchien
- Zeiger auf abstrakte Basisklassen und Aufrufsemantik
- Don’t Ask - Tell!
- Mehrfachvererbung
- Interfaces
- Model vs. View
- User Interfaces (UI)
- Lernzielkontrolle:
- Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
- 1.2 1.3 1.4 1.5
- Geben Sie jeweils ein konkretes Beispiel!
- Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
Videos #3
erscheinen hier …
Ãœbung #3
- Schreiben Sie eine Klasse, die eine Bank repräsentiert.
- D.h. die Bank soll mehrere Konten verwalten und Überweisungen erlauben können.
- Dazu implementieren Sie das Interface Bank aus “bank.h” durch Ableiten und Spezialisieren!
- Die Konten sollen durch std::map aggregiert werden (key-value pairs).
- Der map-Schlüssel (key) ist die Kontonummer.
- Jedes map-Element (value) soll wiederum aus einer Referenz auf ein Konto und dem Passwort bestehen. Dies wird durch die Klasse ProtectedAccount realisiert, die beides aggregiert.
- Implementieren Sie nun die folgenden Methoden des Interfaces in “cccbank.h”:
// open account // * with account number "account", // * password "password" // * and a reference "a" to a new account // * returns true if the account could be opened successfully virtual bool open_account(int account, std::string passwd, Account *a); // deposit amount on account // * if account is existing virtual void deposit(int account, float amount); // withdraw amount from account // * if account is existing // * and if passwd matches the account password // * returns true if the withdrawal was successful virtual bool withdraw(int account, std::string passwd, float amount); // transfer amount from one account to another one // * if both accounts are existing // * and if passwd matches the account password // * and if the withdrawal was successful // * returns true if the transfer was successful virtual bool transfer(int from, int to, std::string passwd, float amount); // return the account balance // * if account is existing // * and if passwd matches the account password virtual float balance(int account, std::string passwd); // return the total bank balance // * which is the sum of all account balances float total_balance();
Schreiben Sie Ihren Code basierend auf dem folgenden Lückencode:
svn export --username=student --password=... svn://schorsch.efi.fh-nuernberg.de/CCC-exc/exc3
- D.h. ergänzen Sie die mit … gekennzeichneten Stellen!
- Wenn das Interface korrekt implementiert wurde, gibt das Programm eine runde Bilanzsumme aus.
Geben Sie Ihren Code im Verzeichnis “exc3” im SVN ab!
Tipp: gleich nach dem Export adden!
Tag #4


Themen #4:
- Qt
- UI Event Loop
- Qt Class Hierarchy
- Design Patterns
- Observer Pattern
- QObject und QWidget
- Widget Specialization
- paintEvent(), resizeEvent() and mousePressEvent()
- Signals and Slots
- QThreads and Signals
- Graphische Darstellung
- Text- und Liniengraphik
- QPainter
- Coordinate Systems and Transformations
- Turtle Graphics
- Images as Objects
- Fraktale
- Sierpinsky Fraktal
- Julia-Menge
- Alle Punkte $z$ der komplexen Zahlenfolge $z := z^2 + c$
- Mandelbrot-Menge
- Alle Punkte $c$ mit $z := z^2 + c$ und $|z| < 2$ für alle $z$


- Lernzielkontrolle:
- Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
- 1.1 1.5 1.6 2.2 2.3 2.4
- Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
Videos #4
erscheinen hier …
Ãœbung #4
- Zeichnen Sie das Mandelbrot-Fraktal, indem Sie die paintEvent()-Methode von QWidget durch Ableiten überschreiben.
- Zum Zeichnen verwenden Sie QPainter (und QImage).
- Mandelbrot Pseudo-Code für eine Iteration für jeweils variables $c$:
int fractal(Complex c, int max_count = 100) { int count = 0; Complex z; while (z.norm() < 4) { z = z*z + c; if (count++ > max_count) return(0); } return(count); }
- D.h. für die Mandelbrot Menge variiert man $c$ für feste Startwerte $z_0 = (0,0)$
- Für die Julia-Menge ist $c$ konstant und man variiert den Startwert $z_0$.
- Wie würde man das Apfelmännchen farbig darstellen? Tipp: count ≙ Farbe
Schreiben Sie Ihren Code mit Hilfe des folgenden Qt Frameworks:
svn export svn://schorsch.efi.fh-nuernberg.de/CCC-exc/exc4
- Fügen Sie den kompletten exportierten Code gleich nach dem Export ihrem SVN Repo hinzu!
- Modifizieren Sie das Modul “painterwidget.cpp/.h”!
- Arithmetik für komplexe Zahlen ist im Header “Complex” definiert.
Geben Sie Ihren Code im Verzeichnis “exc4” im SVN ab!
Geben Sie außerdem in diesem Verzeichnis einen Screenshot mit Dateinamen “Mandelbrot.png” ab - am besten ein farbiges Apfelmännchen.
Und was kommt nach C++?
Wer C++ kann, hat nichts zu befürchten - außer C++17!
Happy C++oding!