From 68c0349f042671a533ce5839e5d8a82b437c884e Mon Sep 17 00:00:00 2001 From: paulusja Date: Thu, 5 Nov 2026 09:41:23 +0100 Subject: [PATCH] Add static solution as template for dynamic solution. --- 06_dynamic/main.c | 80 ++++++++++++++++++++++++++++++++++ 06_dynamic/makefile | 16 +++++++ 06_dynamic/namesarchive.c | 91 +++++++++++++++++++++++++++++++++++++++ 06_dynamic/namesarchive.h | 22 ++++++++++ 4 files changed, 209 insertions(+) create mode 100644 06_dynamic/main.c create mode 100644 06_dynamic/makefile create mode 100644 06_dynamic/namesarchive.c create mode 100644 06_dynamic/namesarchive.h diff --git a/06_dynamic/main.c b/06_dynamic/main.c new file mode 100644 index 0000000..eaf8b70 --- /dev/null +++ b/06_dynamic/main.c @@ -0,0 +1,80 @@ +/* + * Vervollständigen Sie das untenstehende Programm, indem Sie das Modul namesarchive in der + * namesarchive.h bzw. namesarchive.c implementieren. + * Die öffentlichen Schnittstellen mit genaueren Details entnehmen Sie der namesarchive.h. + * Das Programm soll das Modul als dynamische Laufzeitbibliothek nutzen. + * + */ + +#include +#include +#include +#include "namesarchive.h" + +#define MAX_BUFFER_LEN 100 + +char *inputName(const char *promptText, char *buffer, unsigned int bufferSize); + +int main() +{ + char buffer[MAX_BUFFER_LEN]; + + while((inputName("Namen hinzufuegen: ", buffer, MAX_BUFFER_LEN) != NULL) && (strlen(buffer) > 0)) + { + if(addName(buffer)) + printf("%s wurde dem Archiv hinzugefuegt.\n", buffer); + else + printf("Fehler! %s konnte nicht hinzugefuegt werden.\n", buffer); + } + + printf("\nNach Eingabe:\n"); + printNames(); + + printf("\nNach Sortierung:\n"); + sortNames(); + printNames(); + printf("\n"); + + while((inputName("Namen sortiert hinzufuegen: ", buffer, MAX_BUFFER_LEN) != NULL) && (strlen(buffer) > 0)) + { + if(addNameSorted(buffer)) + printf("%s wurde dem Archiv hinzugefuegt.\n", buffer); + else + printf("Fehler! %s konnte nicht hinzugefuegt werden.\n", buffer); + } + + printf("\nNach sortierter Eingabe:\n"); + printNames(); + printf("\n"); + + while((inputName("Namen entfernen: ", buffer, MAX_BUFFER_LEN) != NULL) && (strlen(buffer) > 0)) + { + if(removeName(buffer)) + printf("%s wurde aus dem Archiv entfernt.\n", buffer); + else + printf("Fehler! %s konnte nicht gefunden werden.\n", buffer); + } + + printf("\nNach Entfernen:\n"); + printNames(); + + return EXIT_SUCCESS; +} + +char *inputName(const char *promptText, char *buffer, unsigned int bufferSize) +{ + printf("%s", promptText); + if(fgets(buffer, bufferSize, stdin) != NULL) + { + if(buffer[strlen(buffer)-1] == '\n') + buffer[strlen(buffer)-1] = '\0'; + else + while(getchar() != '\n') {} + + return buffer; + } + else + { + return NULL; + } +} \ No newline at end of file diff --git a/06_dynamic/makefile b/06_dynamic/makefile new file mode 100644 index 0000000..e8014a9 --- /dev/null +++ b/06_dynamic/makefile @@ -0,0 +1,16 @@ +namesarchive: main.o libnamesarchive.so + gcc -Wall -o namesarchive main.o libnamesarchive.so + +main.o: main.c + gcc -c -Wall main.c + +namesarchive.o: namesarchive.c namesarchive.h + gcc -c -Wall namesarchive.c + +libnamesarchive.so: namesarchive.o + gcc -shared -o libnamesarchive.so namesarchive.o + +clean: + del /f namesarchive.exe *.o *.so +# Comment line above and uncomment line below for UNIX systems +# rm -f namesarchive *.o *.so \ No newline at end of file diff --git a/06_dynamic/namesarchive.c b/06_dynamic/namesarchive.c new file mode 100644 index 0000000..918fffb --- /dev/null +++ b/06_dynamic/namesarchive.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include "namesarchive.h" + +static char names[MAX_NAMES][MAX_NAME_LEN]; +static unsigned int numberOfNames = 0; + +static int findNameIdx(const char *name); +static void removeNameByIdx(unsigned int idx); +static int compareNames(const void *arg1, const void *arg2); + +// Fügt einen Namen hinzu. Im Fehlerfall (Archiv ist voll) soll 0, ansonsten 1 zurückgegeben werden. +// Ist der angegebene Name länger als die zulässige Namenslänge, wird der Name abgeschnitten hinzugefügt. Rückgabe ist dann 1. +int addName(const char *name) +{ + if(numberOfNames < MAX_NAMES) + { + strncpy(names[numberOfNames], name, MAX_NAME_LEN); + names[numberOfNames][MAX_NAME_LEN-1] = '\0'; + numberOfNames++; + return 1; + } + else + return 0; +} + +// Wie addName. Fügt Namen aber direkt sortiert hinzu. Voraussetzung ist ein bereits sortiertes Archiv. +int addNameSorted(const char *name) +{ + return 0; +} + +// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden). +int removeName(const char *name) +{ + int nameIdx = findNameIdx(name); + + if(nameIdx >= 0) + { + removeNameByIdx(nameIdx); + return 1; + } + else + return 0; +} + +int findNameIdx(const char *name) +{ + for(int i = 0; i < numberOfNames; i++) + { + if(strcmp(names[i], name) == 0) + { + return i; + } + } + return -1; +} + +void removeNameByIdx(unsigned int idx) +{ + for(unsigned i = idx+1; i < numberOfNames; i++) + { + strncpy(names[i-1], names[i], MAX_NAME_LEN); + names[i-1][MAX_NAME_LEN-1] = '\0'; + } + numberOfNames--; +} + +int compareNames(const void *arg1, const void *arg2) +{ + const char (*name1)[MAX_NAME_LEN] = arg1; + const char (*name2)[MAX_NAME_LEN] = arg2; + + return strcmp(*name1, *name2); +} + +// Sortiert die Namen im Archiv aufsteigend. +void sortNames() +{ + qsort(names, numberOfNames, sizeof(names[0]), compareNames); +} + +// Gibt die Namen zeilenweise aus. +void printNames() +{ + for(int i = 0; i < numberOfNames; i++) + { + printf("%s\n", names[i]); + } +} \ No newline at end of file diff --git a/06_dynamic/namesarchive.h b/06_dynamic/namesarchive.h new file mode 100644 index 0000000..93b4542 --- /dev/null +++ b/06_dynamic/namesarchive.h @@ -0,0 +1,22 @@ +#ifndef NAMEARCHIVE_H +#define NAMEARCHIVE_H + +// Maximale Namenslänge +#define MAX_NAME_LEN 10 + +// Maximale Anzahl an Namen +#define MAX_NAMES 100 + +// Fügt einen Namen hinzu. Im Fehlerfall (Archiv ist voll) soll 0, ansonsten 1 zurückgegeben werden. +// Ist der angegebene Name länger als die zulässige Namenslänge, wird der Name abgeschnitten hinzugefügt. Rückgabe ist dann 1. +int addName(const char *name); +// Wie addName. Fügt Namen aber direkt sortiert hinzu. Voraussetzung ist ein bereits sortiertes Archiv. +int addNameSorted(const char *name); +// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden). +int removeName(const char *name); +// Sortiert die Namen im Archiv aufsteigend. +void sortNames(); +// Gibt die Namen zeilenweise aus. +void printNames(); + +#endif \ No newline at end of file