Anpassungen in numbers.c und in den entsprechenden Tests

This commit is contained in:
Florian Wetzel 2025-12-12 21:37:00 +01:00
parent 07796c1390
commit d391d60597
5 changed files with 60 additions and 80 deletions

BIN
bintree.o

Binary file not shown.

View File

@ -1 +1,3 @@
àoï;0
test;9238
player1;3999 player1;3999

View File

@ -23,13 +23,21 @@ static int compareUInt(const void *a, const void *b)
if (A > B) return 1; if (A > B) return 1;
return 0; return 0;
} }
// Sortiervergleich für qsort
int compareQsort(const void *a, const void *b) static int existsInTree(TreeNode *root, unsigned int value)
{ {
unsigned int A = *(const unsigned int*)a; if (!root) return 0;
unsigned int B = *(const unsigned int*)b;
if (A < B) return -1; unsigned int *data;
if (A > B) return +1;
// Traversierung initialisieren
nextTreeData(root);
while ((data = nextTreeData(NULL)) != NULL)
{
if (*data == value)
return 1;
}
return 0; return 0;
} }
@ -39,56 +47,50 @@ unsigned int *createNumbers(unsigned int len)
srand((unsigned int)time(NULL)); srand((unsigned int)time(NULL));
// Speicher für das Array
unsigned int *numbers = malloc(sizeof(unsigned int) * len); unsigned int *numbers = malloc(sizeof(unsigned int) * len);
if (!numbers) return NULL; if (!numbers) return NULL;
TreeNode *root = NULL; // Baumwurzel TreeNode *root = NULL;
unsigned int value; unsigned int value;
int isDuplicate;
//Array mit eindeutigen Zufallszahlen füllen // Array mit eindeutigen Zufallszahlen füllen
for (unsigned int i = 0; i < len; i++) for (unsigned int i = 0; i < len; i++)
{ {
while (1) do
{ {
value = (rand() % (2 * len)) + 1; // Zufallszahl 1..2*len value = (rand() % (2 * len)) + 1;
isDuplicate = 0;
TreeNode *newRoot = addToTree(
root,
&value,
sizeof(unsigned int),
compareUInt,
&isDuplicate
);
if (!isDuplicate)
{
// Neue Zahl - akzeptieren
root = newRoot;
numbers[i] = value;
break;
}
// Sonst neue Zahl generieren
} }
while (existsInTree(root, value));
// Baum wie highscore benutzen (immer NULL)
root = addToTree(
root,
&value,
sizeof(unsigned int),
compareUInt,
NULL
);
numbers[i] = value;
} }
//genau eine Zufallszahl duplizieren // genau eine Zufallszahl duplizieren
unsigned int idx1 = rand() % len; unsigned int idx1 = rand() % len;
unsigned int idx2 = rand() % len; unsigned int idx2;
while (idx2 == idx1) do
{
idx2 = rand() % len; idx2 = rand() % len;
}
while (idx2 == idx1);
numbers[idx2] = numbers[idx1]; numbers[idx2] = numbers[idx1];
// Baum wieder freigeben
clearTree(root); clearTree(root);
return numbers; return numbers;
} }
// Returns only the only number in numbers which is present twice. Returns zero on errors. // Returns only the only number in numbers which is present twice. Returns zero on errors.
unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) unsigned int getDuplicate(const unsigned int numbers[], unsigned int len)
{ {
@ -101,7 +103,7 @@ unsigned int getDuplicate(const unsigned int numbers[], unsigned int len)
memcpy(copy, numbers, len * sizeof(unsigned int)); memcpy(copy, numbers, len * sizeof(unsigned int));
// Sortieren // Sortieren
qsort(copy, len, sizeof(unsigned int), compareQsort); qsort(copy, len, sizeof(unsigned int), compareUInt);
// Doppelte Zahl finden // Doppelte Zahl finden
unsigned int duplicate = 0; unsigned int duplicate = 0;

BIN
numbers.o

Binary file not shown.

View File

@ -14,60 +14,36 @@ void tearDown(void) {
// gehört zu unit-Grundaufbau // gehört zu unit-Grundaufbau
} }
// prüft, ob ein Array nur EIN Duplikat enthält // Testet, ob createNumbers ein gültiges Array erzeugt
static int countDuplicates(const unsigned int *arr, unsigned int len) { // und genau ein Duplikat enthalten ist
int count = 0; void test_createNumbers_basic(void)
for (unsigned int i = 0; i < len; i++) {
for (unsigned int j = i + 1; j < len; j++) {
if (arr[i] == arr[j]) {
count++;
}
}
}
return count;
}
// Prüfen, ob createNumbers ein korrektes Array liefert
static void test_createNumbers_basic(void)
{ {
unsigned int len = 100; unsigned int len = 10;
unsigned int *arr = createNumbers(len); unsigned int *numbers = createNumbers(len);
TEST_ASSERT_NOT_NULL(arr); // prüft ob Speicher korrekt // Array muss existieren
TEST_ASSERT_NOT_NULL(numbers);
// Prüfen: Länge stimmt
// Prüfen: Array enthält GENAU EIN Duplikat
int dupCount = countDuplicates(arr, len);
TEST_ASSERT_EQUAL_INT(1, dupCount);
free(arr); // Es muss genau EIN Duplikat geben
unsigned int duplicate = getDuplicate(numbers, len);
TEST_ASSERT_NOT_EQUAL(0, duplicate);
free(numbers);
} }
// TEST 2: Prüfen, ob getDuplicate die richtige doppelte Zahl erkennt /// Testet, ob getDuplicate die korrekte doppelte Zahl erkennt
static void test_getDuplicate_correctValue(void)
void test_getDuplicate_correctValue(void)
{ {
unsigned int len = 200; unsigned int numbers[] = {1, 3, 5, 7, 3};
unsigned int *arr = createNumbers(len); unsigned int len = 5;
TEST_ASSERT_NOT_NULL(arr); unsigned int dup = getDuplicate(numbers, len);
unsigned int duplicate = getDuplicate(arr, len); TEST_ASSERT_EQUAL(3, dup);
// Manuelle Kontrolle: Der gefundene Wert muss tatsächlich doppelt vorkommen
int occurrences = 0;
for (unsigned int i = 0; i < len; i++) {
if (arr[i] == duplicate) {
occurrences++;
}
}
TEST_ASSERT_EQUAL_INT(2, occurrences);
free(arr);
} }
// TEST 3: getDuplicate gibt 0 aus bei Fehlern // Testet Fehlerfälle von getDuplicate
static void test_getDuplicate_errors(void) static void test_getDuplicate_errors(void)
{ {
TEST_ASSERT_EQUAL_UINT(0, getDuplicate(NULL, 10)); TEST_ASSERT_EQUAL_UINT(0, getDuplicate(NULL, 10));