diff --git a/numbers.c b/numbers.c index f59d9a2..9f33570 100644 --- a/numbers.c +++ b/numbers.c @@ -14,13 +14,91 @@ // 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. + +//ohne Binärbaum +/*unsigned int *createNumbers(unsigned int len) +{ + if (len <= 2) + return NULL; + + // Zufallszahlen erzeugen + srand(time(NULL)); + unsigned int *numbers = malloc(len * sizeof(unsigned int)); + //prüfen, ob Speicher richtig reserviert wurde + if(numbers == NULL){ + printf("Es konnte nicht genügend Speicher reserviert werden"); + free(numbers); + return NULL; + } + //einsetzen der Zahlen ins array + for (size_t i = 0; i < len; i++){ + numbers[i] = (rand()%(2*len))+1; + //stellt sicher, dass keine Duplikate vorhanden sind + for(size_t j = 0; j < i; j++){ + if(numbers[i] == numbers[j]){ + i--; + break; + } + } + + } + numbers[rand()% len] = (rand()% (2* len) )+ 1; + return numbers; + free(numbers); +}*/ + +int compare(const void *a, const void *b) { + return (*(int*)a - *(int*)b); +} +//mit Binärbaum unsigned int *createNumbers(unsigned int len) { + if (len <= 2) + return NULL; + + // Zufallszahlen erzeugen + srand(time(NULL)); + unsigned int *numbers = malloc(len * sizeof(unsigned int)); + //prüfen, ob Speicher richtig reserviert wurde + if(numbers == NULL){ + printf("Es konnte nicht genügend Speicher reserviert werden"); + free(numbers); + return NULL; + } + TreeNode *root = NULL; + for(size_t i= 0; i < len; i++){ + unsigned int isDup = 0; + numbers[i] = (rand()%(2*len))+1; + root = addToTree(root, &numbers, sizeof(numbers), compare, &isDup); + if(isDup != 1){ + i--; + } + } + + numbers[rand()% len] = (rand()% (2* len) + 1); + return numbers; + clearTree(root); + free(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) { + unsigned int dobble; + // neues Array zum reinkopieren initialisieren + unsigned int *nums = malloc(len * sizeof(unsigned int)); + for(int l = 0; l < len; l++) + nums[l] = numbers[l]; + //array sortieren + qsort(nums, len, sizeof(unsigned int), compare); + for(int k = 0; k < len; k++){ + if(nums[k] == nums[k+1]){ + dobble = nums[k]; + break; + } + } + return dobble; + free(nums); } \ No newline at end of file diff --git a/test_numbers.c b/test_numbers.c new file mode 100644 index 0000000..eec9e60 --- /dev/null +++ b/test_numbers.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include "numbers.h" +#include "bintree.h" +#include "unity.h" + +//überprüft, dass die Funktion nicht NULL zurückgibt +void test_create_Numbers_notNull(void){ + unsigned int* numbers = createNumbers(10); + TEST_ASSERT_NOT_NULL(numbers); + free(numbers); +} +// überprüft, ob die generierten Zufallszahlen innerhalb des Intervalls sind +void test_create_Numbers_randoms_inside_Value_range(void){ + unsigned int len = 10; + unsigned int* numbers = createNumbers(len); + + for(size_t i = 0; i < len; i++) + TEST_ASSERT_LESS_OR_EQUAL(2 * len + 1, numbers[i]); + + free(numbers); +} + +// überprüft, ob getDuplicate,die richtige doppelte Zahl findet +void test_get_duplicate_returns_correct_dobble(void){ + unsigned int numbers [5] = {1,2,3,4,2}; + unsigned int len = 5; + unsigned int expected_result = 2; + unsigned int result = getDuplicate(numbers, len); + TEST_ASSERT_EQUAL_UINT32(expected_result, result); +} + + +void setUp(void) { + +} + +void tearDown(void) { + +} + + +int main() +{ + UNITY_BEGIN(); + + printf("\n============================\nNumbers tests\n============================\n"); + RUN_TEST(test_get_duplicate_returns_correct_dobble); + RUN_TEST(test_create_Numbers_notNull); + RUN_TEST(test_create_Numbers_randoms_inside_Value_range); + return UNITY_END(); +} \ No newline at end of file