Online

Material zum C++ Crash Course / PROG3

PROG3/B

C++ Crash Course

Wintersemester 2022/23

Voraussetzungen: Kenntnisse in C (PROG1&2)

Ben├Âtigt wird: Rechner mit Ubuntu


Inhaltsverzeichnis

jeweils 10:00–13:30 Demo, 14:30–17:00 ├ťbung
→ auf Zoom: https://th-nuernberg.zoom.us/j/93286221399
→ ├ťbungen auf Discord in “BB.209”


Organisatorisches

  • Discord-Installation (nicht f├╝r VirtualBox): snap install discord
  • Gesamtprotokoll: Word-Vorlage
  • Protokollabgabe: bis sp├Ątestens 2.10.2022 24:00 Uhr hier: Upload-Verzeichnis
  • Bestehen: Durch erfolgreiche Abgabe des Gesamtprotokolls aller ├ťbungsaufgaben


Einf├╝hrung

Ziel des Kurses ist nicht C++ perfekt programmieren zu k├Ânnen. Ziel ist es vielmehr C++ Programme lesen bzw. verstehen zu k├Ânnen und die folgenden f├╝nf grundlegenden C++ bzw. OO-Programmierprinzipien anwenden zu k├Ânnen:

  • Datenkapselung
  • Ableiten
  • Spezialisieren
  • Aggregieren
  • 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 dazu den C++11 Standard.


Tag #1

Themen #1:

  1. OO (Objekt-Orientierte Programmierung)
    1. Klassen
    2. Objekt und Zustand (am Beispiel eines Spielzeugs)
    3. Bauplan und Instantiierung (am Beispiel Button)
    4. Instanzvariablen (Members)
    5. Konstruktoren
    6. Datenkapselung und Zugriffskontrolle
    7. Zugriffsfunktionen (Methoden)
    8. Instanzvariablen vs. lokale Variablen und Parameter
    9. OO-Literatur und weiteres Material siehe Skript
  2. OO-Spezialit├Ąten bei C++
    1. Prototypen und Implementierung (am Beispiel Uhrwerk)
    2. Namespace Operator ::
    3. ├ťberladen und Standardwerte
    4. statische Instanzvariablen und Methoden
    5. Destruktoren
    6. operator << (iostream)

Videos #1

werden hier hochgeladen

TeilVideoThema
1.1YTOO Einf├╝hrung
1.2YTKlassen und Objekte
1.3YTOO-Spezialit├Ąten
1.4YT├ťbungsvorbereitung #1

├ťbung #1

  • Der Code f├╝r die ├ťbungen wird per Git herunter geladen:
  • Die heruntergeladene ZIP-Datei exc1.zip wird mit “unzip exc1.zip” entpackt, wobei ein Passwort eingegeben werden muss. Dieses wird hier bekanntgegeben:
    • Passwort #1: 064379d4
  • Der Code l├Ąsst sich mit “cmake . && make” ├╝bersetzen.
  • Schreiben Sie nun auf dieser Codebasis 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 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 3x 150 EUR abheben und danach den Kontostand ausgeben. Der Kontostand muss danach 50 EUR betragen.
  • Geben Sie den Kontostand in main() zur├╝ck. Dieser kann auf der Kommandozeile mit “echo $?” ausgegeben werden.
  • Notieren Sie das Ergebnis im Gesamtprotokoll. Dazu f├╝gen Sie einen Screenshot des obigen Programmablaufs auf der Kommandozeile ein. Beantworten Sie ebenfalls die Fragen der Lernzielkontrolle kurz und knapp im Protokoll.

Lernzielkontrolle:

  • Was ist die Haupteigenschaft einer Klasse?
  • In welcher Datei werden Klassen deklariert?
  • In welcher Datei werden Methoden implementiert?
  • Erkl├Ąren Sie stichpunktartig die folgenden Fachbegriffe aus obiger Themenliste:
    • 1.2 1.3 1.4 1.5 1.6 2.1 2.2 2.4
    • Am besten anhand eines kurzen konkreten Beispiels!


Tag #2

Ableitung und Vererbung (wikipedia)

Themen #2:

  1. Vererbung
    1. Ableitungen
    2. ├ťberschreiben und Spezialisieren (am Beispiel PushButton)
    3. Klassen und Polymorphismen
    4. Basisklassen und Initializer Lists
    5. Virtuelle Methoden
    6. [Mehrfachvererbung]
    7. [Call-By-Name]
  2. Templates
    1. Header-only Klassen
    2. Templatisierte Klassen (am Beispiel von Arrays)
    3. [Dynamische Arrays als Template]

Videos #2

werden hier hochgeladen

TeilVideoThema
2.1YTVererbung
2.2YTSpezialisieren
2.3YTTemplates
2.4YT├ťbungsvorbereitung #2

├ťbung #2

  • Die heruntergeladene ZIP-Datei exc2.zip wird entpackt, wobei ein Passwort eingegeben werden muss. Dieses wird hier bekanntgegeben:
    • Passwort #2: 0cd0f5dd
  • Schreiben Sie auf dieser Codebasis 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.
  • Notieren Sie das Ergebnis im Gesamtprotokoll. Dazu f├╝gen Sie einen Screenshot des Programmablaufs auf der Kommandozeile ein. Beantworten Sie ebenfalls die Fragen der Lernzielkontrolle stichwortartig im Protokoll.

Lernzielkontrolle:

  • Welche M├Âglichkeiten zur Wiederverwendung von Code hat man in C++ ?
  • Welche M├Âglichkeiten hat man in anderen Ihnen bekannten Programmiersprachen?
  • Erkl├Ąren Sie stichpunktartig die folgenden Fachbegriffe aus obiger Themenliste:
    • 1.1 1.2 1.4 2.1 2.2


