{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 1: Ein eigenes kleines C++-Programm (*function template*) (1 Punkt)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Erstellen Sie in [`task1.main.cpp`](task1.main.cpp) ein lauffähiges Ein-Dateien-Programm das folgende Struktur aufweist:\n", "\n", "- Einbinden benötigter Header-Dateien aus der Standardbibliothek, z.B.:\n", "\t```cpp\n", "\t#include // std::cout, std::endl\n", "\t#include // std::vector\n", "\t...\n", "\t```\n", "- Definition/Implementierung einer eigenen Funktion in einem eigenen Namensraum, z.B.:\n", "\t```cpp\n", "\tnamespace task1 {\n", "\n", "\t...\n", "\n", "\t}\n", "\t``` \n", "- Definition/Implementierung einer `main`-Funktion, die Ihre selbst geschriebene Funktion verwendet, z.B.:\n", "\t```cpp\n", "\tint main(){\n", "\n", "\t ...\n", "\n", "\t return 0;\n", "\t}\n", "\t``` \n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "- Eine genaue Beschreibung und Anforderungen finden Sie in [`task1.main.cpp`](task1.main.cpp)\n", "- Ihre Implementierung erfolgt ebenfalls in [`task1.main.cpp`](task1.main.cpp)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 2: Umschreiben gegebener Funktionen zur Funktions-Templates (1 Punkt)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In dem Header [`task2.hpp`](task2.hpp) sind 4 Funktionen in Namensraum `task2` gegeben.\n", "Ihre Aufgabe besteht darin, diese so anzupassen, dass mindestens die im Test verwendeten Parametertypen unterstützt werden.\n", "\n", "Ihre Implementierung soll durch *verändern* der gegebenen Funktionen erfolgen: **Sie schreiben jede der Funktionen zu einem Funktions-Template um**.\n", "\n", "Hier ein Beispiel anhand einer Funktion `add`:" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "```cpp\n", "namespace task2 {\n", "\n", "/// handout\n", "inline int add(int a, int b)\n", "{\n", " return a + b;\n", "}\n", "\n", "/// solution\n", "template \n", "inline T add(T a, T b)\n", "{\n", " return a + b;\n", "}\n", "\n", "} \n", "```" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "- Die vorgegebenen Funktionen und eine genaue Beschreibung und Anforderungen finden Sie in [`task2.hpp`](task2.hpp)\n", "- Ihre Implementierung erfolgt ebenfalls in [`task2.hpp`](task2.hpp)\n", "- Die zugeordneten Tests finden Sie in [`task2.test.cpp`](task2.test.cpp) \n", "- **Wichtig**: Nach erfolgter Implemenierung müssen Sie in [`task2.test.cpp`](task2.test.cpp) die Tests für varierende Parametertypen **manuell einkommentieren**." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 3: Implementierung einer eigenen Klasse, die gegebene Schnittstellenanforderungen erfüllt (1 Punkt)\n", "\n", "Für diese Aufgabe implementieren Sie eine Klasse `point`, welche die Schnittstellenanforderungen (*concept*) in [`task3.concept.hpp`](task3.concept.hpp) erfüllt. " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "- Die vorgegebenen Deklaration und eine genaue Beschreibung und Anforderungen finden Sie in [`task3.hpp`](task3.hpp)\n", "- Ihre Implementierung erfolgt ebenfalls in [`task3.hpp`](task3.hpp)\n", "- Die zugeordneten Tests finden Sie in [`task3.test.cpp`](task3.test.cpp)\n", "- **Wichtig**: Nach erfolgter Implemenierung müssen Sie in [`task3.test.cpp`](task3.test.cpp) die Tests **manuell einkommentieren**." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Kompilieren/Testen\n", "\n", "So testen Sie Ihre Implementierung (direkter Aufruf von `g++`):\n", "\n", "```shell\n", "# prepare\n", "mkdir build\n", "# compile\n", "g++ -g -std=c++20 task1.main.cpp -o build/task1\n", "g++ -g -std=c++20 task2.test.cpp -o build/task2\n", "g++ -g -std=c++20 task3.test.cpp -o build/task3\n", "\n", "# run tests\n", "./build/task1\n", "./build/task2\n", "./build/task3\n", "```\n", "\n", "Alternativ (mittels CMake-Configuration):\n", "\n", "```shell\n", "# prepare\n", "cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug\n", "# compile\n", "cmake --build build --config Debug --target task1\n", "cmake --build build --config Debug --target task2\n", "cmake --build build --config Debug --target task3\n", "cmake --build build --config Debug # all\n", "# run tests\n", "ctest --test-dir build -C Debug -R task1 --verbose\n", "ctest --test-dir build -C Debug -R task2 --verbose\n", "ctest --test-dir build -C Debug -R task3 --verbose\n", "ctest --test-dir build -C Debug # all\n", "``` \n" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.6.15" } }, "nbformat": 4, "nbformat_minor": 2 }