generated from freudenreichan/info2Praktikum-DobleSpiel
4.2 KiB
4.2 KiB
Praktikum Informatik 2 – Projekt „Doble“
Dieses Repository enthält unsere Umsetzung des Praktikumsprojekts Doble (Algorithmen und Datenstrukturen in C). Ziel des Projekts ist die Implementierung eines generischen Stacks, eines binären Suchbaums sowie einer Zufallszahlengenerierung mit Duplikaterkennung mittels qsort – inklusive vollständiger Unit-Tests und sauberer Speicherverwaltung.
Arbeitsteilung
Jede Person implementiert ihre zugewiesenen Module sowie die dazugehörigen Unit-Tests eigenständig.
| Bereich | Flo | Jamin |
|---|---|---|
| Module & Logik | stack.h, stack.c, numbers.c (+ Memory-Leak-Fix in main.c) |
bintree.c |
| Unit-Tests | test_stack.c, test_numbers.c |
test_bintree.c |
Aufgabenpakete im Detail
Flo: Stack, Zahlenlogik & zugehörige Tests
- Stack (
stack.h,stack.c)- Definition von
struct StackNode(void *data,struct StackNode *next) instack.h. - Implementierung von
push,pop,topundclearStack(popgibt nur den Knoten selbst frei, nicht dendata-Pointer).
- Definition von
- Zahlen & Sortierung (
numbers.c&main.c)createNumbers: Array der Größelenallokieren,len - 1eindeutige Zufallszahlen (1bis2 * len) mithilfe des Binärbaums (addToTree) generieren, einen zufälligen Eintrag duplizieren und den Baum anschließend mitclearTreefreigeben.getDuplicate: Arbeitskopie desconst-Arrays anlegen, mitqsortsortieren (Überlauf-sichere Vergleichsfunktion(va > vb) - (va < vb)), benachbarte Elemente vergleichen, Kopie freigeben und das Duplikat zurückgeben.- Ergänzen von
free(numbers);am Programmende inmain.c, um Speicherlecks zu vermeiden.
- Unit-Tests (
test_stack.c,test_numbers.c)test_stack.c:top/popauf leerem Stack (NULL), LIFO-Reihenfolge bei mehrerenpush/pop-Operationen,clearStackauf leerem und gefülltem Stack.test_numbers.c:createNumbersauf Fehlerfälle (len == 0), Wertebereich (1bis2 * len) und exakt ein Duplikat prüfen;getDuplicatemit Test-Arrays (Duplikat vorne, mittig, hinten),NULL/len < 2sowie Unveränderlichkeit des Eingabearrays testen.
Jamin: Generischer Binärbaum & zugehörige Tests
- Binärer Suchbaum (
bintree.c)addToTree: Rekursives Einfügen; beim Erstellen eines neuen Knotens Speicher mitmalloc(dataSize)reservieren, Inhalt viamemcpykopieren undcompareFctsowieisDuplicatekorrekt behandeln.treeSize: Rekursives Zählen aller Knoten (0beiroot == NULL).clearTree: Rekursives Freigeben in Post-Order (left,right,node->data,node).nextTreeData: Iterative In-Order-Traversierung mitstatic StackNode *stack = NULL;(analog zustrtok). Beiroot != NULLalten Stack leeren undrootsowie alle linken Kindknoten pushen; beiroot == NULLobersten Knoten poppen, dessen rechten Teilbaum inkl. aller linken Kinder pushen unddatazurückgeben.
- Unit-Tests (
test_bintree.c)addToTree: Einfügen in leeren Baum, Sortierreihenfolge, Verhalten mitisDuplicate == NULLvs.isDuplicate != NULL(Flag-Werte0und1).treeSize: Überprüfung für leeren (0) und gefüllten Baum.nextTreeData: Sortierte In-Order-Ausgabe,NULL-Rückgabe am Ende sowie Reset bei Übergabe eines neuen Baums.clearTree: Aufruf mitNULLund gefülltem Baum (inkl. Prüfung auf Speicherlecks).
Zeitplan & Workflow
- Initialisierung: Flo legt
struct StackNodeinstack.hfest und pusht die Datei, damit Jamin ohne Blockade mitbintree.cstarten kann. - Parallele Entwicklung:
- Flo implementiert
stack.c,test_stack.c,numbers.cundtest_numbers.c. - Jamin implementiert
bintree.cundtest_bintree.c.
- Flo implementiert
- Integration & Abnahme:
- Zusammenführen aller Module auf
main. - Kompilieren ohne Compiler-Warnungen und Ausführen aller Unit-Tests.
- Speicherleck-Prüfung (z. B. mit Valgrind oder AddressSanitizer).
- Zusammenführen aller Module auf
Kompilieren & Ausführen
# Vollständiges Spiel bauen und starten
make doble
./doble <player_name>
# Unit-Tests bauen und ausführen (je nach Makefile-Targets)
make test_stack && ./test_stack
make test_numbers && ./test_numbers
make test_bintree && ./test_bintree