33 Commits
Author SHA1 Message Date
hofmannjo99187 7a7a939fc4 presented code 2025-12-16 11:09:26 +01:00
hofmannjo99187 44d96647bb testing 2025-12-15 20:55:55 +01:00
hofmannjo99187 8605da95b6 adapted bintreeTest to nex nextTreeData Function 2025-12-15 20:51:07 +01:00
hofmannjo99187 a3e12875aa Aufgabenstellungs-pdf durch neues Aufgabenstellungs-pdf ersetzt 2025-12-15 20:45:00 +01:00
hofmannjo99187 b7fa24f2e9 sucessfull testing 2025-12-13 16:48:04 +01:00
hofmannjo99187 b69cfb0640 changed numbers.c so that it works with new nextTreeData() function 2025-12-13 16:35:36 +01:00
hofmannjo99187 686fe8d844 fixed bug in nextTreeData() 2025-12-13 16:21:24 +01:00
hofmannjo99187 c37ce6327c tested entire program 2025-12-13 15:26:51 +01:00
hofmannjo99187 111b9c5532 removed wrong isduplicate assignment 2025-12-13 15:23:28 +01:00
hofmannjo99187 8e76b27760 made tests 2025-12-13 15:17:38 +01:00
hofmannjo99187 a575259cac removed not needed comments 2025-12-13 15:09:35 +01:00
Florian Wetzel d391d60597 Anpassungen in numbers.c und in den entsprechenden Tests 2025-12-12 21:37:00 +01:00
hofmannjo99187 07796c1390 changed addToTreeRec so it now sets inDuplicate to 0 if needed 2025-12-12 06:50:50 +01:00
Florian Wetzel 25da0d20df Troubleshooting wegen gefailter Tests. Aenderungen in bintree.c bei Duplikatsüberprüfung 2025-12-11 15:37:48 +01:00
hofmannjo99187 6586a25fdb created all tests 2025-12-11 08:09:45 +01:00
hofmannjo99187 6e233b6695 created all tests 2025-12-11 08:09:39 +01:00
hofmannjo99187 a01aa986e6 corrected treeSizeRec cause previously end of non void function could be reached 2025-12-11 08:07:23 +01:00
Florian Wetzel aae75ade4b Ergänzung makefile um test_numbers 2025-12-10 14:28:12 +01:00
Florian Wetzel 5d976c50c1 test_numbers.c vervollständigt 2025-12-10 14:19:37 +01:00
hofmannjo99187 92fa60f9dc Merge branch 'branchjonas' 2025-12-10 12:26:54 +01:00
hofmannjo99187 284cdbdcfb made runbintreeTests.exe 2025-12-10 12:18:49 +01:00
hofmannjo99187 e3501e8550 added runbintreeTests.exe and stack.o 2025-12-09 23:18:36 +01:00
hofmannjo99187 6a9461bf5b all binaryTree functions and Tests working 2025-12-09 23:13:39 +01:00
hofmannjo99187 ef3e0b7891 changed binTreeTest makefile, test_nextTreeDataReturnsNextDataCorrectly() not yet working 2025-12-09 22:41:35 +01:00
hofmannjo99187 82b2fb283f merged branchjens 2025-12-09 22:28:31 +01:00
hofmannjo99187 602220ba21 Merge branch 'branchjens' into branchjonas 2025-12-09 22:27:30 +01:00
hofmannjo99187 748fd0d087 corrected unwanted add 2025-12-09 11:15:01 +01:00
Jens Burger 01bc613189 Kommentare gelöscht 2025-12-09 10:45:10 +01:00
Jens Burger 79a6eb7267 Debugging Unity Aufruf 2025-12-09 10:41:53 +01:00
Jens Burger 53c12ce0ed added makefile command 2025-12-09 10:38:00 +01:00
Jens Burger 8deeb6417e Testfunktion auf Unity umgebaut 2025-12-09 10:31:12 +01:00
Florian Wetzel a6c5060060 test_numbers.c Grundgerüst 2025-12-09 10:24:54 +01:00
Florian Wetzel 2689130b55 numbers.c bearbeitet 2025-12-09 09:57:13 +01:00
21 changed files with 322 additions and 64 deletions
Vendored
BIN
View File
Binary file not shown.
+18
View File
@@ -0,0 +1,18 @@
{
"configurations": [
{
"name": "macos-clang-arm64",
"includePath": [
"${workspaceFolder}/**"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "${default}",
"cppStandard": "${default}",
"intelliSenseMode": "macos-clang-arm64",
"compilerArgs": [
""
]
}
],
"version": 4
}
+13
View File
@@ -0,0 +1,13 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ Runner: Debug Session",
"type": "lldb",
"request": "launch",
"args": [],
"cwd": "/Users/florianwetzel/I2_Praktikum/DobleSpiel",
"program": "/Users/florianwetzel/I2_Praktikum/DobleSpiel/build/Debug/outDebug"
}
]
}
+59
View File
@@ -0,0 +1,59 @@
{
"C_Cpp_Runner.cCompilerPath": "clang",
"C_Cpp_Runner.cppCompilerPath": "clang++",
"C_Cpp_Runner.debuggerPath": "lldb",
"C_Cpp_Runner.cStandard": "",
"C_Cpp_Runner.cppStandard": "",
"C_Cpp_Runner.msvcBatchPath": "",
"C_Cpp_Runner.useMsvc": false,
"C_Cpp_Runner.warnings": [
"-Wall",
"-Wextra",
"-Wpedantic",
"-Wshadow",
"-Wformat=2",
"-Wcast-align",
"-Wconversion",
"-Wsign-conversion",
"-Wnull-dereference"
],
"C_Cpp_Runner.msvcWarnings": [
"/W4",
"/permissive-",
"/w14242",
"/w14287",
"/w14296",
"/w14311",
"/w14826",
"/w44062",
"/w44242",
"/w14905",
"/w14906",
"/w14263",
"/w44265",
"/w14928"
],
"C_Cpp_Runner.enableWarnings": true,
"C_Cpp_Runner.warningsAsError": false,
"C_Cpp_Runner.compilerArgs": [],
"C_Cpp_Runner.linkerArgs": [],
"C_Cpp_Runner.includePaths": [],
"C_Cpp_Runner.includeSearch": [
"*",
"**/*"
],
"C_Cpp_Runner.excludeSearch": [
"**/build",
"**/build/**",
"**/.*",
"**/.*/**",
"**/.vscode",
"**/.vscode/**"
],
"C_Cpp_Runner.useAddressSanitizer": false,
"C_Cpp_Runner.useUndefinedSanitizer": false,
"C_Cpp_Runner.useLeakSanitizer": false,
"C_Cpp_Runner.showCompilationTime": false,
"C_Cpp_Runner.useLinkTimeOptimization": false,
"C_Cpp_Runner.msvcSecureNoWarnings": false
}
Binary file not shown.
+15 -8
View File
@@ -9,10 +9,9 @@
/* * `addToTree`: fügt ein neues Element in den Baum ein (rekursiv), Done /* * `addToTree`: fügt ein neues Element in den Baum ein (rekursiv), Done
* `clearTree`: gibt den gesamten Baum frei (rekursiv), Done * `clearTree`: gibt den gesamten Baum frei (rekursiv), Done
* `treeSize`: zählt die Knoten im Baum (rekursiv), Done * `treeSize`: zählt die Knoten im Baum (rekursiv), Done
* `nextTreeData`: Traversierung mit Hilfe des zuvor implementierten Stacks. */ * `nextTreeData`: Traversierung mit Hilfe des zuvor implementierten Stacks. Done */
static TreeNode *root = NULL;
static StackNode *stackRoot = NULL; static StackNode *stackRoot = NULL;
@@ -52,26 +51,32 @@ TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFc
TreeNode *addToTreeRec(TreeNode *currentNode, TreeNode *newNode, CompareFctType compareFct, int *isDuplicate, const int root) TreeNode *addToTreeRec(TreeNode *currentNode, TreeNode *newNode, CompareFctType compareFct, int *isDuplicate, const int root)
{ {
if ((currentNode == NULL)) if (currentNode == NULL)
{ {
if ((isDuplicate == NULL) || root) if ((isDuplicate == NULL) || root)
{ {
if (isDuplicate != NULL)
{
*isDuplicate = 0;
}
return newNode; return newNode;
} }
else else
{ {
*isDuplicate = 0;
return currentNode; return currentNode;
} }
} }
else if ((compareFct(currentNode->data, newNode->data) < 0)) else if (compareFct(currentNode->data, newNode->data) < 0)
{ {
currentNode->left = addToTreeRec(currentNode->left, newNode, compareFct, isDuplicate, 0); currentNode->left = addToTreeRec(currentNode->left, newNode, compareFct, isDuplicate, 0);
} }
else if ((compareFct(currentNode->data, newNode->data) > 0)) else if (compareFct(currentNode->data, newNode->data) > 0)
{ {
currentNode->right = addToTreeRec(currentNode->right, newNode, compareFct, isDuplicate, 0); currentNode->right = addToTreeRec(currentNode->right, newNode, compareFct, isDuplicate, 0);
} }
else if ((compareFct(currentNode->data, newNode->data) == 0)) else if (compareFct(currentNode->data, newNode->data) == 0)
{ {
if (isDuplicate == NULL) if (isDuplicate == NULL)
{ {
@@ -102,13 +107,13 @@ void *nextTreeData(TreeNode *root)
{ {
// Add tree to stack so that bigest entry is ontop // Add tree to stack so that bigest entry is ontop
stackRoot = nextTreeDataRec(root, stackRoot); stackRoot = nextTreeDataRec(root, stackRoot);
pointerToReturn = stackRoot; pointerToReturn = top(stackRoot);
} }
else else
{ {
// return current top entry and then pop that top entry // return current top entry and then pop that top entry
pointerToReturn = top(stackRoot);
stackRoot = pop(stackRoot); stackRoot = pop(stackRoot);
pointerToReturn = top(stackRoot);
} }
@@ -185,5 +190,7 @@ int treeSizeRec(const TreeNode *currentNode)
nodeCount += treeSizeRec(currentNode->right); nodeCount += treeSizeRec(currentNode->right);
return nodeCount + 1; return nodeCount + 1;
} }
return nodeCount;
} }
BIN
View File
Binary file not shown.
+3 -4
View File
@@ -109,14 +109,13 @@ void test_nextTreeDataReturnsNextDataCorrectly(void)
testRoot = addToTree(testRoot, &score6, sizeof(int), compareIntEntries, NULL); testRoot = addToTree(testRoot, &score6, sizeof(int), compareIntEntries, NULL);
testRoot = addToTree(testRoot, &score7, sizeof(int), compareIntEntries, NULL); testRoot = addToTree(testRoot, &score7, sizeof(int), compareIntEntries, NULL);
// Create Stack // Create Stack
StackNode *entry = nextTreeData(testRoot); StackNode *entry = nextTreeData(testRoot);
// check if nextTreeData returns Data correctly // check if nextTreeData returns Data correctly
TEST_ASSERT_NOT_NULL(entry); TEST_ASSERT_NOT_NULL(entry);
TEST_ASSERT_EQUAL(score7, *(int *)nextTreeData(NULL)); TEST_ASSERT_EQUAL(score7, *(int *)entry);
TEST_ASSERT_EQUAL(score3, *(int *)nextTreeData(NULL)); TEST_ASSERT_EQUAL(score3, *(int *)nextTreeData(NULL));
TEST_ASSERT_EQUAL(score6, *(int *)nextTreeData(NULL)); TEST_ASSERT_EQUAL(score6, *(int *)nextTreeData(NULL));
TEST_ASSERT_EQUAL(score1, *(int *)nextTreeData(NULL)); TEST_ASSERT_EQUAL(score1, *(int *)nextTreeData(NULL));
@@ -124,7 +123,7 @@ void test_nextTreeDataReturnsNextDataCorrectly(void)
TEST_ASSERT_EQUAL(score2, *(int *)nextTreeData(NULL)); TEST_ASSERT_EQUAL(score2, *(int *)nextTreeData(NULL));
TEST_ASSERT_EQUAL(score4, *(int *)nextTreeData(NULL)); TEST_ASSERT_EQUAL(score4, *(int *)nextTreeData(NULL));
clearStack(entry);
clearTree(testRoot); clearTree(testRoot);
} }
@@ -215,7 +214,7 @@ int main()
printf("\n============================\nBinary Tree tests\n============================\n"); printf("\n============================\nBinary Tree tests\n============================\n");
RUN_TEST(test_addToTreeExpandsTreeCorrectly); RUN_TEST(test_addToTreeExpandsTreeCorrectly);
// RUN_TEST(test_nextTreeDataReturnsNextDataCorrectly); RUN_TEST(test_nextTreeDataReturnsNextDataCorrectly);
RUN_TEST(test_clearTreeworksLikeExpected); RUN_TEST(test_clearTreeworksLikeExpected);
RUN_TEST(test_treeSizeWorkingLikeExpected); RUN_TEST(test_treeSizeWorkingLikeExpected);
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+8 -4
View File
@@ -38,17 +38,21 @@ $(program_obj_filesobj_files): %.o: %.c
# unitTests: # unitTests:
# echo "needs to be implemented" # echo "needs to be implemented"
bintree: bintree.c
$(CC) $(FLAGS) -c bintree bintree.c
bintreeTests: stack.o bintree.o bintreeTests.c $(unityfolder)/unity.c
$(CC) $(FLAGS) -o runbintreeTests bintreeTests.c bintree.o stack.o $(unityfolder)/unity.c
stack: stack.c stack: stack.c
$(CC) $(FLAGS) -c stack stack.c $(CC) $(FLAGS) -c stack stack.c
test_stack: stack.o test_stack.c $(unityfolder)/unity.c test_stack: stack.o test_stack.c $(unityfolder)/unity.c
$(CC) $(FLAGS) -o runstackTests test_stack.c stack.o $(unityfolder)/unity.c $(CC) $(FLAGS) -o runstackTests test_stack.c stack.o $(unityfolder)/unity.c
bintree: bintree.c test_numbers: numbers.o bintree.o stack.o test_numbers.c $(unityfolder)/unity.c
$(CC) $(FLAGS) -c bintree bintree.c $(CC) $(FLAGS) -o run_numbersTests test_numbers.c numbers.o bintree.o stack.o $(unityfolder)/unity.c
bintreeTests: bintree.o bintreeTests.c $(unityfolder)/unity.c
$(CC) $(FLAGS) -o runbintreeTests bintreeTests.c bintree.o $(unityfolder)/unity.c
# -------------------------- # --------------------------
# Clean # Clean
+96
View File
@@ -14,13 +14,109 @@
// Returns len random numbers between 1 and 2x len in random order which are all different, except for two entries. // 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 // Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while
// creating random numbers. // creating random numbers.
static int compareUInt(const void *a, const void *b)
{
unsigned int A = *(unsigned int*)a;
unsigned int B = *(unsigned int*)b;
if (A < B) return -1;
if (A > B) return 1;
return 0;
}
static int existsInTree(TreeNode *root, unsigned int value)
{
if (!root) return 0;
unsigned int *data;
// Traversierung initialisieren
data = nextTreeData(root);
do
{
if (*data == value)
return 1;
} while ((data = nextTreeData(NULL)) != NULL);
return 0;
}
unsigned int *createNumbers(unsigned int len) unsigned int *createNumbers(unsigned int len)
{ {
if (len < 2) return NULL;
srand((unsigned int)time(NULL));
unsigned int *numbers = malloc(sizeof(unsigned int) * len);
if (!numbers) return NULL;
TreeNode *root = NULL;
unsigned int value;
// Array mit eindeutigen Zufallszahlen füllen
for (unsigned int i = 0; i < len; i++)
{
do
{
value = (rand() % (2 * len)) + 1;
} }
while (existsInTree(root, value));
// Baum wie highscore benutzen (immer NULL)
root = addToTree(
root,
&value,
sizeof(unsigned int),
compareUInt,
NULL
);
numbers[i] = value;
}
// genau eine Zufallszahl duplizieren
unsigned int idx1 = rand() % len;
unsigned int idx2;
do
{
idx2 = rand() % len;
}
while (idx2 == idx1);
numbers[idx2] = numbers[idx1];
clearTree(root);
return numbers;
}
// Returns only the only number in numbers which is present twice. Returns zero on errors. // 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 getDuplicate(const unsigned int numbers[], unsigned int len)
{ {
if (!numbers || len < 2) return 0;
unsigned int *copy = malloc(len * sizeof(unsigned int));
if (!copy) return 0;
// Array kopieren
memcpy(copy, numbers, len * sizeof(unsigned int));
// Sortieren
qsort(copy, len, sizeof(unsigned int), compareUInt);
// Doppelte Zahl finden
unsigned int duplicate = 0;
for (unsigned int i = 0; i < len - 1; i++)
{
if (copy[i] == copy[i + 1])
{
duplicate = copy[i];
break;
}
}
free(copy);
return duplicate;
} }
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+63
View File
@@ -0,0 +1,63 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "numbers.h"
#include "unity/unity.h"
void setUp(void) {
// gehört zu unit-Grundaufbau
}
void tearDown(void) {
// gehört zu unit-Grundaufbau
}
// Testet, ob createNumbers ein gültiges Array erzeugt
// und genau ein Duplikat enthalten ist
void test_createNumbers_basic(void)
{
unsigned int len = 10;
unsigned int *numbers = createNumbers(len);
// Array muss existieren
TEST_ASSERT_NOT_NULL(numbers);
// Es muss genau EIN Duplikat geben
unsigned int duplicate = getDuplicate(numbers, len);
TEST_ASSERT_NOT_EQUAL(0, duplicate);
free(numbers);
}
/// Testet, ob getDuplicate die korrekte doppelte Zahl erkennt
void test_getDuplicate_correctValue(void)
{
unsigned int numbers[] = {1, 3, 5, 7, 3};
unsigned int len = 5;
unsigned int dup = getDuplicate(numbers, len);
TEST_ASSERT_EQUAL(3, dup);
}
// Testet Fehlerfälle von getDuplicate
static void test_getDuplicate_errors(void)
{
TEST_ASSERT_EQUAL_UINT(0, getDuplicate(NULL, 10));
TEST_ASSERT_EQUAL_UINT(0, getDuplicate((unsigned int*)1, 1)); // len < 2
}
// Testbereich
int main(void)
{
UNITY_BEGIN();
RUN_TEST(test_createNumbers_basic);
RUN_TEST(test_getDuplicate_correctValue);
RUN_TEST(test_getDuplicate_errors);
return UNITY_END();
}
+43 -44
View File
@@ -1,24 +1,30 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "unity.h"
#include "stack.h" #include "stack.h"
void setUp(void) {
// Falls notwendig, kann hier Vorbereitungsarbeit gemacht werden
}
void tearDown(void) {
// Hier kann Bereinigungsarbeit nach jedem Test durchgeführt werden
}
void testeStackBeschreiben() void testeStackBeschreiben()
{ {
printf("=== Test: push() ===\n"); //printf("=== Test: push() ===\n");
StackNode *stack = NULL; StackNode *stack = NULL;
int wert1 = 42; int wert1 = 42;
stack = push(stack, &wert1); stack = push(stack, &wert1);
int *topValue = (int *)(stack->data); int *topValue = (int *)(stack->data);
if(topValue != NULL && *topValue == 42)
{ TEST_ASSERT_NOT_NULL(topValue);
printf("Test 1: Erstes Element erfolgreich gepusht!\n"); TEST_ASSERT_EQUAL_INT(42, *topValue);
}
else
{
printf("Test 1: FEHLGESCHLAGEN!\n");
}
int wert2 = 12; int wert2 = 12;
@@ -27,23 +33,19 @@ void testeStackBeschreiben()
topValue = (int *)(stack->data); topValue = (int *)(stack->data);
int *secondValue = (int *)((stack->next)->data); int *secondValue = (int *)((stack->next)->data);
if(topValue != NULL && *topValue == 12.25 && secondValue != NULL && *secondValue == 42) TEST_ASSERT_NOT_NULL(topValue);
{ TEST_ASSERT_EQUAL_INT(12, *topValue);
printf("Test 2: Zweites Element erfolgreich gepusht!\n"); TEST_ASSERT_NOT_NULL(secondValue);
} TEST_ASSERT_EQUAL_INT(42, *secondValue);
else
{
printf("Test 2: FEHLGESCHLAGEN!\n");
}
printf("=== Ende Test: push() ===\n\n"); //printf("=== Ende Test: push() ===\n\n");
return; return;
} }
void testepop() void testepop()
{ {
printf("=== Test: pop() ===\n"); //printf("=== Test: pop() ===\n");
StackNode *stack = NULL; StackNode *stack = NULL;
int wert1 = 20; int wert1 = 20;
@@ -56,21 +58,15 @@ void testepop()
int *topValue = (int *)(stack->data); int *topValue = (int *)(stack->data);
if(topValue != NULL && *topValue == 20) TEST_ASSERT_NOT_NULL(topValue);
{ TEST_ASSERT_EQUAL_INT(20, *topValue);
printf("Test: Erstes Element erfolgreich gelöscht!\n");
}
else
{
printf("Test 1: FEHLGESCHLAGEN!\n");
}
printf("=== Ende Test: pop() ===\n\n"); //printf("=== Ende Test: pop() ===\n\n");
} }
void testetop() void testetop()
{ {
printf("=== Test: top() ===\n"); //printf("=== Test: top() ===\n");
StackNode *stack = NULL; StackNode *stack = NULL;
int wert1 = 20; int wert1 = 20;
@@ -81,21 +77,15 @@ void testetop()
int *topValue = top(stack); int *topValue = top(stack);
if(topValue != NULL && *topValue == 74) TEST_ASSERT_NOT_NULL(topValue);
{ TEST_ASSERT_EQUAL_INT(74, *topValue);
printf("Test: top() gibt korrektes Element zurück!\n");
}
else
{
printf("Test: FEHLGESCHLAGEN!\n");
}
printf("=== Ende Test: top() ===\n\n"); //printf("=== Ende Test: top() ===\n\n");
} }
void testeclearStack() void testeclearStack()
{ {
printf("=== Test: clearStack() ===\n"); //printf("=== Test: clearStack() ===\n");
StackNode *stack = NULL; StackNode *stack = NULL;
int wert1 = 20; int wert1 = 20;
@@ -106,16 +96,25 @@ void testeclearStack()
clearStack(stack); clearStack(stack);
printf("Test: clearStack() aufgerufen. Speicher freigegeben.\n"); //printf("Test: clearStack() aufgerufen. Speicher freigegeben.\n");
printf("=== Ende Test: clearStack() ===\n\n"); //printf("=== Ende Test: clearStack() ===\n\n");
} }
int main() int main()
{ {
testeStackBeschreiben(); UNITY_BEGIN();
//printf("...");
RUN_TEST(testeStackBeschreiben);
RUN_TEST(testepop);
RUN_TEST(testetop);
RUN_TEST(testeclearStack);
/*testeStackBeschreiben();
testepop(); testepop();
testetop(); testetop();
testeclearStack(); testeclearStack();*/
return 0; return UNITY_END();
} }
BIN
View File
Binary file not shown.