From d56c77d77a26987da3e241b9e9b302db0f8cd218 Mon Sep 17 00:00:00 2001 From: Kilian Muckelbauer Date: Tue, 9 Dec 2025 14:41:22 +0100 Subject: [PATCH] Fertig --- bintree.c | 113 ++++++++++++++++++++++++++++++++++++++----- bintree.o | Bin 0 -> 5751 bytes doble.exe | Bin 0 -> 81600 bytes doble_initial.exe | Bin 0 -> 66657 bytes highscore.o | Bin 0 -> 8675 bytes highscores.txt | 2 + main.o | Bin 0 -> 5901 bytes makefile | 70 +++++++++++++++++++++++---- numbers.c | 99 ++++++++++++++++++++++++++++++++++--- numbers.o | Bin 0 -> 5591 bytes stack.c | 29 ++++++++--- stack.h | 8 ++- stack.o | Bin 0 -> 3863 bytes test_numbers.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++ test_numbers.exe | Bin 0 -> 71133 bytes test_numbers.o | Bin 0 -> 6927 bytes test_stack.c | 102 ++++++++++++++++++++++++++++++++++++++ test_stack.exe | Bin 0 -> 58811 bytes test_stack.o | Bin 0 -> 6046 bytes timer.o | Bin 0 -> 3006 bytes 20 files changed, 508 insertions(+), 36 deletions(-) create mode 100644 bintree.o create mode 100644 doble.exe create mode 100644 doble_initial.exe create mode 100644 highscore.o create mode 100644 main.o create mode 100644 numbers.o create mode 100644 stack.o create mode 100644 test_numbers.c create mode 100644 test_numbers.exe create mode 100644 test_numbers.o create mode 100644 test_stack.c create mode 100644 test_stack.exe create mode 100644 test_stack.o create mode 100644 timer.o diff --git a/bintree.c b/bintree.c index 5cf82a9..75c5aac 100644 --- a/bintree.c +++ b/bintree.c @@ -2,35 +2,126 @@ #include "stack.h" #include "bintree.h" -//TODO: binären Suchbaum implementieren -/* * `addToTree`: fügt ein neues Element in den Baum ein (rekursiv), - * `clearTree`: gibt den gesamten Baum frei (rekursiv), - * `treeSize`: zählt die Knoten im Baum (rekursiv), - * `nextTreeData`: Traversierung mit Hilfe des zuvor implementierten Stacks. */ - // Adds a copy of data's pointer destination to the tree using compareFct for ordering. Accepts duplicates // if isDuplicate is NULL, otherwise ignores duplicates and sets isDuplicate to 1 (or to 0 if a new entry is added). -TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate) +TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, + CompareFctType compareFct, int *isDuplicate) { + if (data == NULL || compareFct == NULL) + return root; + if (root == NULL) + { + // neuer Knoten + TreeNode *node = malloc(sizeof(TreeNode)); + if (node == NULL) + return NULL; + + node->data = malloc(dataSize); + if (node->data == NULL) + { + free(node); + return NULL; + } + memcpy(node->data, data, dataSize); + node->left = NULL; + node->right = NULL; + + if (isDuplicate != NULL) + *isDuplicate = 0; + + return node; + } + + int cmp = compareFct(data, root->data); + if (cmp < 0) + { + root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); + } + else if (cmp > 0) + { + root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); + } + else + { + // Element bereits vorhanden + if (isDuplicate != NULL) + { + *isDuplicate = 1; + // Duplikate werden ignoriert + } + else + { + // Duplikate dürfen eingefügt werden -> wir hängen sie z.B. links an + root->left = addToTree(root->left, data, dataSize, compareFct, NULL); + } + } + + return root; } -// Iterates over the tree given by root. Follows the usage of strtok. If tree is NULL, the next entry of the last tree given is returned in ordering direction. -// Use your implementation of a stack to organize the iterator. Push the root node and all left nodes first. On returning the next element, -// push the top node and push all its left nodes. +// Interner Stack für die Traversierung (strtok-ähnliches Verhalten) +static StackNode *iterStack = NULL; + +// Hilfsfunktion: legt ab start alle linken Knoten auf den Stack +static void pushLeftPath(TreeNode *start) +{ + while (start != NULL) + { + iterStack = push(iterStack, start); + start = start->left; + } +} + +// Iterates over the tree given by root. Follows the usage of strtok. If tree is NULL, +// the next entry of the last tree given is returned in ordering direction. +// Use your implementation of a stack to organize the iterator. Push the root node and all left nodes first. +// On returning the next element, push the top node and push all its left nodes. void *nextTreeData(TreeNode *root) { + if (root != NULL) + { + // neue Traversierung starten: alten Stack aufräumen + if (iterStack != NULL) + { + clearStack(iterStack); + iterStack = NULL; + } + pushLeftPath(root); + } + if (iterStack == NULL) + return NULL; + + // Nächsten Knoten holen + TreeNode *node = (TreeNode *)top(iterStack); + iterStack = pop(iterStack); + + // rechten Teilbaum dieses Knotens auf den Stack bringen + if (node->right != NULL) + pushLeftPath(node->right); + + return node->data; } // Releases all memory resources (including data copies). void clearTree(TreeNode *root) { + if (root == NULL) + return; + clearTree(root->left); + clearTree(root->right); + + free(root->data); + free(root); } // Returns the number of entries in the tree given by root. unsigned int treeSize(const TreeNode *root) { + if (root == NULL) + return 0; -} \ No newline at end of file + return 1u + treeSize(root->left) + treeSize(root->right); +} diff --git a/bintree.o b/bintree.o new file mode 100644 index 0000000000000000000000000000000000000000..e0d6dccb0a93182de1eda2ea035ec2d69c0ddd95 GIT binary patch literal 5751 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 D4XwT1 literal 0 HcmV?d00001 diff --git a/doble.exe b/doble.exe new file mode 100644 index 0000000000000000000000000000000000000000..17251ed554d7be2234e656521208a616b63b9cac GIT binary patch literal 81600 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 Y($UFlp0q2<-^$fSpM@N=jSWX=i9!&*0ddGMGP@ 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 M)~Z|I`K#vt1@ceK$N&HU literal 0 HcmV?d00001 diff --git a/highscores.txt b/highscores.txt index 4edd5a7..2e6dc4f 100644 --- a/highscores.txt +++ b/highscores.txt @@ -1 +1,3 @@ +Kilian;9927 +Kilian;4975 player1;3999 diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..9b43f28b88d3996d258e8f4cc6d2746b76617a3b GIT binary patch literal 5901 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 EzxF!~2><{9 literal 0 HcmV?d00001 diff --git a/makefile b/makefile index 1f15f75..1572893 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,4 @@ -CC = gcc +CC = gcc FLAGS = -g -Wall -lm ifeq ($(OS),Windows_NT) @@ -13,10 +13,18 @@ else endif raylibfolder = ./raylib -unityfolder = ./unity +unityfolder = ./unity # -------------------------- -# Initiales Programm bauen (zum ausprobieren) +# Phony Targets +# -------------------------- +.PHONY: all doble doble_initial unitTests test_stack test_numbers clean vorbereitungen prepare + +# Standard-Target +all: doble + +# -------------------------- +# Initiales Programm bauen (zum Ausprobieren) # -------------------------- doble_initial: $(CC) -o doble_initial $(BINARIES)/libdoble_complete.a @@ -26,24 +34,66 @@ doble_initial: # -------------------------- program_obj_files = stack.o bintree.o numbers.o timer.o highscore.o -doble : main.o $(program_obj_files) +doble: main.o $(program_obj_files) $(CC) $(FLAGS) $^ -o doble -$(program_obj_filesobj_files): %.o: %.c - $(CC) -c $(FLAGS) $^ -o $@ +# Generische Regel zum Bauen von .o aus .c +%.o: %.c + $(CC) $(FLAGS) -c $< -o $@ + +# Abhängigkeiten (optional, aber hilfreich für inkrementelles Bauen) +main.o: main.c numbers.h stack.h bintree.h timer.h highscore.h +numbers.o: numbers.c numbers.h bintree.h +bintree.o: bintree.c bintree.h stack.h +stack.o: stack.c stack.h +timer.o: timer.c timer.h +highscore.o: highscore.c highscore.h + +test_stack.o: test_stack.c stack.h +test_numbers.o: test_numbers.c numbers.h bintree.h stack.h # -------------------------- # Unit Tests # -------------------------- -unitTests: - echo "needs to be implemented" +test_stack: test_stack.o stack.o + $(CC) $(FLAGS) $^ -o test_stack + +test_numbers: test_numbers.o numbers.o stack.o bintree.o + $(CC) $(FLAGS) $^ -o test_numbers + +unitTests: test_stack test_numbers + ./test_stack + ./test_numbers + +# -------------------------- +# Vorbereitungen zum Bauen des Programms +# -------------------------- +vorbereitungen: + @echo "== Vorbereitungen zum Bauen des Programms ==" + @echo "Prüfe benötigte Dateien..." + @test -f numbers.c || (echo "FEHLT: numbers.c" && exit 1) + @test -f numbers.h || (echo "FEHLT: numbers.h" && exit 1) + @test -f bintree.c || (echo "FEHLT: bintree.c" && exit 1) + @test -f bintree.h || (echo "FEHLT: bintree.h" && exit 1) + @test -f stack.c || (echo "FEHLT: stack.c" && exit 1) + @test -f stack.h || (echo "FEHLT: stack.h" && exit 1) + @test -f timer.c || (echo "FEHLT: timer.c" && exit 1) + @test -f timer.h || (echo "FEHLT: timer.h" && exit 1) + @test -f highscore.c || (echo "FEHLT: highscore.c" && exit 1) + @test -f highscore.h || (echo "FEHLT: highscore.h" && exit 1) + @test -f main.c || (echo "FEHLT: main.c" && exit 1) + @echo "Alle Dateien vorhanden." + @echo "Vorbereitung abgeschlossen!" + +# englischer Alias +prepare: vorbereitungen # -------------------------- # Clean # -------------------------- clean: ifeq ($(OS),Windows_NT) - del /f *.o doble + del /f *.o doble doble_initial test_stack test_numbers else - rm -f *.o doble + rm -f *.o doble doble_initial test_stack test_numbers endif \ No newline at end of file diff --git a/numbers.c b/numbers.c index f59d9a2..f199fbe 100644 --- a/numbers.c +++ b/numbers.c @@ -5,22 +5,109 @@ #include "numbers.h" #include "bintree.h" -//TODO: getDuplicate und createNumbers implementieren -/* * * Erzeugen eines Arrays mit der vom Nutzer eingegebenen Anzahl an Zufallszahlen. - * Sicherstellen, dass beim Befüllen keine Duplikate entstehen. - * Duplizieren eines zufälligen Eintrags im Array. - * in `getDuplicate()`: Sortieren des Arrays und Erkennen der doppelten Zahl durch Vergleich benachbarter Elemente. */ +// Hilfsfunktion für qsort und den Binärbaum: Vergleich von unsigned int +static int compareUnsignedInt(const void *a, const void *b) +{ + const unsigned int *ua = (const unsigned int *)a; + const unsigned int *ub = (const unsigned int *)b; + + if (*ua < *ub) + return -1; + else if (*ua > *ub) + return 1; + else + return 0; +} // 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. unsigned int *createNumbers(unsigned int len) { + if (len < 2) + return NULL; + unsigned int *numbers = malloc(len * sizeof(unsigned int)); + if (numbers == NULL) + return NULL; + + // Zufall initialisieren + srand((unsigned int)time(NULL)); + + TreeNode *root = NULL; + unsigned int i = 0; + + // len-1 verschiedene Zufallszahlen im Bereich [1, 2*len] erzeugen + while (i < len - 1) + { + unsigned int candidate = (unsigned int)(rand() % (2 * len)) + 1; + int isDuplicate = 0; + + TreeNode *newRoot = addToTree(root, &candidate, sizeof(unsigned int), + compareUnsignedInt, &isDuplicate); + if (newRoot == NULL && root == NULL) + { + // Speicherfehler beim ersten Einfügen + clearTree(root); + free(numbers); + return NULL; + } + root = newRoot; + + if (!isDuplicate) + { + numbers[i] = candidate; + ++i; + } + // bei Duplikat wird einfach eine neue Zufallszahl generiert + } + + // Einen zufälligen Eintrag aus den ersten len-1 duplizieren + unsigned int duplicateIndex = (unsigned int)(rand() % (len - 1)); + numbers[len - 1] = numbers[duplicateIndex]; + + // Baum wird nicht mehr benötigt + clearTree(root); + + // Das Array durchmischen (Fisher-Yates-Shuffle), damit das Duplikat an zufälliger Position steht + for (unsigned int j = len - 1; j > 0; --j) + { + unsigned int k = (unsigned int)(rand() % (j + 1)); + unsigned int tmp = numbers[j]; + numbers[j] = numbers[k]; + numbers[k] = tmp; + } + + 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; -} \ No newline at end of file + // Kopie des Arrays anlegen, da qsort in-place sortiert + unsigned int *copy = malloc(len * sizeof(unsigned int)); + if (copy == NULL) + return 0; + + memcpy(copy, numbers, len * sizeof(unsigned int)); + + // Sortieren mit qsort + qsort(copy, len, sizeof(unsigned int), compareUnsignedInt); + + // Benachbarte Elemente vergleichen, um das Duplikat zu finden + unsigned int duplicate = 0; + for (unsigned int i = 1; i < len; ++i) + { + if (copy[i] == copy[i - 1]) + { + duplicate = copy[i]; + break; + } + } + + free(copy); + return duplicate; // 0 falls kein Duplikat gefunden (Fehlerfall) +} diff --git a/numbers.o b/numbers.o new file mode 100644 index 0000000000000000000000000000000000000000..c979e22c0e52dea5da74589a0ccdf139c33df4cb GIT binary patch literal 5591 zcmbtYeQXrR6`$F?vDe(4eLg$bm*Dsa20|0gHU%0RlNijwnE;{*r-qgk&UbtEh4YHC3vl6+{I3;kHykYCigV zGrN0t7}P&H($4(mz2Cg|X6EhA?k1l0GAfr_8CxNdi-ij2p@PJ!+NU$NNMr2xEvny) zCdhW~3ngNOSPkz+aG32p6B^6sZ=|c0JxRPn^#*%DctX^&7#n7N!=b79yp!N1e2UwI zhIqZJ>&ISnG4>jGFIhZ~XtcdIPixHAV97sh@BV`eoLh*;MSuaPL5U ze8-{O4Bii{_!`h3X2Tn!k@Cez=`X%Wc{{FXXQUEF8@`6N6YU(@YZV{rxe6P2CEs}J zQ0xivOgk%|`vqw>eE84uZ_DRO zXLvb${%rUh$+pdiHpCs7iJqs(BQx92MatWHg4@e4Z#adFVKuSLB9>WJT!H2qE8Zdb zb_^9nYGE~U?O89(PD}}Fe1X{Yp2f|ld zj&49WDtxGYGm%frvoiV*|51)!sDv-no0zRceWlC1{AOgv^EG8T3d?U)SXrwLP&vT1 zUCBGf=Vl_j#`t^K%Il4@a`>G}_`U1JQ4r_3o5w@^?_he9bG&qTjupQmCtZ4N%1MDf z$}LJQM-5wzuEnFMnsxLgw>FS|+p3=N{)VC}SJtl{5&Yctuq5dMhNR52HIZ<&mx)7dz4 zz0O-{9Iu(xla%jNH1dzapWTB5ZO9ZS$IM)wMMKopPOyfw znPJh*G(Pu}gsobX}9IK{ZQPNG9Ez5hQT?|XHWQS5tAkb%nBz_4RJJ+ zFb}bfmSWe!7p?f{aHBE+M_L>kkwU_m?5>66PCxO&5iOOkuHM~VN?ZNJsUup(Joo_l z4Yeu1!>sAo)@mLjgDBb~Y}A_jzNWV=Wmf5!wx8WEooFX^YK6%uw$18o1EC|X?wqLg z7#PL9%$q#q+%EQ7@n;)itm!VwR@$&J)-K9qn0v87G_jCqZpFfei0el+dZk2HjCQ8NrSayegm78B7Nd&)v9GZp-5ZJymLt2U|w%MeM3z2HOJ6IsZ?y zmm10>Tman~4mcc+E%ec>AyT_?qzL!xV|Fis0!Q3ReBf@v=PoM<^9{3YQ& zDEhxhf`*60dfA4=9n=;?n3}hcLuiJCcfII3AUxX2cG0Eu-h-z_`)Sd9Qh1LE&yZ-} zCOVCv@a`7v`s7y8oD{3{z;WWj_ONV2!cT2dbe|Tj;ChaV?h9gJNQi#X@uCpN#fm;_ zz#40Sbe|MUPK$*Y(6w9msKM19624y14s;i&`h#K_jo2zY8Nu&=L>L!EfCL3vgj=5% zONYd*_9BRrqI*b)qej2*8*ht_q7Vhq+9$e=A+hMF@ECs4wM}%uG$ykgRvgcJJX>!cCpJ(2giE4r@A}iw=4l@*dyE}{&&9Z0>^amyiN1yU4vAhu zy+k56A|$4effVlzNBajyHiNrzvE-crS}xJMKzB;?c^r?*3c7eA z;NFEr8&SVm$~=zD=O9{7rNsl@8oS6rK}Sngi0fuy)VE4B>Y(jF#Ng~<)MUxcE+9T7 zyBF~(^tglGchDe0RoX8&=$j5|fGxkYXUELt%Bl!x)(Z7Gh`zX$Y|ugXIcSrEs?qOo zWDfzUSZEDy$K_^0M@D0nEaJ%0j%>=2g_0?}4Xg6Wr;LsB>djz@WkX}BaQM)%*VTgQ zTZOWVa+Nst8<|qk%BV7fhVpbiN9k+-GLajd)0slMUM;nMm|*I7Np1aDDl<)x~QAIP^bhe))+dqMg+_WeUx( zzPxI6DGHs_f28YvOF{k{i-VU5aOmIA{PM0PqDXa4nLEE+wnSdEIzNuOx|gJ~U*!o? z(U|oDuey{8OnnJh0x6N72DU&-sPo}G3CG-2Av^N(#TLj>);CWLM|~&RBpOA}vQWYt zD~|7_v%|)*v9X+a!092PaWijs)2WPU<9s1!LlW!-l_lq literal 0 HcmV?d00001 diff --git a/stack.c b/stack.c index e3a90d4..9526218 100644 --- a/stack.c +++ b/stack.c @@ -1,33 +1,46 @@ #include #include "stack.h" -//TODO: grundlegende Stackfunktionen implementieren: -/* * `push`: legt ein Element oben auf den Stack, - * `pop`: entfernt das oberste Element, - * `top`: liefert das oberste Element zurück, - * `clearStack`: gibt den gesamten Speicher frei. */ - // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data) { + StackNode *node = (StackNode *)malloc(sizeof(StackNode)); + if (node == NULL) + return stack; // keine Änderung bei Speicherfehler + node->data = data; + node->next = stack; + return node; } // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // freed by caller.) StackNode *pop(StackNode *stack) { + if (stack == NULL) + return NULL; + StackNode *next = stack->next; + free(stack); + return next; } // Returns the data of the top element. void *top(StackNode *stack) { + if (stack == NULL) + return NULL; + return stack->data; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { - -} \ No newline at end of file + while (stack != NULL) + { + StackNode *next = stack->next; + free(stack); + stack = next; + } +} diff --git a/stack.h b/stack.h index f7d542d..5230c6b 100644 --- a/stack.h +++ b/stack.h @@ -7,7 +7,12 @@ The latest element is taken from the stack. */ #include -//TODO: passenden Datentyp als struct anlegen +// einfacher verketteter Stack +typedef struct StackNode +{ + void *data; + struct StackNode *next; +} StackNode; // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data); @@ -23,3 +28,4 @@ void *top(StackNode *stack); void clearStack(StackNode *stack); #endif + diff --git a/stack.o b/stack.o new file mode 100644 index 0000000000000000000000000000000000000000..9951e86f3f04c84f1b884de5e37f9802594e6e57 GIT binary patch literal 3863 zcmcgvU1%It6h3!mZg$eyB$K2xiA~K^(qEd*CZ;t_8@p{6f-NX0ROp)^^+gb?0r9t@eGq*Sp9HBQ)(1r?1;KjGy)!p6P2-~n=HBm| z^PO|<+@JZ$oNEG-mn?wI0vQmiy7N_mW%E0B-5S8vMyc!AIWX~TER(9Hq-oVQ0TUm^ zrYe?m%CZiUlMA@kDGc%!{Lc7Rr$a|P7EemOV5r7}Pe3)MHhITHK5WSAq3FO`OcnBqL=OZB= zjpsHw10w3~8V*@%lXfAioUB0`jr|E~P^dqT7wtRh-^8oa>u+N3;B{65;FuL5L=GRF zbjAh-oPnLO!C2hso2}N0?r7F6y5)Qt)l@m18%>wW?x53`b^0pR%xHRG05&{E(E*|4 zzA)C1&ZWv&B2p+7vyNzL#Y#R~bTdxASVa$C_6UO(spLxKsuQLeTsRHMmN*ioFjMJX zQ6p2TO%+^VhA~|zrLdZ9h-#i)+_ia|5jf$*Amr zUH%ZM8s*>IE#M_+e%Et4UayNGZC@+>Ib6AZ3~H&C=74R8P(4~^k{;P%+Q0m?8`gPg z!JealwkYZTUfHVxhHyuSakQ=X0%X|^+b`QXSF7ZJago4_Q;FDR5zPIYXcKeF_%<4z zcFEL>rHl&^l?+%fSk|MKjw_*Y(3?j#vOU&rYrI{*b+(aF&4{d7%J=#&kui&L2ZZY0M z1n*Gu0X3iC#W;gTSrfGm-uovvzvFf-_co6%arXEOHkPHIjd_XRu;$OC~c66I4ENy$0sXpxpKT7j}Ohy&eV_Ri_@jSiE?VD znxCo7_8lzY;XXE(cMGd~WUg2m#zy)@wthcb|Ek$m_fVE>I^8Fqk;qFIYW{e!h8VZ% zbEszu`KeeA4v&qEI9u@vyUlyN(o6ek4+t| zKB8?(FKu1Co9LmZ3tb|b3hAY{m9%v$n7cr5ZFc3l3rXpg`ja9YI8~ z3{GJC0A3dEKm48)D6Y^vBFTGM+1^mLuNC@PdFdp|hz>+D-+pC#TG<+~65Xk#?wr9x zsLPSkH?Kr-h3M-@+C~)Grx4wntV=a1lLd~l9aOfYvK5qVPTAi|< z?gC_)zso%%cH))bsSN9CI3LSGD~}v}?U2wGUCE*O0HAjn$$7k1a%fGZ(Aa5fuH;C6 z@Lz$3qO+USN~hNb{}XUokP~tXCHRj((f8#9{txI*bw;}|EWv*R`h?dRt!p$)LhZC? zq1n(G{TbLRI18QyUogm_zk-!=$urT6$y#)WVY%X|jo9mq{st&xSgv|1?JS+G91FSM z^EmXGuCp7S7Vf_ARJvoGwS}FY_N~{`pP$aIVY|HE +#include +#include +#include "numbers.h" + +/* + * Unit-Tests für createNumbers und getDuplicate: + * - createNumbers liefert ein gültiges Array + * - alle Zahlen liegen im Bereich [1, 2*len] + * - genau eine Zahl kommt doppelt vor + * - getDuplicate findet genau diese doppelte Zahl + * - Fehlerfälle (NULL-Pointer, zu kleine Länge) + */ + +static void check_numbers_array(unsigned int *numbers, unsigned int len) +{ + unsigned int maxValue = 2 * len; + unsigned int *counts; + unsigned int i; + unsigned int duplicatesCount = 0; + + assert(numbers != NULL); + + counts = (unsigned int *)calloc(maxValue + 1, sizeof(unsigned int)); + assert(counts != NULL); + + // Werte zählen und Bereich prüfen + for (i = 0; i < len; ++i) + { + unsigned int v = numbers[i]; + assert(v >= 1 && v <= maxValue); + counts[v]++; + } + + // Prüfen: genau eine Zahl kommt zweimal vor, alle anderen höchstens einmal + for (i = 1; i <= maxValue; ++i) + { + if (counts[i] == 2) + duplicatesCount++; + else + assert(counts[i] == 0 || counts[i] == 1); + } + + assert(duplicatesCount == 1); + + free(counts); +} + +static void test_createNumbers_and_getDuplicate(unsigned int len) +{ + printf("test_createNumbers_and_getDuplicate(len=%u)...\n", len); + + unsigned int *numbers = createNumbers(len); + assert(numbers != NULL); + + // Arraystruktur überprüfen + check_numbers_array(numbers, len); + + // Nochmal zählen, um das Duplikat zu kennen + unsigned int maxValue = 2 * len; + unsigned int *counts = (unsigned int *)calloc(maxValue + 1, sizeof(unsigned int)); + assert(counts != NULL); + + for (unsigned int i = 0; i < len; ++i) + { + unsigned int v = numbers[i]; + counts[v]++; + } + + unsigned int expectedDuplicate = 0; + for (unsigned int v = 1; v <= maxValue; ++v) + { + if (counts[v] == 2) + { + expectedDuplicate = v; + break; + } + } + assert(expectedDuplicate != 0); + + // getDuplicate testen + unsigned int found = getDuplicate(numbers, len); + assert(found == expectedDuplicate); + + free(counts); + free(numbers); + + printf("...OK\n"); +} + +static void test_getDuplicate_error_cases(void) +{ + printf("test_getDuplicate_error_cases...\n"); + + // NULL-Array + unsigned int dup = getDuplicate(NULL, 10); + assert(dup == 0); + + // Länge < 2 + unsigned int dummy[1] = {42}; + dup = getDuplicate(dummy, 1); + assert(dup == 0); + + printf("...OK\n"); +} + +int main(void) +{ + printf("Running numbers unit tests...\n\n"); + + // Typische Testfälle mit verschiedenen Längen + test_createNumbers_and_getDuplicate(5); + test_createNumbers_and_getDuplicate(10); + test_createNumbers_and_getDuplicate(20); + + // Fehlerfälle + test_getDuplicate_error_cases(); + + printf("\nAll numbers tests passed.\n"); + return 0; +} \ No newline at end of file diff --git a/test_numbers.exe b/test_numbers.exe new file mode 100644 index 0000000000000000000000000000000000000000..eddc46e70687d359394bc10f81e73a22ff056f5b GIT binary patch literal 71133 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 literal 0 HcmV?d00001 diff --git a/test_numbers.o b/test_numbers.o new file mode 100644 index 0000000000000000000000000000000000000000..6d60ab7aebbb0888d9fadd2580c2df7b3212afc5 GIT binary patch literal 6927 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 Y0Qi4JpG;=QCzH-uh9_ijpH9Gk0m>M*^#A|> literal 0 HcmV?d00001 diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..a1a7f27 --- /dev/null +++ b/test_stack.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include "stack.h" + +/* + * Einfache Unit-Tests für den Stack: + * - push/pop: LIFO-Verhalten + * - top: richtiges Element + * - Verhalten bei leerem Stack + */ + +static void test_push_pop_lifo(void) +{ + printf("test_push_pop_lifo...\n"); + + StackNode *stack = NULL; + + int a = 1; + int b = 2; + int c = 3; + + stack = push(stack, &a); + stack = push(stack, &b); + stack = push(stack, &c); + + // LIFO: zuerst c + assert(top(stack) == &c); + stack = pop(stack); + + // dann b + assert(top(stack) == &b); + stack = pop(stack); + + // dann a + assert(top(stack) == &a); + stack = pop(stack); + + // jetzt leer + assert(stack == NULL); + assert(top(stack) == NULL); + + printf("...OK\n"); +} + +static void test_empty_stack_operations(void) +{ + printf("test_empty_stack_operations...\n"); + + StackNode *stack = NULL; + + // pop auf leerem Stack sollte einfach NULL liefern + stack = pop(stack); + assert(stack == NULL); + + // top auf leerem Stack sollte NULL liefern + assert(top(stack) == NULL); + + // clearStack auf leerem Stack darf nicht crashen + clearStack(stack); + + printf("...OK\n"); +} + +static void test_clearStack(void) +{ + printf("test_clearStack...\n"); + + StackNode *stack = NULL; + int values[10]; + int i; + + // Wir legen 10 Elemente auf den Stack + for (i = 0; i < 10; ++i) + { + values[i] = i; + stack = push(stack, &values[i]); + } + + // Stack leeren – clearStack muss alle StackNodes freigeben + clearStack(stack); + stack = NULL; // Pointer selbst auf NULL setzen + + // Auf leerem Stack dürfen die Operationen nicht crashen + assert(top(stack) == NULL); + stack = pop(stack); + assert(stack == NULL); + + printf("...OK\n"); +} + +int main(void) +{ + printf("Running stack unit tests...\n\n"); + + test_push_pop_lifo(); + test_empty_stack_operations(); + test_clearStack(); + + printf("\nAll stack tests passed.\n"); + return 0; +} \ No newline at end of file diff --git a/test_stack.exe b/test_stack.exe new file mode 100644 index 0000000000000000000000000000000000000000..94a4f04aef31103d6378219bab400eb44d4399fc GIT binary patch literal 58811 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 literal 0 HcmV?d00001 diff --git a/test_stack.o b/test_stack.o new file mode 100644 index 0000000000000000000000000000000000000000..e089924aa575f4cfea2715d32ff9eac49dd79211 GIT binary patch literal 6046 zcmcgwU2Ggz6+U-n@9x;+b=KZAt<{E1ikly(*FQLIVsNvG<7C~25G66xC}F)`uk9u4 z-PP`FVj|L1n50T0i-aGk&bFIfdUY-Gjq1UGJ94B*rEZvE2%JuVheVT z$0k#D%EM~}bTm_KDCR@;*WlRTI^IVFG-! zUCMAMC9i*7m4s+3`ui91PCGmdLGso;=;Kk7@vu)Mc@M1j3E#ll!;N_B{T;TD*Xhiy z>ww0&dxJl|GpO8xyc=+i; zHBnr{;f2J)=wjl;@C`*ij(B18dIQm z{9NLM2q8##ypH zS)*Qz-mVw4lpBxMr)tgWJ3OvBY{^};z)wpnQN8-5cW>Uj8h;P7OPJx9{L-VP9SS(T z*1lIxR+F76+sR_3Jd-RIipgAdst}9CKuF7WD!o6J2D?yPBk)>laL`&+Czz;Zq(IP# zy<>Fy_8PSiVI!Y-gaQ&RWoC=^=aRxGStw>oDLY%pmsKF?Tqaf8Euz8Lc2)BEY<}93 zZB+7E+af1KZ-(YgxtyaBLaUf6mot+wYDy$#=-em;bhZ;f;9VYk+JpNfCZiwI5#^Lg zJg4YxpmHZ3R(Bz$@@x3e9!_J)(KAA5+O}iV8tUz}de_DJVm(&ZtX;`x2B$OmOevej zYO0i;8B7;SnLev)+UhFXlY{BrURb`BtUZaGyNR)2dL~tZ<`hbp5y};CEJRkxm$TFP z%%qjg+o<7HjSy&|@=T#*TYg%A3uQpEB@X#0root@B%*C*1SSiWiChL)ATX6Hq_Dk6 zK(yz`X^0@AnGw1NL*l9po3D{Dl&2Sn);mdI01sgyt|4uSPPnx?*`VDM97B;#8SsA0 zgSbdxSqlluO0y(Mb6m1P?}&Ycq}A*^waBxW1#uNaM~FgrURefd;X}Ld_j6aOi!dXz zscatDUj9S0pb4f#M>Qq(j3L&oC)Q20ASnG+7RY%NB>}NYVK_n|Yo}%c2U598rVLw~ zNUNWE;Yc70+nT5m?bM{EI}K6iv;j{A+K4iPHtl%?O&|kkym27ruGsIZU@laH>2rh8 zT2M$yG&ks}KveY4cP;=6tM>)hKYPaMV4LeRkb7?7{MaY54th1l6}uFnf{QyaU_ zh?@F}yH}7nawkCZD$%rw4WVsIlp6EmI9up zyNlUO?$#Rrtvoc)EnIfHF1v5(^41y*tb010?vfW2^3u5qhATF|IJxNhr#A$*BFh<& zCvI#8whavpSZna2TkG6%H2Rzt5lP;?3iTn9 z7I8$n+#yKUssARuKB-?#kY5$>65RU^H z-%>=fT?>(nYPCWSD&8<6I=cd}U1|3qk`a7X$x2H014MF;UPUBr-#{c=yMjoz_7{cz zjYvji;)N@tUyexfIu+_iBzc2MHjGHdGKOfih;&?OXO#9aB|D~MNQP#7bnKmr3`Ffh zMlVoOOL0gjE(Y*%Lz%bZq-Oh>Swv#_2+;~~@2SkO6G&!M>o5U;ja z(iun`&DWNo`2O>eT4(gGK!5kD$@`BFo2!Xg^1T1|&_QF4=ieUnRA*PEu_yQb*P~xH zI-_~@C+|N!8V$*zo#ao?IaT_HrZf7ZM?1@(e&SSV#B@d={^C)q{`5zuYGSD~V%Dd(91-!jbm)+)nkuDcotGT{7mnDLxA>+K WI?o5+|0~R7GCNyLx}Uh70R97W_U_pL literal 0 HcmV?d00001 diff --git a/timer.o b/timer.o new file mode 100644 index 0000000000000000000000000000000000000000..e9e8e8e7920f35fd034e7278c88cc356eda0ca45 GIT binary patch literal 3006 zcmbtWU1%It6h3!mC%bVs*-baq##S=5F|pE2cGIM`(U`TH*hH}e+dze+aWgynL-r@m z%*ql(7Nf02#9I0y^uag9H${99!NeB-9u<5LeH26mCHN3fjOW}tGnr|KK6qg6{mwbx zoOA#0&0p#Sl9dR+y&Q!=vyG&bNYpk}jV)JEvyTX*E5n4QnZNuxdAI#(2@F8D?2WHD~IjalLLD z!|GsB9klHHxSmeKJ&%cKUfJ>xHj1_BrJRW=!j*chsPdvwv&zMqkypz#8$HU7ha04@ zRjQk|8l;63?hFaGz~LZ8QpAts4C$4+zPxCIG?91@8zfnF&a|^+wBShMJ2bW9LKmWN zGDz2wWN)+V`pWro)xc&Si(J4Va)+|u@YxNrN>w9gHB2La&d}?%yaif}o8Ks5r$YI9 zW2s_5nCEq(^?OUrjmT~Q>w{?Yk*JK5AdP?=89U4#ik^zjBqclr0MI>gm#pw7lrn%5+m(#r90BCgbT|4CzPI#mDpDbds=G4q}j3g zImJ#&3%SsAJ6r>3)nNK60|=d&Q7PW;A2F zZJM)U8TP#*C^2i?Irbi4)IOzuyqK%pB~ zW*Z#eUVQBs_!?*XZg+G22gge9RGF2q434$9wHy-Q+JK)?(elPpqqs