92 lines
2.1 KiB
C
92 lines
2.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#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 comparePersons(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);
|
|
}
|
|
}
|
|
|