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

View File

@ -23,13 +23,21 @@ static int compareUInt(const void *a, const void *b)
if (A > B) return 1;
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;
unsigned int B = *(const unsigned int*)b;
if (A < B) return -1;
if (A > B) return +1;
if (!root) return 0;
unsigned int *data;
// Traversierung initialisieren
nextTreeData(root);
while ((data = nextTreeData(NULL)) != NULL)
{
if (*data == value)
return 1;
}
return 0;
}
@ -39,56 +47,50 @@ unsigned int *createNumbers(unsigned int len)
srand((unsigned int)time(NULL));
// Speicher für das Array
unsigned int *numbers = malloc(sizeof(unsigned int) * len);
if (!numbers) return NULL;
TreeNode *root = NULL; // Baumwurzel
TreeNode *root = NULL;
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++)
{
while (1)
do
{
value = (rand() % (2 * len)) + 1; // Zufallszahl 1..2*len
isDuplicate = 0;
value = (rand() % (2 * len)) + 1;
}
while (existsInTree(root, value));
TreeNode *newRoot = addToTree(
// Baum wie highscore benutzen (immer NULL)
root = addToTree(
root,
&value,
sizeof(unsigned int),
compareUInt,
&isDuplicate
NULL
);
if (!isDuplicate)
{
// Neue Zahl - akzeptieren
root = newRoot;
numbers[i] = value;
break;
}
// Sonst neue Zahl generieren
}
}
//genau eine Zufallszahl duplizieren
// genau eine Zufallszahl duplizieren
unsigned int idx1 = rand() % len;
unsigned int idx2 = rand() % len;
unsigned int idx2;
while (idx2 == idx1)
do
{
idx2 = rand() % len;
}
while (idx2 == idx1);
numbers[idx2] = numbers[idx1];
// Baum wieder freigeben
clearTree(root);
return numbers;
}
// 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)
{
@ -101,7 +103,7 @@ unsigned int getDuplicate(const unsigned int numbers[], unsigned int len)
memcpy(copy, numbers, len * sizeof(unsigned int));
// Sortieren
qsort(copy, len, sizeof(unsigned int), compareQsort);
qsort(copy, len, sizeof(unsigned int), compareUInt);
// Doppelte Zahl finden
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
}
// prüft, ob ein Array nur EIN Duplikat enthält
static int countDuplicates(const unsigned int *arr, unsigned int len) {
int count = 0;
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)
// Testet, ob createNumbers ein gültiges Array erzeugt
// und genau ein Duplikat enthalten ist
void test_createNumbers_basic(void)
{
unsigned int len = 100;
unsigned int *arr = createNumbers(len);
unsigned int len = 10;
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
// Es muss genau EIN Duplikat geben
unsigned int duplicate = getDuplicate(numbers, len);
TEST_ASSERT_NOT_EQUAL(0, duplicate);
// Prüfen: Array enthält GENAU EIN Duplikat
int dupCount = countDuplicates(arr, len);
TEST_ASSERT_EQUAL_INT(1, dupCount);
free(arr);
free(numbers);
}
// TEST 2: Prüfen, ob getDuplicate die richtige doppelte Zahl erkennt
static void test_getDuplicate_correctValue(void)
/// Testet, ob getDuplicate die korrekte doppelte Zahl erkennt
void test_getDuplicate_correctValue(void)
{
unsigned int len = 200;
unsigned int *arr = createNumbers(len);
unsigned int numbers[] = {1, 3, 5, 7, 3};
unsigned int len = 5;
TEST_ASSERT_NOT_NULL(arr);
unsigned int dup = getDuplicate(numbers, len);
unsigned int duplicate = getDuplicate(arr, len);
// 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_ASSERT_EQUAL(3, dup);
}
// TEST 3: getDuplicate gibt 0 aus bei Fehlern
// Testet Fehlerfälle von getDuplicate
static void test_getDuplicate_errors(void)
{
TEST_ASSERT_EQUAL_UINT(0, getDuplicate(NULL, 10));