From 212c38a2f83cccac0f9e4e5b19456ab0e9fb6a1f Mon Sep 17 00:00:00 2001 From: paulusja Date: Thu, 30 Oct 2025 13:22:22 +0100 Subject: [PATCH] Add students archive. --- 04_strukturen/main.c | 37 +++++++++++++++ 04_strukturen/makefile | 16 +++++++ 04_strukturen/namesarchive.c | 89 ++++++++++++++++++++++++++++++++++++ 04_strukturen/namesarchive.h | 25 ++++++++++ 4 files changed, 167 insertions(+) create mode 100644 04_strukturen/main.c create mode 100644 04_strukturen/makefile create mode 100644 04_strukturen/namesarchive.c create mode 100644 04_strukturen/namesarchive.h diff --git a/04_strukturen/main.c b/04_strukturen/main.c new file mode 100644 index 0000000..63ea006 --- /dev/null +++ b/04_strukturen/main.c @@ -0,0 +1,37 @@ +/* + * 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" + + +int main(int argc, char *argv[]) +{ + addStudent("Zorro", 999); + addStudent("Adam", 123); + addStudent("Fred", 789); + addStudent("Anna", 456); + addStudent("Zorro", 111); + + printf("\nNach Eingabe:\n"); + printStudents(); + + sortStudents(); + printf("\nNach Sortierung:\n"); + printStudents(); + + removeStudent("Anna"); + removeStudent("Karl"); + + printf("\nNach Entfernen:\n"); + printStudents(); + + return EXIT_SUCCESS; +} diff --git a/04_strukturen/makefile b/04_strukturen/makefile new file mode 100644 index 0000000..e8014a9 --- /dev/null +++ b/04_strukturen/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/04_strukturen/namesarchive.c b/04_strukturen/namesarchive.c new file mode 100644 index 0000000..3c51303 --- /dev/null +++ b/04_strukturen/namesarchive.c @@ -0,0 +1,89 @@ +#include "namesarchive.h" +#include +#include +#include + +#define INDEX_NOT_FOUND -1 + +typedef struct +{ + char name[MAX_NAME_LEN+1]; + unsigned int id; +} Student; + +Student students[MAX_NAMES]; +unsigned int numberOfEntries = 0; + +int addStudent(const char *name, unsigned int id) +{ + if(numberOfEntries < MAX_NAMES) + { + strncpy(students[numberOfEntries].name, name, MAX_NAME_LEN+1); + students[numberOfEntries].name[MAX_NAME_LEN] = '\0'; + students[numberOfEntries].id = id; + numberOfEntries++; + return 1; + } + + return 0; +} + +void printStudents() +{ + for(int i = 0; i < numberOfEntries; i++) + { + printf("%s: %u\n", students[i].name, students[i].id); + } +} + +static int getNameIdx(const char *name) +{ + for(int i = 0; i < numberOfEntries; i++) + { + if(strcmp(name, students[i].name) == 0) + return i; + } + return INDEX_NOT_FOUND; +} + +static void removeAt(int idx) +{ + for(int i = idx; i < numberOfEntries-1; i++) + { + students[i] = students[i+1]; + } + numberOfEntries--; +} + +Status removeStudent(const char *name) +{ + int idx = getNameIdx(name); + + if(idx == INDEX_NOT_FOUND) + { + return REMOVE_ERROR; + } + else + { + removeAt(idx); + return STATUS_OK; + } +} + +static int compareStudents(const void *arg1, const void *arg2) +{ + const Student *student1 = (const Student *)arg1; + const Student *student2 = (const Student *)arg2; + + int nameDiff = strcmp(student1->name, student2->name); + + if(nameDiff == 0) + return student1->id - student2->id; + else + return nameDiff; +} + +void sortStudents() +{ + qsort(students, numberOfEntries, sizeof(Student), compareStudents); +} \ No newline at end of file diff --git a/04_strukturen/namesarchive.h b/04_strukturen/namesarchive.h new file mode 100644 index 0000000..125e5d2 --- /dev/null +++ b/04_strukturen/namesarchive.h @@ -0,0 +1,25 @@ +#ifndef NAMEARCHIVE_H +#define NAMEARCHIVE_H + +// Maximale Namenslänge +#define MAX_NAME_LEN 10 + +// Maximale Anzahl an Namen +#define MAX_NAMES 100 + +typedef enum {IO_ERROR, STATUS_OK, REMOVE_ERROR} Status; + +// 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 addStudent(const char *name, unsigned int id); +// Wie addName. Fügt Namen aber direkt sortiert hinzu. Voraussetzung ist ein bereits sortiertes Archiv. +int addStudentSorted(const char *name, unsigned int id); +// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden). +Status removeStudent(const char *name); +// Sortiert die Namen im Archiv aufsteigend. +void sortStudents(); +// Gibt die Namen zeilenweise aus. +void printStudents(); + + +#endif \ No newline at end of file