{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 1: Ein eigenes kleines C-Programm (*row-major layout*) (1 Punkt)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Erstellen Sie in [`task1.main.c`](task1.main.c) ein lauffähiges Ein-Dateien-Programm das folgende Struktur aufweist:\n", "\n", "- Einbinden benötigter Header-Dateien aus der Standardbibliothek, z.B.:\n", "\t```c\n", "\t#include // INT_MAX\n", "\t#include // printf\n", "\t...\n", "\t```\n", "- Definition/Implementierung einer eigenen Funktion, z.B.:\n", "\t```cpp\n", "\tsize_t func(...) {\n", "\t ...\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", "\t ...\t\n", "\t int res = func(...);\n", "\t ...\t\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.c`](task1.main.c)\n", "- Ihre Implementierung erfolgt ebenfalls in [`task1.main.c`](task1.main.c)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 2: Funktionalität für zweidimensionale Felder mit kontinuierlichem Speicherlayout (hier: *row-major order*) (1 Punkt)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Gegeben ist eine Struktur `struct Matrix`, die eine *M x N*-Matrix mit kontinuierlichem Speicherlayout darstellt, ebenso gegeben sind drei yugehörige Funktionen:<>\n", "```c\n", "struct Matrix {\n", " double* data; ///< pointer to a dynamically allocated contiguous memory block of size m*n\n", " size_t m; ///< number of rows (first dimension)\n", " size_t n; ///< number of colmns (second dimension)\n", "};\n", "\n", "struct Matrix matrix_init(size_t m, size_t n, const double *data);\n", "void matrix_print(const struct Matrix* mat);\n", "void matrix_clear(struct Matrix* mat);\n", "```\n", "Sie implementieren weitere vier Funktionen, die die Funktionalität erweitern:\n", "\n", "```c\n", "// todo: implement\n", "struct Matrix matrix_zeros(size_t m, size_t n);\n", "struct Matrix matrix_identity(size_t n);\n", "void matrix_transpose(struct Matrix* mat);\n", "void matrix_mult(const struct Matrix* a, const struct Matrix* b, struct Matrix* c);\n", "```\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "- Die vorgegebenen Strukturen/Funktionen und eine genaue Beschreibung und Anforderungen finden Sie in [`task2.h`](task2.h)\n", "- Ihre Implementierung erfolgt in [`task2.c`](task2.c)\n", "- Die zugeordneten Tests finden Sie in [`task2.test.c`](task2.test.c) " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 3: Kommandozeilen-Programm Matrix/Matrix-Multiplikation (1 Punkt)\n", "\n", "Sie implementieren ein Programm, das \n", "\n", "- zwei Matrizen aus zwei `.csv`-Dateien einließt, \n", "- das Produkt der Matrizen berechnet (Matrix/Matrix-Multiplikation), und\n", "- das Ergebnis wiederum als `.csv`-Datei speichert.\n", "\n", "Die Dateinamen werden mittels der Kommandozeile übergeben.\n", "\n", "Das Programm bricht in folgenden Sitationen ab:\n", "\n", "- unzureichende Argumente\n", "- invalide Dateipfade\n", "- Fehler beim Einlesen der Dateien\n", "- inkompatible Matrix-Dimensionen" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "- Die vorgegebenen Deklaration und eine genaue Beschreibung und Anforderungen finden Sie in [`task3.main.c`](task3.main.c)\n", "- Ihre Implementierung erfolgt ebenfalls in [`task3.main.c`](task3.main.c)\n", "- Getestet wird Ihr Programm, indem es mit verschiedenen Parametern in der Kommandozeile aufgerufen wird (siehe auch [`CMakeLists.txt`](CMakeLists.txt) und im nächsten Abschnitt).\n", "- Nachfolgend werden die Ausgabedateien der letzten beiden Aufrufe mit den Tests in [`task3.test.c`](task3.test.c) überprüft." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Kompilieren/Testen\n", "\n", "So testen Sie Ihre Implementierung (direkter Aufruf von `gcc`):\n", "\n", "```shell\n", "# prepare\n", "mkdir build\n", "# compile\n", "gcc -g -std=c11 task1.main.c -o build/task1 -lm\n", "gcc -g -Imodules -std=c11 task2.c task2.test.c -o build/task2 -lm\n", "gcc -g -Imodules -std=c11 task2.c task3.main.c -o build/task3_main -lm\n", "gcc -g -Imodules -std=c11 task3.test.c -o build/task3_test -lm\n", "\n", "# run tests\n", "./build/task1\n", "./build/task2\t\n", "./build/task3_main --left rrev4x4.csv --right matrix4x2.csv # expect runtime fail: invalid arguments\n", "./build/task3_main --left hui.csv --right matrix4x2.csv --out result.csv # expect runtime fail: invalid input filename\n", "./build/task3_main --left matrix4x2.csv --right rrev4x4.csv --out result.csv # expect runtime fail: invalid matrix dimensions\n", "./build/task3_main --left rrev4x4.csv --right matrix4x2.csv --out hui/result.csv # expect runtime fail: invalid output filename\n", "./build/task3_main --left rrev4x4.csv --right invalid.csv --out matrix4x2_rrow.csv # expect runtime fail: invalid line in invalid.csv\n", "./build/task3_main --left rrev4x4.csv --right matrix4x2.csv --out matrix4x2_rrow.csv # expected succeed and to generate matrix4x2_rrow.csv\n", "./build/task3_main --left matrix4x2.csv --right rcol2x2.csv --out matrix4x2_rcols.csv # expected succeed and to generate matrix4x2_rcols.csv\n", "./build/task3_test # tests the contents of the generated files matrix4x2_rrow.csv and matrix4x2_rcols.csv\n", "```\n", "\n", "Alternativ (mittels CMake-Configuration):\n", "\n", "```shell\n", "# prepare\n", "cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug # Windows\n", "cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug -D CMAKE_C_FLAGS=\"-fsanitize=address\" # Linux\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 }