diff --git a/makefile b/makefile index 18aaf7e..1a598d8 100644 --- a/makefile +++ b/makefile @@ -35,8 +35,8 @@ $(program_obj_filesobj_files): %.o: %.c # -------------------------- # Unit Tests # -------------------------- - - +test_numbers: + $(CC) -o test_numbers test__numbers.c numbers.c $(unityfolder)/unity.c $(FLAGS) # -------------------------- # Clean diff --git a/numbers.c b/numbers.c index 61ddf4d..8019cac 100644 --- a/numbers.c +++ b/numbers.c @@ -5,7 +5,9 @@ #include "numbers.h" #include "bintree.h" -unsigned int RANDOM_SEED = 0; +unsigned int seed = 0; + +unsigned int *numbers; // TODO: getDuplicate und createNumbers implementieren /* * * Erzeugen eines Arrays mit der vom Nutzer eingegebenen Anzahl an Zufallszahlen. @@ -17,13 +19,13 @@ unsigned int RANDOM_SEED = 0; // Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while // creating random numbers. -unsigned int setSeed(unsigned int seed) +unsigned int setSeed(unsigned int seed_test) { - RANDOM_SEED = seed; - return RANDOM_SEED; + seed = seed_test; + return seed; } -void createchecknumber(unsigned int len, unsigned int numbers[]) +void create_unique_random_numbers(unsigned int len, unsigned int numbers[]) { for (unsigned int i = 0; i < len; i++) { @@ -56,43 +58,48 @@ void createchecknumber(unsigned int len, unsigned int numbers[]) unsigned int *createNumbers(unsigned int len) { - if (RANDOM_SEED == 0) + + if (len <= 2) + { + return numbers; + } + + if (seed == 0) { srand(time(NULL)); } else { - srand(RANDOM_SEED); + srand(seed); } - unsigned int *numbers = malloc(sizeof(unsigned int) * len); - if (numbers == NULL) + numbers = malloc(sizeof(unsigned int) * len); + + if (numbers != NULL) { - return 0; + create_unique_random_numbers(len, numbers); + + unsigned int i = 0; + unsigned int j = 0; + + do + { + i = 0; + j = 0; + + i = rand() % len; + j = rand() % len; + + } while (i == j || i == j + 1 || i == j - 1); + + numbers[i] = numbers[j]; } - createchecknumber(len, numbers); - - unsigned int i = 0; - unsigned int j = 0; - - do - { - i = 0; - j = 0; - - i = rand() % len; - j = rand() % len; - - } while (i == j); - - numbers[i] = numbers[j]; - return numbers; - } -void sortnumbers(unsigned int numbers[], unsigned int len) +/* +void sortnumbers(unsigned int numbers[], unsigned int len) //-> qsort { for (unsigned int j = 0; j < len - 1; j++) { @@ -108,11 +115,26 @@ void sortnumbers(unsigned int numbers[], unsigned int len) } } } +*/ + +int compare(const void *arg1, const void *arg2) +{ + unsigned int a = *(const unsigned int *)arg1; + unsigned int b = *(const unsigned int *)arg2; + + return ((a > b) - (a < b)); +} // 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 (len <= 2) + { + return 0; + } + unsigned int *copynumbers = malloc(sizeof(unsigned int) * len); + if (copynumbers == NULL) { return 0; @@ -123,19 +145,21 @@ unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) copynumbers[i] = numbers[i]; } - sortnumbers(copynumbers, len); + qsort(copynumbers, len, sizeof(unsigned int), compare); + + // sortnumbers(copynumbers, len); for (unsigned i = 0; i < len - 1; i++) { - if (copynumbers[i] == copynumbers[i+1]) + if (copynumbers[i] == copynumbers[i + 1]) { unsigned int a = copynumbers[i]; - free (copynumbers); + free(copynumbers); return a; } } - free (copynumbers); + free(copynumbers); return 0; } diff --git a/numbers.h b/numbers.h index f5d44d8..f948164 100644 --- a/numbers.h +++ b/numbers.h @@ -1,12 +1,12 @@ #ifndef NUMBERS_H #define NUMBERS_H -extern unsigned int RANDOM_SEED; - // 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. +int compare(const void *arg1, const void *arg2); + unsigned int setSeed(unsigned int seed); unsigned int *createNumbers(unsigned int len); diff --git a/stack.c b/stack.c index e3a90d4..c517cb0 100644 --- a/stack.c +++ b/stack.c @@ -8,6 +8,12 @@ * `clearStack`: gibt den gesamten Speicher frei. */ // Pushes data as pointer onto the stack. +typedef struct stackNode +{ + void *data; + struct stackNode *next; +} StackNode; + StackNode *push(StackNode *stack, void *data) { diff --git a/test__numbers.c b/test__numbers.c index 0250ac9..8380d35 100644 --- a/test__numbers.c +++ b/test__numbers.c @@ -3,53 +3,26 @@ #include "unity/unity.h" #include "numbers.h" -static unsigned int count_number_occurrence(const unsigned int *arr, unsigned int len, unsigned int value) -{ - unsigned int count = 0; - for (unsigned int i = 0; i < len; i++) - { - if (arr[i] == value) - count++; - } - return count; -} - -void test_length_and_duplicate() +void test_createNumbers_create_one_double_number() { setSeed(1); - unsigned int len = 10; - unsigned int *test_numbers = createNumbers(len); + unsigned int len = 20; + unsigned int *numbers = createNumbers(len); - TEST_ASSERT_NOT_NULL(test_numbers); + qsort(numbers, len, sizeof(unsigned int), compare); - //Bereich checken: - for (unsigned int i = 0; i < len; i++) + unsigned int count = 0; + for (unsigned int i = 1; i < len; i++) { - TEST_ASSERT_TRUE(test_numbers[i] >= 1); - TEST_ASSERT_TRUE(test_numbers[i] <= len * 2); + if (numbers[i] == numbers[i - 1]) + { + count++; + } } - - //Prüfen, ob genau 1 Wert doppelt vorkommt: - unsigned int duplicate = getDuplicate(test_numbers, len); - TEST_ASSERT_NOT_EQUAL(0, duplicate); - - unsigned int occurrences = count_number_occurrence(test_numbers, len, duplicate); - TEST_ASSERT_EQUAL_UINT(2, occurrences); - - //Prüfen, ob alle anderen Werte nur einmal vorkommen: - for (unsigned int i = 1; i <= len * 2; i++) - { - if (i == duplicate) - continue; - - unsigned int c = count_number_occurrence(test_numbers, len, i); - TEST_ASSERT_TRUE(c <= 1); //Keine Zahl darf doppelt vorkommen. - } - - free(test_numbers); + TEST_ASSERT_EQUAL_UINT(1, count); } -void test_duplicate_value() +void test_getduplicate_returns_corecct_duplicate() { unsigned int test_numbers[6] = {1, 2, 3, 4, 5, 5}; unsigned int duplicate = 0; @@ -59,7 +32,7 @@ void test_duplicate_value() TEST_ASSERT_EQUAL(5, duplicate); } -void test_duplicate_value_if_false() +void test_getduplicate_know_if_no_duplicate() { unsigned int test_numbers[6] = {1, 2, 3, 4, 5, 6}; unsigned int duplicate = 0; @@ -70,15 +43,14 @@ void test_duplicate_value_if_false() } void setUp(void) {} - void tearDown(void) {} int main(void) { UNITY_BEGIN(); - RUN_TEST(test_length_and_duplicate); - RUN_TEST(test_duplicate_value); - RUN_TEST(test_duplicate_value_if_false); + RUN_TEST(test_createNumbers_create_one_double_number); + RUN_TEST(test_getduplicate_returns_corecct_duplicate); + RUN_TEST(test_getduplicate_know_if_no_duplicate); return UNITY_END(); } \ No newline at end of file