Konsolowa aplikacja do powtórek materiału napisana w czystym C++. Program służy do nauki z wykorzystaniem fiszek zapisywanych w lokalnym pliku tekstowym.
Projekt wykorzystuje standard C++17. Pliki źródłowe są rozdzielone na moduły. Aby skompilować program, wykonaj w terminalu:
g++ main.cpp file_manager.cpp spaced_repetition.cpp main_menu.cpp -o wkuwator -std=c++17
./wkuwatorRepozytorium zawiera już bazowe pliki projektu (Flashcard.hpp, deck.txt). Pracujemy na odgałęzieniach (branchach), aby zachować stabilność gałęzi main.
Pobierz projekt na swój komputer:
git clone [https://github.com/callhestia/wkuwator.git](https://github.com/callhestia/wkuwator.git)
cd wkuwatorPrzed rozpoczęciem kodowania stwórz własną gałąź. Nie pracuj bezpośrednio na main:
git checkout -b feature-nazwa_twojego_modulużeby upewnić się, że jesteś na własnym branchu:
git branchPo zakończeniu pracy w danym dniu, zapisz zmiany i wyślij je na serwer:
git add .
git commit -m "Krótki opis wykonanej pracy"
git push -u origin feature-nazwa_twojego_moduluGdy Twój moduł jest gotowy, otwórz na GitHubie Pull Request z Twojego brancha do main. Kod zostanie połączony po weryfikacji przez resztę zespołu.
Baza wiedzy programu znajduje się w pliku tekstowym. Każda linijka to jedna osobna fiszka.
Dane są oddzielone separatorem | (pionowa kreska). Kolejność danych w linii musi być zgodna ze strukturą Flashcard:
Pytanie|Odpowiedź|CzasPowtórki|Trudność|Interwał|Seria
Przykład poprawnego wpisu:
Stolica Polski|Warszawa|1710252000|2.5|1|0
- Pytanie/Odpowiedź: Dowolny tekst (nie używaj znaku
|wewnątrz treści!). - CzasPowtórki: Unix Timestamp (liczba sekund od 1970 roku).
0oznacza, że fiszka jest nowa i gotowa do nauki od razu. - Trudność: Wartość zmiennoprzecinkowa (domyślnie
2.5). Wyższa wartość = łatwiejsza fiszka. - Interwał: Liczba dni do następnej powtórki.
- Seria: Liczba kolejnych poprawnych odpowiedzi.
- Otwórz plik
deck.txt. - Dopisz na końcu nową linię, zachowując format:
Pytanie|Odpowiedź|0|2.5|1|0 - Zapisz plik. Program przy starcie automatycznie załaduje nową kartę.
Każdy moduł .cpp musi zawierać nagłówek #include "Flashcard.hpp".
Główne zadanie: Zainicjowanie obiektów w pamięci na podstawie pliku deck.txt przy starcie programu oraz zapisanie wszelkich zmian (nowe fiszki, zaktualizowane daty) z powrotem do pliku na koniec sesji. Odpowiadasz również za konfigurację.
Wymagania:
- Wczytywanie pliku tekstowego linijka po linijce.
- Konwersja tekstu (rozdzielonego znakiem
|) na wektor obiektówFlashcard. - Funkcja zrzucająca aktualny stan wektora do pliku tekstowego.
- Zabezpieczenie na wypadek braku pliku
deck.txt(program ma go automatycznie utworzyć). - Obsługa zapisu/odczytu pliku
config.txt(przechowującego wybrany system nauki). - Cel poboczny/przyszłościowy: Migracja formatu zapisu z
.txtna.json(zobacz bibliotekę nlohmann/json).
Główne zadanie: Implementacja algorytmów obliczających czas kolejnej powtórki. Zarządzasz dwoma systemami weryfikacji: opartym na samoocenie (0-5) oraz na bezpośrednim wpisywaniu tekstu z tolerancją dla literówek i braku polskich znaków.
Wymagania:
- System Samooceny: Funkcja przyjmująca fiszkę i ocenę (0-5), aktualizująca interwał i mnożnik trudności (np. logika algorytmu SM-2).
- Normalizacja tekstu: Skrypt czyszczący surową odpowiedź ze zbędnych spacji oraz konwertujący duże litery na małe.
- Analiza błędów: Implementacja algorytmu odległości Levenshteina do wyliczania ilości literówek między znormalizowanymi słowami.
- System Wpisywania: Funkcja analizująca tekst względem marginesu błędu (np. 1 błąd na 5 liter). W przypadku zmieszczenia się w marginesie przyznajesz karę punktową, przy perfekcyjnej odpowiedzi – nagrodę, a przy błędzie resetujesz passę.
- Przeliczanie nowego czasu (w sekundach) i aktualizacja zmiennej
nextReviewwe flashcardzie. - Zwracanie do modułu interfejsu kodu statusu (np.
0- perfekcyjnie,1- literówka,2- błąd), aby GUI wiedziało, jak zareagować.
Główne zadanie: Budowa pętli aplikacji (menu, nauka, dodawanie, ustawienia). Pobierasz dane od użytkownika i przekazujesz je do Silnika Nauki, reagując na otrzymane statusy. Odpowiadasz również za techniczną i użytkową dokumentację projektu.
Wymagania:
- Stworzenie głównej pętli menu w konsoli.
- Obsługa podmenu "Ustawienia" do zmiany trybu nauki (Samoocena / Wpisywanie) i przekazanie wyboru do modułu Zarządzania Danymi.
- Interfejs do wprowadzania nowych fiszek z poziomu klawiatury.
- Flow Systemu Wpisywania: Wyświetlenie pytania -> Pobranie tekstu -> Przekazanie do Silnika -> Odebranie statusu -> Wyświetlenie wyniku (w przypadku literówki/błędu wyświetlenie również poprawnej odpowiedzi).
- Flow Systemu Samooceny: Wyświetlenie pytania -> Oczekiwanie na
[Enter]-> Wyświetlenie odpowiedzi -> Pobranie oceny (0-5) -> Przekazanie oceny do Silnika. - Napisanie pliku
DOKUMENTACJA.md: instrukcja obsługi, mechanika systemów weryfikacji (w tym wyrozumiałość dla literówek), cel projektu i opis struktury dla wykładowcy.
- Struktura danych: Plik
Flashcard.hppjest nienaruszalny. Każda zmiana w strukturze wymaga zgody całego zespołu. - Baza danych: Używamy wyłącznie separatora
|w plikudeck.txt. - Komunikacja: Autorzy logiki (Osoba 1 i 2) muszą dostarczyć Osobie 3 opisy funkcji i zwracanych wartości, aby interfejs poprawnie wyświetlał komunikaty.
źródła:
- algorytm do fiszek: https://github.com/thyagoluciano/sm2
- levenshtein: https://github.com/guilhermeagostinelli/levenshtein/tree/master?
- UI konsola: https://github.com/ArthurSonzogni/FTXUI
- UI alt. Python: https://textual.textualize.io