Tag #3

Klassen und Aggregation (wikipedia)

Themen #3:

  1. STL (Standard Template Library)
    1. std::vector und std::map
    2. Iteratoren und Aufz├Ąhlung
    3. Iteratoren vs. Pointer
    4. auto-Variablen
    5. infix vs. prefix Notation
    6. Operator Overloading
    7. operator <<
    8. std::string
  2. Aggregierung
    1. is vs. has
    2. Ableiten vs. Aggregieren (am Beispiel 3D Game)
    3. Aggregieren mit der STL
  3. Abstrakte Klassen
    1. Abstrakte Klassen und Klassenhierarchien
    2. Zeiger auf abstrakte Basisklassen und Aufrufsemantik
    3. Interfaces
    4. OO-Motto: Don’t Ask - Tell!

Videos #3

werden hier hochgeladen

TeilVideoThema
3.1YTSTL Template Library
3.2YTAggregieren & Interfaces
3.3YTAnfang der ├ťbung #3

├ťbung #3

  • Die heruntergeladene ZIP-Datei exc3.zip wird entpackt, wobei ein Passwort eingegeben werden muss. Dieses wird hier bekanntgegeben:
    • Passwort #3: 2a0c6ea0
  • Schreiben Sie auf dieser Codebasis 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 ein passwortgesch├╝tztes Konto sein. Dies wird durch die Klasse ProtectedAccount realisiert, welche ein Konto als Referenz und ein Passwort als std::string aggregiert.
  • Implementieren Sie nun die folgenden abstrakten Methoden des Interfaces “bank.h” 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) = 0;

   // deposit amount on account
   // * if account is existing
   virtual void deposit(int account, float amount) = 0;

   // 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) = 0;

   // 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) = 0;

   // return the account balance
   // * if account is existing
   // * and if passwd matches the account password
   virtual float balance(int account, std::string passwd) = 0;

   // return the total bank balance
   // * which is the sum of all account balances
   float total_balance();
  • Wenn das Interface korrekt implementiert wurde, gibt das Programm eine runde Bilanzsumme aus.
  • Noch ein Tipp: Beispiele zu std::map gibt es hier. Die Referenz-Dokumentation der Container-Klasse std::map gibt es hier.
  • F├╝gen Sie bitte den letzten Stand des Quelltextes von cccbank.h im Protokoll ein. Wenn der Code noch nicht komplett funktioniert, ist das nicht weiter tragisch. Die Hauptsache ist, dass Sie das Grundprinzip der Benutzung von Interfaces und Container-Klassen verstanden haben. Beantworten Sie ebenfalls die Fragen der Lernzielkontrolle im Protokoll.

Lernzielkontrolle:

  • Was ist eine Container-Klasse?
  • Was ist der Unterschied zwischen Aggregieren und Ableiten?
  • Was ist der Hauptvorteil von einem Interface?
  • Erkl├Ąren Sie die folgenden Fachbegriffe aus obiger Themenliste:
    • 1.1 2.2 2.3 2.4 2.5 3.1 3.2


Tag #4

Qt Class Hierarchy
Sierpinsky Set

Themen #4:

  1. Qt
    1. UI & Widgets
    2. Design Patterns → Observer Pattern
    3. UI Event Loop
    4. Qt Class Hierarchy
    5. QWidget State, Properties and Feats
    6. Widget Specialization
    7. QObject und QWidget
    8. paintEvent(), resizeEvent() and mousePressEvent()
    9. [Signals and Slots]
    10. [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)

Videos #4

werden hier hochgeladen

TeilVideoThema
4.1YTUI Grundprinzipien & Qt
4.2YTGraphik mit Qt
4.3YTAnfang der ├ťbung #4

├ťbung #4

  • Die heruntergeladene ZIP-Datei exc4.zip wird entpackt, wobei ein Passwort eingegeben werden muss. Dieses wird hier bekanntgegeben:
    • Passwort #4: 2681b340
  • Zeichnen Sie auf dieser Codebasis das Mandelbrot-Fraktal, indem Sie die paintEvent()-Methode von QWidget durch Ableiten ├╝berschreiben. QWidget ist Bestandteil des Qt Frameworks.
    • Modifizieren Sie nur das Modul “painterwidget.cpp/.h”!
    • Arithmetik f├╝r komplexe Zahlen ist bereits im Header “Complex” definiert.
  • Zum Zeichnen verwenden Sie QPainter.
  • 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$.
  • Optional: Wie w├╝rde man das Apfelm├Ąnnchen farbig darstellen? Tipp: count ≙ Farbe
Mandelbrot.png
  • F├╝gen Sie einen Screenshot des Fraktals im Gesamtprotokoll ein (siehe z.B. rechts). Beantworten Sie ebenfalls die Fragen der Lernzielkontrolle im Protokoll.

Lernzielkontrolle:

  • Erkl├Ąren Sie die folgenden Fachbegriffe aus obiger Themenliste:
    • 1.1 1.5 1.6 2.2 2.3 2.4


Finale

Wenn Sie nun das vollst├Ąndige Gesamtprotokoll hochladen, haben Sie den Kurs bestanden. Gl├╝ckwunsch!

Und was kommt nach C++?

Die hier vorgestellten und vertieften Prinzipien finden sich in allen objekt-orientierten Programmiersprachen wieder und sind damit universelle Programmierprinzipien.

Ansonsten ist nur noch anzumerken:
Wer C++ kann, hat nichts zu bef├╝rchten - au├čer C++20!

Happy C++oding!


PS: Pr├╝fungsvorbereitung

  • Schreiben Sie testweise die Probeklausur!
  • Der Termin f├╝r die Frage- und Antwortstunde gegen Ende des Semesters wird noch bekanntgegeben!

Options: