From 680e72b478dd39627272fff5484de239fc1fa7a6 Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 19 Nov 2025 23:18:13 +0100 Subject: [PATCH 1/3] completed numbers --- I2_Dobble/numbers.c | 63 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/I2_Dobble/numbers.c b/I2_Dobble/numbers.c index f59d9a2..5817686 100644 --- a/I2_Dobble/numbers.c +++ b/I2_Dobble/numbers.c @@ -14,13 +14,74 @@ // Returns len random numbers between 1 and 2x len in random order which are all different, except for two entries. // Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while // creating random numbers. +static int compare(const void *a, const void *b) +{ + return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b); +} + unsigned int *createNumbers(unsigned int len) { + if (len < 2) + return NULL; + unsigned int *numbers = malloc(sizeof(unsigned int) * len); + + if (!numbers) + return NULL; + + srand(time(NULL)); + + TreeNode *root = NULL; + + unsigned int i = 0; + while (i < len - 1) + { + unsigned int val = (rand() % (2 * len)) + 1; + int isDup = 0; + + root = addToTree(root, &val, sizeof(unsigned int), compare, &isDup); + + if (!isDup) + { + numbers[i++] = val; + } + } + + // Duplicate one random entry + unsigned int dupIndex = rand() % (len - 1); + numbers[len - 1] = numbers[dupIndex]; + + clearTree(root); //Notwendigkeit muss noch restlichem Code entnommen werden + 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) { + if (!numbers || len < 2) + return 0; -} \ No newline at end of file + unsigned int *numbersCopy = malloc(sizeof(unsigned int) * len); + if (!numbersCopy) + return 0; + + for (unsigned int i = 0; i < len; i++) + { + numbersCopy[i] = numbers[i]; + } + + qsort(numbersCopy, len, sizeof(unsigned int), compare); + + unsigned int duplicate = 0; + for (unsigned int i = 0; i < len - 1; i++) + { + if (numbersCopy[i] == numbersCopy[i+1]) + { + duplicate = numbersCopy[i]; + break; + } + } + + free(numbersCopy); + return duplicate; +} From 5d1d37f0dfc6f39fd417b65814b76072a6a9d80f Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 19 Nov 2025 23:30:44 +0100 Subject: [PATCH 2/3] numbersTests added and added to makefile --- I2_Dobble/makefile | 19 ++++++--- I2_Dobble/numbersTest.c | 89 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 I2_Dobble/numbersTest.c diff --git a/I2_Dobble/makefile b/I2_Dobble/makefile index 1f15f75..f2acc1f 100644 --- a/I2_Dobble/makefile +++ b/I2_Dobble/makefile @@ -1,5 +1,6 @@ CC = gcc -FLAGS = -g -Wall -lm +CFLAGS = -g -Wall +LDFLAGS = -lm ifeq ($(OS),Windows_NT) include makefile_windows.variables @@ -27,7 +28,7 @@ doble_initial: program_obj_files = stack.o bintree.o numbers.o timer.o highscore.o doble : main.o $(program_obj_files) - $(CC) $(FLAGS) $^ -o doble + $(CC) $(FLAGS) $(LDFLAGS) $^ -o doble $(program_obj_filesobj_files): %.o: %.c $(CC) -c $(FLAGS) $^ -o $@ @@ -35,15 +36,21 @@ $(program_obj_filesobj_files): %.o: %.c # -------------------------- # Unit Tests # -------------------------- -unitTests: - echo "needs to be implemented" +unitTests: numbersTest + ./runNumbersTest + +numbersTest: numbers.o bintree.o numbersTest.o $($(unityfolder)/unity.c) + $(CC) $(FLAGS) $(LDFLAGS) $^ -o $@ + +%.o: %.c + $(CC) -c $(FLAGS) $< -o $@ # -------------------------- # Clean # -------------------------- clean: ifeq ($(OS),Windows_NT) - del /f *.o doble + del /f *.o doble runNumbersTest else - rm -f *.o doble + rm -f *.o doble runNumbersTest endif \ No newline at end of file diff --git a/I2_Dobble/numbersTest.c b/I2_Dobble/numbersTest.c new file mode 100644 index 0000000..4bca72d --- /dev/null +++ b/I2_Dobble/numbersTest.c @@ -0,0 +1,89 @@ +#include "numbers.h" +#include "unity.h" +#include "unity_internals.h" + +void test_createNumbers_no_null(void) +{ + unsigned int *arr = createNumbers(10); + TEST_ASSERT_NOT_NULL(arr); + free(arr); +} + +void test_createNumbers_has_exactly_one_duplicate(void) +{ + unsigned int len = 100; + unsigned int *arr = createNumbers(len); + TEST_ASSERT_NOT_NULL(arr); + + unsigned int dup = getDuplicate(arr, len); + TEST_ASSERT_NOT_EQUAL(0, dup); + + int count = 0; + for (unsigned int i = 0; i < len; i++) + { + if (arr[i] == dup) + count++; + } + + TEST_ASSERT_EQUAL(2, count); + + free(arr); +} + +void test_createNumbers_has_correct_value_range(void) +{ + unsigned int len = 10; + unsigned int *arr = createNumbers(len); + TEST_ASSERT_NOT_NULL(arr); + + // Check all numbers are within valid range (1 to 2*len) + for (unsigned int i = 0; i < len; i++) + { + TEST_ASSERT_TRUE(arr[i] >= 1); + TEST_ASSERT_TRUE(arr[i] <= 2 * len); + } + + free(arr); +} + +void test_getDuplicate_returns_correct_value(void) +{ + unsigned int arr[6] = {4, 1, 7, 7, 3, 2}; + unsigned int d = getDuplicate(arr, 6); + TEST_ASSERT_EQUAL_UINT(7, d); +} + +void test_complete_function_of_numbers(void) +{ + unsigned int len = 50; + unsigned int *arr = createNumbers(len); + TEST_ASSERT_NOT_NULL(arr); + + unsigned int d1 = getDuplicate(arr, len); + TEST_ASSERT_NOT_EQUAL(0, d1); + + int count = 0; + + for (unsigned int i = 0; i < len; i++) + { + if (arr[i] == d1) + count++; + } + + TEST_ASSERT_EQUAL(2, count); + + free(arr); +} + +int main(void) +{ + UNITY_BEGIN(); + + RUN_TEST(test_createNumbers_no_null); + RUN_TEST(test_createNumbers_has_exactly_one_duplicate); + RUN_TEST(test_createNumbers_has_correct_value_range); + RUN_TEST(test_getDuplicate_returns_correct_value); + RUN_TEST(test_complete_function_of_numbers); + + return UNITY_END(); +} \ No newline at end of file From 9b2c820bd02d1ca6392eae4b845c2903000b2622 Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 19 Nov 2025 23:30:56 +0100 Subject: [PATCH 3/3] numbers.md added --- I2_Dobble/number.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 I2_Dobble/number.md diff --git a/I2_Dobble/number.md b/I2_Dobble/number.md new file mode 100644 index 0000000..4548262 --- /dev/null +++ b/I2_Dobble/number.md @@ -0,0 +1,27 @@ +*createNumbers: + +-> check if len is greater than 2 +-> create new array numbers, use malloc and check if correct +-> set seed for rand() +-> create new TreeNode root +-> add new value to tree using addToTree and rand() +-> addToTree sets isDup to 1, if value already exists +-> if value does not already exist -> add to numbers[] +-> + + +getDublicate: + +-> numbers (Zeiger != NULL) und len (min. 2) check +-> define new array numbersCopy +-> copy numbers to numbersCopy + -> simple loop to copy each element number -> numbersCopy +-> sort numbersCopy with qsort +-> compare each element of numbersCopy with next element (if numbersCopy[i] == numbersCopy[i+1] -> dublicate was found, because same values are right next to each other) +-> return found dublicate + +compare: + +-> gibt 1 aus, wenn a größer ist +-> gibt -1 aus, wenn b größer ist +-> gibt 0 aus wenn a==b