{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 1: Ein eigenes kleines C-Programm (*count spaces in string*) (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 // isspace\n", "\t#include // printf\n", "\t#include // size_t\t\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 size_t 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: Vergleichen und Kopieren von nullterminierten Zeichenketten (1 Punkt)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "vscode": { "languageId": "plaintext" } }, "source": [ "**Wichtig:** Sie duerfen fuer Aufgabe 2 **keine** Funktionalitaet aus der Header-Datei `` (Standardbibliothek) verwenden. Hintergrund: die Funktionen, die Sie implementieren sind stark an Funktionen aus `` angelehnt (`strcpy/strncpy` und `strcmp/strncmp`)." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Sie implementieren zwei Funktionen, die nullterminierte Zeichenketten lexikographisch vergleichen. Lexikographisch bedeutet hier: \n", "- die Sequenzen werden Zeichen-für-Zeichen verglichen\n", "- ein kleinerer Wert liegt lexikographisch vor einem grösseren Wert\n", "- Bei der Kontrolle/Debuggen mittels Ausgabe in der Konsole ist die Zuordnung der Zeichen (`char`) mittels der [ASCII-Tabelle](https://en.wikipedia.org/wiki/ASCII#Character_set) zu beachten; es ergibt sich u.A. folgendes:\n", "\t- Das Terminierungszeichen (`\\0`) kommt vor allen anderen Zeichen\n", "\t- Zahlen kommen vor Buchstaben\n", "\t- Grosse Buchstabe kommen vor kleinen Buchstaben\n", "\t- usw.\n", "\n", "```c\n", "// todo: implement\n", "int task2_compare(const char* a, const char* b);\n", "// todo: implement\n", "int task2_compare_n(const char* a, const char* b, size_t count);\n", "```\n", "\n", "Sie implementieren zwei weitere Funktionen, die nullterminierte Zeichenketten kopieren.\n", "\n", "```c\n", "// todo: implement\n", "char* task2_copy(char* dest, const char* src);\n", "// todo: implement\n", "char* task2_copy_n(char* dest, const char* src, size_t count);\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: Analyse einer mehrzeiligen Zeichenkette (1 Punkt)\n", "\n", "Sie implementieren eine Funktionen, die eine nullterminierte mehrzeilige Zeichenkette analysiert:\n", "- wieviele Zeilen gibt es?\n", "- wieviele Wörter kommen vor?" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "vscode": { "languageId": "c" } }, "source": [ "```c\n", "struct StringStats {\n", " unsigned int lines;\n", " unsigned int words;\n", "};\n", "\n", "// todo: implement\n", "struct StringStats task3_stringstats(const char* str);\n", "```" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "- Die vorgegebenen Deklaration und eine genaue Beschreibung und Anforderungen finden Sie in [`task3.h`](task3.h)\n", "- Ihre Implementierung erfolgt in [`task3.c`](task3.c)\n", "- Die zugeordneten Tests finden Sie in [`task3.test.c`](task3.test.c)" ] }, { "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 task3.c task3.test.c -o build/task3 -lm\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 }