From 6131fba41df82a16538df4ee5ee037bdd91e4c8f Mon Sep 17 00:00:00 2001 From: paulusja Date: Thu, 9 Oct 2025 12:00:03 +0200 Subject: [PATCH] Add assignments for second lecture. --- .gitignore | 4 +- 01_modultechnik/main.c | 80 ++++++++++++++++++++++++++++++++++ 01_modultechnik/makefile | 16 +++++++ 01_modultechnik/namesarchive.c | 4 ++ 01_modultechnik/namesarchive.h | 22 ++++++++++ 5 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 01_modultechnik/main.c create mode 100644 01_modultechnik/makefile create mode 100644 01_modultechnik/namesarchive.c create mode 100644 01_modultechnik/namesarchive.h diff --git a/.gitignore b/.gitignore index adb36c8..a1eeabf 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -*.exe \ No newline at end of file +*.exe +*.o +*.so \ No newline at end of file diff --git a/01_modultechnik/main.c b/01_modultechnik/main.c new file mode 100644 index 0000000..eaf8b70 --- /dev/null +++ b/01_modultechnik/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/01_modultechnik/makefile b/01_modultechnik/makefile new file mode 100644 index 0000000..e8014a9 --- /dev/null +++ b/01_modultechnik/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/01_modultechnik/namesarchive.c b/01_modultechnik/namesarchive.c new file mode 100644 index 0000000..7eaabac --- /dev/null +++ b/01_modultechnik/namesarchive.c @@ -0,0 +1,4 @@ +#include "namesarchive.h" +#include +#include +#include diff --git a/01_modultechnik/namesarchive.h b/01_modultechnik/namesarchive.h new file mode 100644 index 0000000..93b4542 --- /dev/null +++ b/01_modultechnik/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