generated from freudenreichan/info2Praktikum-DobleSpiel
Compare commits
2 Commits
dcc90edfa3
...
8f3ee7b9d7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8f3ee7b9d7 | ||
|
|
37f38cbc7d |
BIN
highscore.o
Normal file
BIN
highscore.o
Normal file
Binary file not shown.
@ -1,3 +1,5 @@
|
||||
Silvana;9944
|
||||
hannes;9910
|
||||
silvana;9865
|
||||
player2;4983
|
||||
player1;3999
|
||||
|
||||
80
makefile
80
makefile
@ -1,66 +1,66 @@
|
||||
CC = gcc
|
||||
FLAGS = -g -Wall -lm
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
include makefile_windows.variables
|
||||
else
|
||||
UNAME = $(shell uname)
|
||||
ifeq ($(UNAME),Linux)
|
||||
include makefile_linux.variables
|
||||
else
|
||||
include makefile_mac.variables
|
||||
endif
|
||||
endif
|
||||
|
||||
raylibfolder = ./raylib
|
||||
unityfolder = ./unity
|
||||
|
||||
|
||||
FLAGS = -g -Wall -I$(unityfolder)
|
||||
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
include makefile_windows.variables
|
||||
else
|
||||
UNAME := $(shell uname)
|
||||
ifeq ($(UNAME),Linux)
|
||||
include makefile_linux.variables
|
||||
else
|
||||
include makefile_mac.variables
|
||||
endif
|
||||
endif
|
||||
|
||||
# --------------------------
|
||||
# Initiales Programm bauen (zum ausprobieren)
|
||||
# Objektdateien
|
||||
# --------------------------
|
||||
program_obj_files := stack.o bintree.o numbers.o timer.o highscore.o
|
||||
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(FLAGS) -c $< -o $@
|
||||
|
||||
|
||||
doble: main.o $(program_obj_files)
|
||||
$(CC) $(FLAGS) $^ -o doble
|
||||
|
||||
|
||||
doble_initial:
|
||||
$(CC) -o doble_initial $(BINARIES)/libdoble_complete.a
|
||||
|
||||
# --------------------------
|
||||
# Selbst implementiertes Programm bauen
|
||||
# --------------------------
|
||||
program_obj_files = stack.o bintree.o numbers.o timer.o highscore.o
|
||||
|
||||
doble : main.o $(program_obj_files)
|
||||
$(CC) $(FLAGS) $^ -o doble
|
||||
|
||||
$(program_obj_filesobj_files): %.o: %.c
|
||||
$(CC) -c $(FLAGS) $^ -o $@
|
||||
|
||||
# --------------------------
|
||||
# Unit Tests
|
||||
# --------------------------
|
||||
unity_src = $(unityfolder)/unity.c
|
||||
|
||||
unitTests: numbersTest stackTest bintreeTest
|
||||
# ./runNumbersTest
|
||||
# ./runStackTest
|
||||
./runBintreeTest
|
||||
unitTests:
|
||||
@echo "needs to be implemented"
|
||||
|
||||
numbersTest: numbers.o bintree.o stack.o numbersTest.c $(unity_src)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -I$(unityfolder) $^ -o runNumbersTest
|
||||
|
||||
stackTest: stack.o stackTest.c $(unity_src)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -I$(unityfolder) $^ -o runStackTests
|
||||
binTreeTest: stack.o bintree.o binTreeTest.c $(unityfolder)/unity.c
|
||||
$(CC) $(FLAGS) -o runbinTreeTest binTreeTest.c bintree.o stack.o $(unityfolder)/unity.c
|
||||
|
||||
binTreeTest: bintree.o binTreeTest.c $(unity_src) stack.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -I$(unityfolder) $^ -o runBinTreeTest
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -c $(CFLAGS) $< -o $@
|
||||
test_numbers: numbers_no_tree.o bintree.o stack.o test_numbers.c $(unityfolder)/unity.c
|
||||
$(CC) $(FLAGS) -o run_numbersTests test_numbers.c numbers_no_tree.o bintree.o stack.o $(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
|
||||
|
||||
# --------------------------
|
||||
# Clean
|
||||
# Cleaning
|
||||
# --------------------------
|
||||
clean:
|
||||
ifeq ($(OS),Windows_NT)
|
||||
del /f *.o doble
|
||||
del /f *.o doble runstackTests run_numbersTests runbintreeTests
|
||||
else
|
||||
rm -f *.o doble
|
||||
endif
|
||||
rm -f *.o doble runstackTests run_numbersTests runbintreeTests
|
||||
endif
|
||||
|
||||
131
numbers.c
131
numbers.c
@ -17,85 +17,88 @@
|
||||
// Returns len random numbers between 1 and 2*len in random order,
|
||||
// all different, except for exactly one duplicate (two entries the same).
|
||||
// Uses your binary search tree implementation to check for duplicates while generating numbers.
|
||||
unsigned int *createNumbers(unsigned int len)
|
||||
{
|
||||
if (len < 2)
|
||||
return NULL;
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include "numbers.h"
|
||||
#include "bintree.h"
|
||||
|
||||
srand(time(NULL));
|
||||
|
||||
|
||||
unsigned int *numbers = malloc(len * sizeof(unsigned int));
|
||||
if (!numbers)
|
||||
return NULL;
|
||||
|
||||
TreeNode *root = NULL; // Baum anfänglich leer
|
||||
unsigned int count = 0;
|
||||
|
||||
// Zufallszahlen generieren, bis das Array voll ist
|
||||
while (count < len) {
|
||||
unsigned int random = (rand() % (2 * len)) + 1;
|
||||
|
||||
int duplicate = 0; // Anfangswert für Duplikat-Check
|
||||
root = addToTree(root, &random, sizeof(random), compareFct, &duplicate);
|
||||
|
||||
if (root == NULL) {
|
||||
free(numbers);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!duplicate) { // Zahl war neu → ins Array einfügen
|
||||
numbers[count++] = random;
|
||||
}
|
||||
// duplicate == 1 → Zahl existiert schon, neue Zahl generieren
|
||||
int compareFct(const void *a, const void *b)
|
||||
{
|
||||
return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b); // a und b werden in int konvertiert und deren Werte miteinander verglichen
|
||||
// returns 1 for a>b or -1 for a<b
|
||||
// in bintree.c wird ueberprueft, ob compare eine positive oder eine negative Zahl zurueckgibt,
|
||||
// wenn a groeßer b, positiv und dann wird links nach Teilbauemen gesucht
|
||||
}
|
||||
|
||||
// Jetzt len eindeutige Zahlen erzeugt → ein Duplikat erzwingen
|
||||
unsigned int idx1 = rand() % len;
|
||||
unsigned int idx2 = rand() % len;
|
||||
while (idx2 == idx1) // sicherstellen, dass es eine andere Position ist
|
||||
idx2 = rand() % len;
|
||||
// Erzeugt len Zufallszahlen zwischen 1 und 2*len
|
||||
// alle einzigartig, außer genau ein Duplikat
|
||||
unsigned int *createNumbers(unsigned int len)
|
||||
{
|
||||
if (len < 2)
|
||||
return NULL;
|
||||
|
||||
numbers[idx2] = numbers[idx1];
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
// Baum wieder freigeben
|
||||
clearTree(root);
|
||||
unsigned int *numbers = malloc(len * sizeof(unsigned int));
|
||||
if (!numbers)
|
||||
return NULL;
|
||||
|
||||
return numbers;
|
||||
}
|
||||
TreeNode *root = NULL; // Baum anfänglich leer
|
||||
unsigned int count = 0;
|
||||
|
||||
// Jetzt len eindeutige Zahlen erzeugt ⇒ wir müssen ein Duplikat erzwingen
|
||||
unsigned int idx1 = rand() % len;
|
||||
unsigned int idx2 = rand() % len;
|
||||
while (idx2 == idx1)
|
||||
idx2 = rand() % len;
|
||||
// Zufallszahlen generieren, bis das Array voll ist
|
||||
while (count < len)
|
||||
{
|
||||
unsigned int random = (rand() % (2 * len)) + 1;
|
||||
int duplicate = 0; // Anfangswert für Duplikat-Check
|
||||
|
||||
numbers[idx2] = numbers[idx1]; // zweites Exemplar
|
||||
root = addToTree(root, &random, sizeof(random), compareFct, &duplicate);
|
||||
|
||||
clearTree(root);
|
||||
return numbers;
|
||||
if (root == NULL)
|
||||
{
|
||||
free(numbers);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!duplicate)
|
||||
{
|
||||
numbers[count++] = random;
|
||||
}
|
||||
// duplicate == 1 → Zahl existiert schon, neue Zahl generieren
|
||||
}
|
||||
|
||||
// genau ein Duplikat erzeugen
|
||||
unsigned int idx1 = rand() % len;
|
||||
unsigned int idx2 = rand() % len;
|
||||
while (idx2 == idx1)
|
||||
idx2 = rand() % len;
|
||||
|
||||
numbers[idx2] = numbers[idx1];
|
||||
|
||||
// Baum wieder freigeben
|
||||
clearTree(root);
|
||||
|
||||
return numbers;
|
||||
}
|
||||
|
||||
|
||||
// Returns only the only number in numbers which is present twice. Returns zero on errors.
|
||||
// findet die eine doppelte Zahl im Array
|
||||
unsigned int getDuplicate(const unsigned int numbers[], unsigned int len)
|
||||
{
|
||||
if(len>0)
|
||||
if (!numbers || len < 2)
|
||||
return 0;
|
||||
|
||||
for (unsigned int i = 0; i < len; i++)
|
||||
{
|
||||
unsigned int duplicate = 0;
|
||||
for(unsigned int i=0;i<len;i++)
|
||||
{
|
||||
unsigned int v1 = numbers[i];
|
||||
for(unsigned int j=i+1;j<len;j++)
|
||||
{
|
||||
unsigned int v2 = numbers[j];
|
||||
if(v1==v2)
|
||||
{
|
||||
return v1;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (unsigned int j = i + 1; j < len; j++)
|
||||
{
|
||||
if (numbers[i] == numbers[j])
|
||||
return numbers[i];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
#ifndef NUMBERS_H
|
||||
#define NUMBERS_H
|
||||
|
||||
|
||||
int compareFct(const void *a, const void *b);
|
||||
// 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.
|
||||
|
||||
BIN
numbers_no_tree.o
Normal file
BIN
numbers_no_tree.o
Normal file
Binary file not shown.
Binary file not shown.
BIN
run_numbersTests.exe
Normal file
BIN
run_numbersTests.exe
Normal file
Binary file not shown.
BIN
runbintreeTests.exe
Normal file
BIN
runbintreeTests.exe
Normal file
Binary file not shown.
BIN
runstackTests.exe
Normal file
BIN
runstackTests.exe
Normal file
Binary file not shown.
19
stack.c
19
stack.c
@ -10,7 +10,11 @@
|
||||
// Pushes data as pointer onto the stack.
|
||||
StackNode *push(StackNode *stack, void *data)
|
||||
{
|
||||
if(stack && data){
|
||||
if (!data)
|
||||
{
|
||||
return stack; //Nichts pushen
|
||||
}
|
||||
//if(stack && data){
|
||||
StackNode *t = (StackNode *)malloc(sizeof(StackNode));
|
||||
if(!t)
|
||||
{
|
||||
@ -19,7 +23,7 @@ StackNode *push(StackNode *stack, void *data)
|
||||
t->next = stack;
|
||||
t->data = data;
|
||||
return t; //Gibt den ersten StackNode des Stacks zurueck
|
||||
}
|
||||
//}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -27,12 +31,11 @@ StackNode *push(StackNode *stack, void *data)
|
||||
// freed by caller.)
|
||||
StackNode *pop(StackNode *stack)
|
||||
{
|
||||
if(stack)
|
||||
if(stack == NULL)
|
||||
{
|
||||
StackNode *t = stack->next; //Naechstes Element im Stack wird erstes Element
|
||||
free(stack);
|
||||
return t;
|
||||
return NULL;
|
||||
}
|
||||
return stack->next;
|
||||
}
|
||||
|
||||
// Returns the data of the top element.
|
||||
@ -50,8 +53,8 @@ void clearStack(StackNode *stack)
|
||||
{
|
||||
while(stack)
|
||||
{
|
||||
StackNode *tmp = stack;
|
||||
stack = stack->next;
|
||||
StackNode *tmp = stack; //merkt sich den momentanen obersten Knoten
|
||||
stack = stack->next; //setzt den obersten Knoten auf den Zweiten im Stack
|
||||
free(tmp->data);
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
72
test_stack.c
Normal file
72
test_stack.c
Normal file
@ -0,0 +1,72 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "stack.h"
|
||||
|
||||
//Testfunkionen zu push, pull, top & clearStack schreiben
|
||||
|
||||
void setUp()
|
||||
{
|
||||
}
|
||||
|
||||
void tearDown()
|
||||
{
|
||||
}
|
||||
|
||||
void test(char *name, int condition) {
|
||||
if (condition) {
|
||||
printf("[OK] %s\n", name);
|
||||
} else {
|
||||
printf("[FAIL] %s\n", name);
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
StackNode *stack = NULL;
|
||||
|
||||
// Werte dynamisch anlegen
|
||||
int *val1 = malloc(sizeof(int));
|
||||
*val1 = 5;
|
||||
stack = push(stack, val1);
|
||||
test("push(5) legt 5 oben auf den Stack", *(int*)stack->data == 5);
|
||||
|
||||
int *val2 = malloc(sizeof(int));
|
||||
*val2 = 6;
|
||||
stack = push(stack, val2);
|
||||
test("push(6) legt 6 oben auf den Stack", *(int*)stack->data == 6);
|
||||
|
||||
int *val3 = malloc(sizeof(int));
|
||||
*val3 = 24;
|
||||
stack = push(stack, val3);
|
||||
test("push(24) legt 24 oben auf den Stack", *(int*)stack->data == 24);
|
||||
|
||||
// Test top()
|
||||
int t = *(int*)top(stack);
|
||||
test("top() liefert 24", t == 24);
|
||||
|
||||
// Test pop()
|
||||
StackNode *tmp;
|
||||
|
||||
tmp = stack;
|
||||
stack = pop(stack);
|
||||
free(tmp->data); // Daten freigeben
|
||||
free(tmp); // Knoten freigeben
|
||||
test("pop() entfernt 24, 6 ist jetzt oben", *(int*)stack->data == 6);
|
||||
|
||||
tmp = stack;
|
||||
stack = pop(stack);
|
||||
free(tmp->data);
|
||||
free(tmp);
|
||||
test("pop() entfernt 6, 5 ist jetzt oben", *(int*)stack->data == 5);
|
||||
|
||||
tmp = stack;
|
||||
stack = pop(stack);
|
||||
free(tmp->data);
|
||||
free(tmp);
|
||||
test("pop() entfernt 5, Stack ist jetzt leer", stack == NULL);
|
||||
|
||||
// Am Ende Stack leeren (falls noch Elemente übrig)
|
||||
clearStack(stack);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user