From a385f4d623a1401e5739790df4083509dcc4a571 Mon Sep 17 00:00:00 2001 From: paulusja Date: Thu, 29 Oct 2026 11:15:37 +0100 Subject: [PATCH] Add module for structs. --- 05_structs/namesarchive.c | 91 +++++++++++++++++++++++++++++++++++++++ 05_structs/namesarchive.h | 27 ++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 05_structs/namesarchive.c create mode 100644 05_structs/namesarchive.h diff --git a/05_structs/namesarchive.c b/05_structs/namesarchive.c new file mode 100644 index 0000000..9a939cc --- /dev/null +++ b/05_structs/namesarchive.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include "namesarchive.h" + +static Person persons[MAX_PERSONS]; +static unsigned int numberOfPersons = 0; + +static int findPersonIdx(Person person); +static void removePersonByIdx(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 addPerson(const Person person) +{ + if(numberOfPersons < MAX_PERSONS) + { + persons[numberOfPersons] = person; + numberOfPersons++; + return 1; + } + else + return 0; +} + +// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden). +int removePerson(const Person person) +{ + int personIdx = findPersonIdx(person); + + if(personIdx >= 0) + { + removePersonByIdx(personIdx); + return 1; + } + else + return 0; +} + +int findPersonIdx(const Person person) +{ + for(int i = 0; i < numberOfPersons; i++) + { + if(strcmp(persons[i].name, person.name) == 0 && persons[i].age == person.age) + { + return i; + } + } + return -1; +} + +void removePersonByIdx(unsigned int idx) +{ + for(unsigned i = idx+1; i < numberOfPersons; i++) + { + persons[i] = persons[i+1]; + } + numberOfPersons--; +} + +int comparePersons(const void *arg1, const void *arg2) +{ + const Person person1 = *((const Person *)arg1); + const Person person2 = *((const Person *)arg2); + + int nameResult = strcmp(person1.name, person2.name); + + if(nameResult == 0) + { + return (int)person1.age - (int)person2.age; + } + else + return nameResult; +} + +// Sortiert die Namen im Archiv aufsteigend. +void sortPersons() +{ + qsort(persons, numberOfPersons, sizeof(persons[0]), comparePersons); +} + +// Gibt die Namen zeilenweise aus. +void printPersons() +{ + for(int i = 0; i < numberOfPersons; i++) + { + printf("%s: %u\n", persons[i].name), persons[i].age; + } +} + diff --git a/05_structs/namesarchive.h b/05_structs/namesarchive.h new file mode 100644 index 0000000..5d655e4 --- /dev/null +++ b/05_structs/namesarchive.h @@ -0,0 +1,27 @@ +#ifndef NAMEARCHIVE_H +#define NAMEARCHIVE_H + +// Maximale Namenslänge +#define MAX_NAME_LEN 10 + +// Maximale Anzahl an Namen +#define MAX_PERSONS 100 + +typedef struct +{ + char name[MAX_NAME_LEN]; + unsigned int age; +} Person; + +// 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 addPerson(const Person person); + +int removeName(const Person person); + +void sortPersons(); +// Gibt die Namen zeilenweise aus. +void printPersons(); + + +#endif \ No newline at end of file