From f5d91286ced6cba897e61476fd7a718978e7454d Mon Sep 17 00:00:00 2001 From: Tobias Grampp Date: Tue, 9 Dec 2025 13:19:12 +0100 Subject: [PATCH] a functioning, final product with cleared scoreboard --- highscores.txt | 3 +++ makefile | 4 ++-- numbers.c | 29 ++++++++++++++++++++++++++++- numbers.h | 4 ++++ numbersTests.c | 1 + runNumbersTests.exe | Bin 79889 -> 81734 bytes 6 files changed, 38 insertions(+), 3 deletions(-) diff --git a/highscores.txt b/highscores.txt index e69de29..bc34e5a 100644 --- a/highscores.txt +++ b/highscores.txt @@ -0,0 +1,3 @@ +Player1;2996 +Player2;2988 +Player3;2939 diff --git a/makefile b/makefile index e0e6a70..f4824e5 100644 --- a/makefile +++ b/makefile @@ -39,8 +39,8 @@ stackTests: stack.o test_stack.c $(unityfolder)/unity.c $(CC) $(CFLAGS) -I$(unityfolder) -o runStackTests test_stack.c stack.o $(unityfolder)/unity.c echo "needs to be implemented" -numbersTests: numbers.o numbersTests.c $(unityfolder)/unity.c - $(CC) $(CFLAGS) -I$(unityfolder) -o runNumbersTests numbersTests.c numbers.o $(unityfolder)/unity.c +numbersTests: numbers.o numbersTests.c bintree.c bintree.h stack.o $(unityfolder)/unity.c + $(CC) $(CFLAGS) -I$(unityfolder) -o runNumbersTests numbersTests.c numbers.o bintree.o stack.o $(unityfolder)/unity.c # -------------------------- # Clean diff --git a/numbers.c b/numbers.c index a7531cc..ce7a5ca 100644 --- a/numbers.c +++ b/numbers.c @@ -51,7 +51,7 @@ unsigned int *createNumbers(unsigned int len){ 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) { @@ -102,4 +102,31 @@ unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) return duplicate; +} +*/ +unsigned int getDuplicate(const unsigned int *numbers, unsigned int len) +{ + TreeNode *root = NULL; + int buffer = 0; + int counter = 0; + for(int i = 0; i < len; i++) + { + int isDuplicat = 0; + root = addToTree(root, numbers + i, sizeof(unsigned int), checkIfBigger, &isDuplicat); + if(isDuplicat) + { + buffer = *(numbers + i); + counter += 1; + } + } + clearTree(root); + if(counter == 1) + return buffer; + return 0; +} + +//Just a compare function needed for getDuplicate +int checkIfBigger(const void *char1, const void *char2) +{ + return *((int *)char1) - *((int *)char2); } \ No newline at end of file diff --git a/numbers.h b/numbers.h index 2315581..258668e 100644 --- a/numbers.h +++ b/numbers.h @@ -1,6 +1,8 @@ #ifndef NUMBERS_H #define NUMBERS_H +#include "bintree.h" + // 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. @@ -9,4 +11,6 @@ unsigned int *createNumbers(unsigned int len); // 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); +//Just a compare function needed for getDuplicate +int checkIfBigger(const void *char1, const void *char2); #endif \ No newline at end of file diff --git a/numbersTests.c b/numbersTests.c index d120960..e5dd7aa 100644 --- a/numbersTests.c +++ b/numbersTests.c @@ -42,6 +42,7 @@ void test_getDouplicateReturnsZeroWhenThereAreMultipleDuplicates(void){ void test_CreateNumbersCreatesDuplicatein2LenArray(void){ unsigned int *testArray = createNumbers(2); unsigned int testValue = getDuplicate(testArray, 2); + printf("\nTestvalue: %d\n", testValue); if(!testValue) testValue = 0; diff --git a/runNumbersTests.exe b/runNumbersTests.exe index 2df45ccbfceedb98378b8939d3912f46e4367eae..52fa7120ab6e577595a4ba1e73f46c7c20dbc383 100644 GIT binary patch delta 19809 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 Zrvk(#A9wlBWhO0JRJi{@4{^H3{{vkg+qM7z delta 18411 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 gaeuK-&9MGr_(4B|xWnz>eWUnOuY