Add static solution as template for dynamic solution.

This commit is contained in:
paulusja committed 2026-11-05 09:41:23 +01:00
1 parent 596128d356
commit 68c0349f04
4 files changed
+209

No files matched your search

+80
View File
@@ -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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}
}
+16
View File
@@ -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
+91
View File
@@ -0,0 +1,91 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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]);
}
}
+22
View File
@@ -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