{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## A. Debugging\n", "\n", "In der Datei [taskA.cpp](taskA.cpp) ist ein (fehlerfreies) Programm gegeben.\n", "\n", "### Debugging mittels Konsolenausgaben\n", "\n", "Die wohl einfachste Methode des Debuggings ist das hinzufügen von *print statements* (std::cout <<) die beim Ausführen Aufschluss über den Verlauf des Programms liefern. In [taskA.cpp](taskA.cpp) in der Funktion `doubleVec` sehen Sie beispielsweise wie diese aussehen könnten.\n", "\n", "**Aufgabe 1:** Fuegen Sie in der Funktion `findMax` aequivalente Debug-Ausgaben hinzu (am Anfang der Funktion, in der Schleife und am Ende der Funktion).\n", "\n", "**Demonstration 1:** Kompilieren Sie die Datei [taskA.cpp](taskA.cpp), führen Sie das Programm aus und inspizieren Sie die Konsolen Ausgabe. \n", "\n", "---\n", "\n", "### Debugging mittels Debugger\n", "\n", "Eine weitere Methode ist das Verwenden eines Debuggers. Dieser ermöglicht es Haltepunkte (*breakpoints*) zu setzen an denen das Programm angehalten wird und von denen aus man Zeile für Zeile durch das Programm gehen kann. \n", "\n", "**Einrichten CMake-basiertes Debuggen mit VSCode:**\n", "\n", "- Installieren Sie die `CMake tools`-Erweiterung für VSCode:\n", "\n", " ```bash\n", " code --install-extension ms-vscode.cmake-tools\n", " ```\n", "\n", "- Fügen Sie in der Datei, die Sie debuggen wollen *breakpoints* hinzu:\n", "\n", "\n", "\n", "- Drücken Sie `F1` und geben Sie in der VSCode Suchleiste `CMake: Configure` ein:\n", "\n", "\n", "\n", "- Wählen Sie im Menü den `GCC` Compiler aus. Eventuell wird dieser bereits automatisch ausgewählt.\n", "\n", "\n", "\n", "- Drücken Sie `F1` und geben Sie in der VSCode Suchleiste `CMake: Set Debug Target` ein:\n", "\n", "\n", "\n", "- Wählen Sie im Menü die Datei aus die Sie debuggen möchten:\n", "\n", "\n", "\n", "- Drücken Sie wieder `F1` und geben Sie in der VSCode Suchleiste `CMake: Debug` ein:\n", "\n", "\n", "\n", "**Hinweis:**\n", " - Das Debuggen mit CMake ist nur möglich wenn eine entsprechend konfigurierte [CMakeLists.txt](CMakeLists.txt) im aktuellen Verzeichnis vorhanden ist.\n", "\n", "**Aufgabe 2:** Setzen Sie in der Datei [taskA.cpp](taskA.cpp) dort *breakpoints* wo sich die Debug-Ausgaben aus Aufgabe 1 befinden. Debuggen Sie Ihr Programm indem Sie entweder Zeile fuer Zeile oder von *breakpoint* zu *breakpoint* durch das Programm gehen.\n", "\n", "**Demonstration:** Debuggen Sie Ihr Programm und zeigen Sie, dass Sie mit der Debugger-Navigation umgehen koennen." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## B. Klassen\n", "\n", "In der Datei [taskB.cpp](taskB.cpp) sind zwei *namespaces* `one` und `two` gegeben. In `namespace one` ist eine Klasse `Particle` mit drei Member-Variablen (Geschwindigkeit in x- und y-Richtung und Masse), welche ein Partikel darstellen soll, gegeben.\n", "\n", "**Aufgabe (Details siehe [taskB.cpp](taskB.cpp)):**\n", " - Erweitern Sie die Klasse `Particle` in `namespace one` um folgende Member-Funktionen: `energy()`, `print()`\n", " - Erstellen Sie die Klasse `Particle` in `namespace two` mit folgenden Eigenschaften: \n", " - Gleiche Member-Variablen wie die Klasse in `namespace one` diese sollen aber **privat** sein\n", " - **Konstruktor** `Particle(...)` mit x- und y-Richtung und Masse als Parameter,\n", " - **Member Funktionen**: `set()`, `get()`, `energy()`, `print()`\n", " \n", " - In der `main` Funktion:\n", " - Erstellen Sie jeweils ein Objekt der beiden Klassen und rufen Sie alle Funktionen auf.\n", "\n", "**Hinweis:**\n", " - Formel für die kinetische Energie: $E_{kin} = \\frac{1}{2} \\cdot m \\cdot (v_x^2 + v_y^2)$\n", "\n", "\n", "**Demonstration:** Erklären Sie den Unterschied zwischen einem `struct` und einer Klasse (`class`). Was bedeutet `public` bzw. `private` in diesem Zusammenhang?" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## C. Überladen von Operatoren\n", "\n", "Sie sollen eine Klasse implementieren um Polynome der Form $p(x) = a_0x^0 + a_1x^1 + a_2x^2 + ...$ darzustellen.\\\n", "Das Verwenden der Klasse könnte dann in etwa so aussehen:\n", "\n", "\n", "```cpp\n", "int main(){\n", " auto poly = Polynom({4, 2, 3}); // this represents the polynomial p(x) = 4 + 2*x + 3*x**2 + ... \n", " double x = 1.0;\n", " double eval = poly(x); // using overloaded operator to evaluate polynomial at x = 1\n", " std::cout << eval << std::endl;\n", "}\n", "```\n", "\n", "**Aufgabe (Details siehe [taskC.cpp](taskC.cpp)):**\n", " - Erstellen Sie eine Klasse `Polynomial` mit folgenden Eigenschaften:\n", " - Member-Variable vom Typ `std::vector`, die die Koeffizienten $a_i$ des Polynoms beinhaltet\n", " - Ausgabefunktion `print()`\n", " - Überladener Operator `operator()` zum Evaluieren des Polynoms.\n", " - Erstellen Sie ein Objekt der Klasse `Polynomial`, rufen sie die `print()` Funktion auf und verwenden Sie den `()` Operator um das Polynom zu evaluieren.\n", "\n", "**Demonstration:** Erklaeren Sie Ihre Implementierung kurz. Nennen Sie moegliche Vor- und Nachteile die durch das Ueberladen von Operatoren entstehen." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.2" } }, "nbformat": 4, "nbformat_minor": 2 }