TU-Programmieren_2/lab2/main.ipynb
2025-04-09 10:22:44 +02:00

145 lines
6.2 KiB
Plaintext

{
"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",
"<img src=\"images/01.jpg\" width=700>\n",
"\n",
"- Drücken Sie `F1` und geben Sie in der VSCode Suchleiste `CMake: Configure` ein:\n",
"\n",
"<img src=\"images/02.jpg\" width=700>\n",
"\n",
"- Wählen Sie im Menü den `GCC` Compiler aus. Eventuell wird dieser bereits automatisch ausgewählt.\n",
"\n",
"<img src=\"images/03.jpg\" width=700>\n",
"\n",
"- Drücken Sie `F1` und geben Sie in der VSCode Suchleiste `CMake: Set Debug Target` ein:\n",
"\n",
"<img src=\"images/04.jpg\" width=700>\n",
"\n",
"- Wählen Sie im Menü die Datei aus die Sie debuggen möchten:\n",
"\n",
"<img src=\"images/05.jpg\" width=700>\n",
"\n",
"- Drücken Sie wieder `F1` und geben Sie in der VSCode Suchleiste `CMake: Debug` ein:\n",
"\n",
"<img src=\"images/06.jpg\" width=700>\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
}