From 634f006569d19b6778012040e7939933f4e025da Mon Sep 17 00:00:00 2001 From: paulusja Date: Thu, 23 Oct 2025 12:49:36 +0200 Subject: [PATCH] Add old solution for namesarchive. --- 03_dateien/main.c | 80 +++++++++++++++++++++++++++++++++++++++ 03_dateien/namesarchive.c | 79 ++++++++++++++++++++++++++++++++++++++ 03_dateien/namesarchive.h | 22 +++++++++++ 3 files changed, 181 insertions(+) create mode 100644 03_dateien/main.c create mode 100644 03_dateien/namesarchive.c create mode 100644 03_dateien/namesarchive.h diff --git a/03_dateien/main.c b/03_dateien/main.c new file mode 100644 index 0000000..4d5b2dc --- /dev/null +++ b/03_dateien/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/03_dateien/namesarchive.c b/03_dateien/namesarchive.c new file mode 100644 index 0000000..061fd60 --- /dev/null +++ b/03_dateien/namesarchive.c @@ -0,0 +1,79 @@ +#include "namesarchive.h" +#include +#include +#include + +#define INDEX_NOT_FOUND -1 + +static char names[MAX_NAMES][MAX_NAME_LEN+1]; +static unsigned int numberOfEntries = 0; + +/* +static void cpy(char *dst, const char *src, unsigned int max) +{ + int i; + for(i = 0; i < max && *src != '\0'; i++) + { + *dst = *src; + dst++; + src++; + } + if(i < max) + *dst = '\0'; +}*/ + +int addName(const char *name) +{ + if(numberOfEntries < MAX_NAMES) + { + strncpy(names[numberOfEntries], name, MAX_NAME_LEN+1); + names[numberOfEntries][MAX_NAME_LEN] = '\0'; + numberOfEntries++; + return 1; + } + + return 0; +} + +void printNames() +{ + for(int i = 0; i < numberOfEntries; i++) + { + printf("%s\n", names[i]); + } +} + +static int getNameIdx(const char *name) +{ + for(int i = 0; i < numberOfEntries; i++) + { + if(strcmp(name, names[i]) == 0) + return i; + } + return INDEX_NOT_FOUND; +} + +static void removeAt(int idx) +{ + for(int i = idx; i < numberOfEntries-1; i++) + { + strncpy(names[i], names[i+1], MAX_NAME_LEN+1); + names[i][MAX_NAME_LEN] = '\0'; + } + numberOfEntries--; +} + +int removeName(const char *name) +{ + int idx = getNameIdx(name); + + if(idx == INDEX_NOT_FOUND) + { + return 0; + } + else + { + removeAt(idx); + return 1; + } +} \ No newline at end of file diff --git a/03_dateien/namesarchive.h b/03_dateien/namesarchive.h new file mode 100644 index 0000000..93b4542 --- /dev/null +++ b/03_dateien/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