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
|
Silvana;9944
|
||||||
hannes;9910
|
hannes;9910
|
||||||
|
silvana;9865
|
||||||
|
player2;4983
|
||||||
player1;3999
|
player1;3999
|
||||||
|
|||||||
62
makefile
62
makefile
@ -1,10 +1,17 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
FLAGS = -g -Wall -lm
|
|
||||||
|
|
||||||
|
raylibfolder = ./raylib
|
||||||
|
unityfolder = ./unity
|
||||||
|
|
||||||
|
|
||||||
|
FLAGS = -g -Wall -I$(unityfolder)
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
ifeq ($(OS),Windows_NT)
|
||||||
include makefile_windows.variables
|
include makefile_windows.variables
|
||||||
else
|
else
|
||||||
UNAME = $(shell uname)
|
UNAME := $(shell uname)
|
||||||
ifeq ($(UNAME),Linux)
|
ifeq ($(UNAME),Linux)
|
||||||
include makefile_linux.variables
|
include makefile_linux.variables
|
||||||
else
|
else
|
||||||
@ -12,55 +19,48 @@ else
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
raylibfolder = ./raylib
|
# --------------------------
|
||||||
unityfolder = ./unity
|
# Objektdateien
|
||||||
|
# --------------------------
|
||||||
|
program_obj_files := stack.o bintree.o numbers.o timer.o highscore.o
|
||||||
|
|
||||||
# --------------------------
|
|
||||||
# Initiales Programm bauen (zum ausprobieren)
|
|
||||||
# --------------------------
|
|
||||||
doble_initial:
|
|
||||||
$(CC) -o doble_initial $(BINARIES)/libdoble_complete.a
|
|
||||||
|
|
||||||
# --------------------------
|
%.o: %.c
|
||||||
# Selbst implementiertes Programm bauen
|
$(CC) $(FLAGS) -c $< -o $@
|
||||||
# --------------------------
|
|
||||||
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
|
$(CC) $(FLAGS) $^ -o doble
|
||||||
|
|
||||||
$(program_obj_filesobj_files): %.o: %.c
|
|
||||||
$(CC) -c $(FLAGS) $^ -o $@
|
doble_initial:
|
||||||
|
$(CC) -o doble_initial $(BINARIES)/libdoble_complete.a
|
||||||
|
|
||||||
# --------------------------
|
# --------------------------
|
||||||
# Unit Tests
|
# Unit Tests
|
||||||
# --------------------------
|
# --------------------------
|
||||||
unity_src = $(unityfolder)/unity.c
|
|
||||||
|
|
||||||
unitTests: numbersTest stackTest bintreeTest
|
unitTests:
|
||||||
# ./runNumbersTest
|
@echo "needs to be implemented"
|
||||||
# ./runStackTest
|
|
||||||
./runBintreeTest
|
|
||||||
|
|
||||||
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)
|
binTreeTest: stack.o bintree.o binTreeTest.c $(unityfolder)/unity.c
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -I$(unityfolder) $^ -o runStackTests
|
$(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
|
test_numbers: numbers_no_tree.o bintree.o stack.o test_numbers.c $(unityfolder)/unity.c
|
||||||
$(CC) -c $(CFLAGS) $< -o $@
|
$(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:
|
clean:
|
||||||
ifeq ($(OS),Windows_NT)
|
ifeq ($(OS),Windows_NT)
|
||||||
del /f *.o doble
|
del /f *.o doble runstackTests run_numbersTests runbintreeTests
|
||||||
else
|
else
|
||||||
rm -f *.o doble
|
rm -f *.o doble runstackTests run_numbersTests runbintreeTests
|
||||||
endif
|
endif
|
||||||
65
numbers.c
65
numbers.c
@ -17,13 +17,28 @@
|
|||||||
// Returns len random numbers between 1 and 2*len in random order,
|
// Returns len random numbers between 1 and 2*len in random order,
|
||||||
// all different, except for exactly one duplicate (two entries the same).
|
// all different, except for exactly one duplicate (two entries the same).
|
||||||
// Uses your binary search tree implementation to check for duplicates while generating numbers.
|
// Uses your binary search tree implementation to check for duplicates while generating numbers.
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "numbers.h"
|
||||||
|
#include "bintree.h"
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erzeugt len Zufallszahlen zwischen 1 und 2*len
|
||||||
|
// alle einzigartig, außer genau ein Duplikat
|
||||||
unsigned int *createNumbers(unsigned int len)
|
unsigned int *createNumbers(unsigned int len)
|
||||||
{
|
{
|
||||||
if (len < 2)
|
if (len < 2)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
srand(time(NULL));
|
srand((unsigned int)time(NULL));
|
||||||
|
|
||||||
|
|
||||||
unsigned int *numbers = malloc(len * sizeof(unsigned int));
|
unsigned int *numbers = malloc(len * sizeof(unsigned int));
|
||||||
if (!numbers)
|
if (!numbers)
|
||||||
@ -33,27 +48,30 @@ unsigned int *createNumbers(unsigned int len)
|
|||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
|
|
||||||
// Zufallszahlen generieren, bis das Array voll ist
|
// Zufallszahlen generieren, bis das Array voll ist
|
||||||
while (count < len) {
|
while (count < len)
|
||||||
|
{
|
||||||
unsigned int random = (rand() % (2 * len)) + 1;
|
unsigned int random = (rand() % (2 * len)) + 1;
|
||||||
|
|
||||||
int duplicate = 0; // Anfangswert für Duplikat-Check
|
int duplicate = 0; // Anfangswert für Duplikat-Check
|
||||||
|
|
||||||
root = addToTree(root, &random, sizeof(random), compareFct, &duplicate);
|
root = addToTree(root, &random, sizeof(random), compareFct, &duplicate);
|
||||||
|
|
||||||
if (root == NULL) {
|
if (root == NULL)
|
||||||
|
{
|
||||||
free(numbers);
|
free(numbers);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!duplicate) { // Zahl war neu → ins Array einfügen
|
if (!duplicate)
|
||||||
|
{
|
||||||
numbers[count++] = random;
|
numbers[count++] = random;
|
||||||
}
|
}
|
||||||
// duplicate == 1 → Zahl existiert schon, neue Zahl generieren
|
// duplicate == 1 → Zahl existiert schon, neue Zahl generieren
|
||||||
}
|
}
|
||||||
|
|
||||||
// Jetzt len eindeutige Zahlen erzeugt → ein Duplikat erzwingen
|
// genau ein Duplikat erzeugen
|
||||||
unsigned int idx1 = rand() % len;
|
unsigned int idx1 = rand() % len;
|
||||||
unsigned int idx2 = rand() % len;
|
unsigned int idx2 = rand() % len;
|
||||||
while (idx2 == idx1) // sicherstellen, dass es eine andere Position ist
|
while (idx2 == idx1)
|
||||||
idx2 = rand() % len;
|
idx2 = rand() % len;
|
||||||
|
|
||||||
numbers[idx2] = numbers[idx1];
|
numbers[idx2] = numbers[idx1];
|
||||||
@ -64,38 +82,23 @@ unsigned int *createNumbers(unsigned int len)
|
|||||||
return numbers;
|
return numbers;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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;
|
|
||||||
|
|
||||||
numbers[idx2] = numbers[idx1]; // zweites Exemplar
|
// findet die eine doppelte Zahl im Array
|
||||||
|
|
||||||
clearTree(root);
|
|
||||||
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)
|
unsigned int getDuplicate(const unsigned int numbers[], unsigned int len)
|
||||||
{
|
{
|
||||||
if(len>0)
|
if (!numbers || len < 2)
|
||||||
{
|
return 0;
|
||||||
unsigned int duplicate = 0;
|
|
||||||
for (unsigned int i = 0; i < len; i++)
|
for (unsigned int i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
unsigned int v1 = numbers[i];
|
|
||||||
for (unsigned int j = i + 1; j < len; j++)
|
for (unsigned int j = i + 1; j < len; j++)
|
||||||
{
|
{
|
||||||
unsigned int v2 = numbers[j];
|
if (numbers[i] == numbers[j])
|
||||||
if(v1==v2)
|
return numbers[i];
|
||||||
{
|
|
||||||
return v1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
#ifndef NUMBERS_H
|
#ifndef NUMBERS_H
|
||||||
#define 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 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.
|
||||||
|
|||||||
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.
|
// Pushes data as pointer onto the stack.
|
||||||
StackNode *push(StackNode *stack, void *data)
|
StackNode *push(StackNode *stack, void *data)
|
||||||
{
|
{
|
||||||
if(stack && data){
|
if (!data)
|
||||||
|
{
|
||||||
|
return stack; //Nichts pushen
|
||||||
|
}
|
||||||
|
//if(stack && data){
|
||||||
StackNode *t = (StackNode *)malloc(sizeof(StackNode));
|
StackNode *t = (StackNode *)malloc(sizeof(StackNode));
|
||||||
if(!t)
|
if(!t)
|
||||||
{
|
{
|
||||||
@ -19,7 +23,7 @@ StackNode *push(StackNode *stack, void *data)
|
|||||||
t->next = stack;
|
t->next = stack;
|
||||||
t->data = data;
|
t->data = data;
|
||||||
return t; //Gibt den ersten StackNode des Stacks zurueck
|
return t; //Gibt den ersten StackNode des Stacks zurueck
|
||||||
}
|
//}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -27,12 +31,11 @@ StackNode *push(StackNode *stack, void *data)
|
|||||||
// freed by caller.)
|
// freed by caller.)
|
||||||
StackNode *pop(StackNode *stack)
|
StackNode *pop(StackNode *stack)
|
||||||
{
|
{
|
||||||
if(stack)
|
if(stack == NULL)
|
||||||
{
|
{
|
||||||
StackNode *t = stack->next; //Naechstes Element im Stack wird erstes Element
|
return NULL;
|
||||||
free(stack);
|
|
||||||
return t;
|
|
||||||
}
|
}
|
||||||
|
return stack->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the data of the top element.
|
// Returns the data of the top element.
|
||||||
@ -50,8 +53,8 @@ void clearStack(StackNode *stack)
|
|||||||
{
|
{
|
||||||
while(stack)
|
while(stack)
|
||||||
{
|
{
|
||||||
StackNode *tmp = stack;
|
StackNode *tmp = stack; //merkt sich den momentanen obersten Knoten
|
||||||
stack = stack->next;
|
stack = stack->next; //setzt den obersten Knoten auf den Zweiten im Stack
|
||||||
free(tmp->data);
|
free(tmp->data);
|
||||||
free(tmp);
|
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