Online

Online-Material zum C++ Crash Course

Inhaltsverzeichnis

jeweils 10–13:00 Demo, 14:00–17:00 Ãœbung
→ auf Discord in “BB.209”
→ zu den Ãœbungen besteht Anwesenheitspflicht.


PROG3/B

C++ Crna 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:

  1. OO (Objekt-Orientierte Programmierung)
    1. Klassen
    2. Objekt und Zustand
    3. Bauplan und Instantiierung
    4. Konstruktoren und Destruktoren
    5. Datenkapselung und Instanzvariablen (Members)
    6. Zugriffsfunktionen (Methoden)
    7. Prototypen und Implementierung
    8. OO-Literatur und weiteres Material siehe Skript
  2. OO-Spezialitäten bei C++
    1. Namespace Operator ::
    2. Ãœberladen und Standardwerte
    3. statische Methoden und Instanzvariablen
    4. Call-By-Name
    5. operator <<
    6. 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!

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

Ableitung und Vererbung (wikipedia)

Themen #2:

  1. Vererbung
    1. Ableitungen
    2. Ãœberschreiben und Spezialisieren
    3. Klassen und Polymorphismen
    4. Basisklassen und Initializer Lists
    5. Virtuelle Methoden
  2. Templates
    1. Templatisierte Klassen
    2. Dynamische Arrays als Template
    3. Header-only Klassen
    4. STL (Standard Template Library)
    5. std::vector und std::map
    6. Iteratoren und Aufzählung
    7. Iteratoren vs. Pointer
    8. [auto-Variablen]
    9. std::string
    10. infix vs. prefix Notation
    11. 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!

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

Klassen und Aggregation (wikipedia)

Themen #3:

  1. Aggregierung
    1. is vs. has
    2. Ableiten vs. Aggregieren
    3. Aggregieren mit der STL
  2. Abstrakte Methoden
    1. Abstrakte Klassen und Klassenhierarchien
    2. Zeiger auf abstrakte Basisklassen und Aufrufsemantik
    3. Don’t Ask - Tell!
    4. Mehrfachvererbung
  3. Interfaces
    1. Model vs. View
    2. 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!

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

Qt Class Hierarchy
Sierpinsky Set

Themen #4:

  1. Qt
    1. UI Event Loop
    2. Qt Class Hierarchy
    3. Design Patterns
    4. Observer Pattern
    5. QObject und QWidget
    6. Widget Specialization
    7. paintEvent(), resizeEvent() and mousePressEvent()
    8. Signals and Slots
    9. QThreads and Signals
  2. Graphische Darstellung
    1. Text- und Liniengraphik
    2. QPainter
    3. Coordinate Systems and Transformations
    4. Turtle Graphics
    5. Images as Objects
  3. Fraktale
    1. Sierpinsky Fraktal
    2. Julia-Menge
      1. Alle Punkte $z$ der komplexen Zahlenfolge $z := z^2 + c$
    3. Mandelbrot-Menge
      1. Alle Punkte $c$ mit $z := z^2 + c$ und $|z| < 2$ für alle $z$
Julia Set (wikipedia)
Mandelbrot Set (wikipedia)
  • Lernzielkontrolle:
    • Erklären Sie die folgenden Fachbegriffe aus obiger Themenliste:
      • 1.1 1.5 1.6 2.2 2.3 2.4

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!


Options: