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

218 lines
6.4 KiB
Plaintext

{
"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 <ctype.h> // isspace\n",
"\t#include <stdio.h> // printf\n",
"\t#include <stddef.h> // 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 `<string.h>` (Standardbibliothek) verwenden. Hintergrund: die Funktionen, die Sie implementieren sind stark an Funktionen aus `<string.h>` 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
}