diff --git a/Start_Windows/numbers.c b/Start_Windows/numbers.c index 5774a08..41d0388 100644 --- a/Start_Windows/numbers.c +++ b/Start_Windows/numbers.c @@ -16,27 +16,32 @@ static int compareUInt(const void *a, const void *b) return 0; } -// Returns len random numbers between 1 and 2x len in random order which are all different, -// except for two entries. Uses the binary search tree to avoid duplicates. +// Gibt ein Array mit len zufälligen Zahlen zwischen 1 und 2*len zurück, die alle unterschiedlich sind, +// außer zwei Einträgen (ein Duplikat). Verwendet den Binärbaum, um Duplikate zu vermeiden. unsigned int *createNumbers(unsigned int len) { + // Überprüfe ungültige Länge if (len < 2) return NULL; + // Allokiere Speicher für das Array unsigned int *arr = malloc(sizeof(unsigned int) * len); if (!arr) return NULL; + // Initialisiere Zufallszahlengenerator srand((unsigned int)time(NULL)); TreeNode *root = NULL; unsigned int count = 0; - while (count < len - 1) // generate len-1 UNIQUE numbers + // Generiere len-1 eindeutige Zahlen + while (count < len - 1) { unsigned int val = (rand() % (2 * len)) + 1; int isDup = 0; + // Füge in Baum ein und prüfe auf Duplikat root = addToTree(root, &val, sizeof(unsigned int), compareUInt, &isDup); if (!isDup) @@ -45,28 +50,30 @@ unsigned int *createNumbers(unsigned int len) } } - // pick a random existing value to duplicate + // Wähle einen zufälligen bestehenden Wert als Duplikat unsigned int duplicateIndex = rand() % (len - 1); arr[len - 1] = arr[duplicateIndex]; + // Baum freigeben clearTree(root); return arr; } -// Returns the only number in the array that occurs twice. +// Gibt die einzige Zahl im Array zurück, die zweimal vorkommt. unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) { + // Überprüfe ungültige Eingaben if (!numbers || len < 2) return 0; - // copy array + // Kopiere Array unsigned int *copy = malloc(sizeof(unsigned int) * len); if (!copy) return 0; memcpy(copy, numbers, sizeof(unsigned int) * len); - // sort + // Sortiere das Array (einfache Bubble-Sort) for (unsigned int i = 0; i < len - 1; i++) { for (unsigned int j = i + 1; j < len; j++) @@ -80,7 +87,7 @@ unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) } } - // find adjacent duplicate + // Finde angrenzendes Duplikat unsigned int duplicate = 0; for (unsigned int i = 0; i < len - 1; i++) { @@ -91,6 +98,7 @@ unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) } } + // Speicher freigeben free(copy); return duplicate; } diff --git a/Start_Windows/test_numbers.c b/Start_Windows/test_numbers.c new file mode 100644 index 0000000..c6eb0c0 --- /dev/null +++ b/Start_Windows/test_numbers.c @@ -0,0 +1,60 @@ +#include +#include +#include "numbers.h" + +// Einfache Funktion, um zu zählen, wie oft eine Zahl im Array vorkommt +int countOccurrences(const unsigned int *arr, unsigned int len, unsigned int value) { + int count = 0; + for (unsigned int i = 0; i < len; i++) { + if (arr[i] == value) count++; + } + return count; +} + +// Testfunktion für createNumbers und getDuplicate +void testNumbers(unsigned int len) { + printf("Teste mit Laenge %u:\n", len); + + // Erstelle Zahlenarray + unsigned int *numbers = createNumbers(len); + if (numbers == NULL) { + printf("Fehler: Konnte Array nicht erstellen.\n"); + return; + } + + // Gib Array aus + printf("Generierte Zahlen: "); + for (unsigned int i = 0; i < len; i++) { + printf("%u ", numbers[i]); + } + printf("\n"); + + // Finde Duplikat + unsigned int duplicate = getDuplicate(numbers, len); + printf("Gefundenes Duplikat: %u\n", duplicate); + + // Überprüfe, ob es genau zweimal vorkommt + int occ = countOccurrences(numbers, len, duplicate); + if (occ == 2) { + printf("Korrekte Überprüfung: %u kommt genau zweimal vor.\n", duplicate); + } else { + printf("Fehler: %u kommt %d mal vor (sollte 2 sein).\n", duplicate, occ); + } + + // Speicher freigeben + free(numbers); + printf("\n"); +} + +int main() { + printf("Testprogramm für numbers.c\n"); + printf("=========================\n\n"); + + // Teste mit verschiedenen Längen + testNumbers(5); + testNumbers(10); + testNumbers(20); + + printf("Tests abgeschlossen.\n"); + return 0; +} \ No newline at end of file diff --git a/Start_Windows/test_numbers.exe b/Start_Windows/test_numbers.exe new file mode 100644 index 0000000..105ef04 Binary files /dev/null and b/Start_Windows/test_numbers.exe differ