204 lines
7.4 KiB
Plaintext
204 lines
7.4 KiB
Plaintext
{
|
|
"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 <limits.h> // INT_MAX\n",
|
|
"\t#include <stdio.h> // 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
|
|
}
|