From 38e5ff6a0a6d89d1e022a2b3ffb7f54ef581bcec Mon Sep 17 00:00:00 2001 From: D2A62006 Date: Mon, 8 Dec 2025 20:00:38 +0100 Subject: [PATCH] first running version --- .gitignore | 1 + bintreeTest.c | 4 +-- highscores.txt | 1 + main.c | 3 +++ numbers.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b171294..52edb97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ doble_initial stackTests bintreeTests +doble *.o *.exe \ No newline at end of file diff --git a/bintreeTest.c b/bintreeTest.c index 21e5f09..f2cab76 100644 --- a/bintreeTest.c +++ b/bintreeTest.c @@ -54,7 +54,7 @@ void test_addToTree_multipleElements(void){ TEST_ASSERT_EQUAL_INT(60, *(int *)tree->right->right->right->right->data); } -void test_addToTree_multipleElementsOptimised(void){ +void test_addToTree_multipleElements_optimized(void){ TreeNode *tree = NULL; int values[] = {50, 30, 70, 20, 40, 60, 80}; @@ -303,7 +303,7 @@ int main(){ //addToTree() RUN_TEST(test_addToTree_singleElement); RUN_TEST(test_addToTree_multipleElements); - RUN_TEST(test_addToTree_multipleElementsOptimised); + RUN_TEST(test_addToTree_multipleElements_optimized); RUN_TEST(test_addToTree_withDuplicatesAccept); RUN_TEST(test_addToTree_withoutDuplicatesAccept); diff --git a/highscores.txt b/highscores.txt index dee6fad..061db57 100644 --- a/highscores.txt +++ b/highscores.txt @@ -1,2 +1,3 @@ +test;24999 test;9999 player1;3999 diff --git a/main.c b/main.c index 34163d0..4d6c6e1 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ #include #include +#include #include "numbers.h" #include "timer.h" #include "highscore.h" @@ -37,6 +38,8 @@ void showNumbers(const unsigned int *numbers, unsigned int len) // Main game loop: generate numbers, ask user for duplicate, measure time, update highscores. int main(int argc, char *argv[]) { + srand(time(NULL)); + int exitCode = EXIT_FAILURE; if(argc != 2) diff --git a/numbers.c b/numbers.c index 61fa7cc..468cc39 100644 --- a/numbers.c +++ b/numbers.c @@ -14,13 +14,86 @@ // 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 compareUInts(const void *arg1, const void *arg2){ + unsigned int val1 = *(unsigned int *)arg1; + unsigned int val2 = *(unsigned int *)arg2; + + if(val1 < val2) return -1; + if(val1 > val2) return 1; + return 0; +} + unsigned int* createNumbers(unsigned int len) { + if(len == 0){ + return NULL; + } + unsigned int* numbers = (unsigned int*)malloc(len * sizeof(unsigned int)); + if(numbers == NULL){ + return NULL; + } + + TreeNode *tree = NULL; + + unsigned int i = 0; + while(i < len){ + unsigned int tmp = (rand() % (2*len)) + 1; + + int isDuplicate = 0; + tree = addToTree(tree, &tmp, sizeof(unsigned int), compareUInts, &isDuplicate); + + if(!isDuplicate){ + numbers[i] = tmp; + i++; + } + } + + clearTree(tree); + + unsigned int rIdx = rand() % len; + unsigned int duplicate = numbers[rIdx]; + + unsigned int tIdx = rand() % len; + while(tIdx == rIdx){ + tIdx = rand() % len; + } + numbers[tIdx] = duplicate; + + 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 == NULL || len < 2){ + return 0; + } + unsigned int* sorted = (unsigned int*)malloc(len * sizeof(unsigned int)); + if(sorted == NULL){ + return 0; + } + + TreeNode *tree = NULL; + for(unsigned int i = 0; i < len; i++){ + tree = addToTree(tree, &numbers[i], sizeof(unsigned int), compareUInts, NULL); + } + + sorted[0] = *(unsigned int *)nextTreeData(tree); + + for(unsigned int j = 1; j < len; j++){ + sorted[j] = *(unsigned int*)nextTreeData(NULL); + } + unsigned int duplicate = 0; + for(unsigned int k = 0; k < len - 1; k++){ + if(sorted[k] == sorted[k+1]){ + duplicate = sorted[k]; + break; + } + } + free(sorted); + return duplicate; } \ No newline at end of file