From bc923cca9fff1ff89de4914cfce73ab538deb1da Mon Sep 17 00:00:00 2001 From: Nicolas Date: Mon, 15 Dec 2025 20:51:15 +0100 Subject: [PATCH] =?UTF-8?q?Unit=20Test=20f=C3=BCr=20numbers.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Start_Windows/numbers.c | 24 ++++++++----- Start_Windows/test_numbers.c | 60 +++++++++++++++++++++++++++++++++ Start_Windows/test_numbers.exe | Bin 0 -> 69754 bytes 3 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 Start_Windows/test_numbers.c create mode 100644 Start_Windows/test_numbers.exe 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 0000000000000000000000000000000000000000..105ef0463b1605fdda9487de93eed1b60af1d840 GIT binary patch literal 69754 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 z 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 M8wFJ$rqA{NAJWR;7XSbN literal 0 HcmV?d00001