Zadanie 2

Prihlásenie sa na Semestrálne Zadanie 2

Important

Pre prihlásenie sa na zadanie 2 je potrebné mať aktívny GitHub účet. Účet je bezplatný. Pre vypracovanie môžte použiť existujúci GitHub účet.

Zadanie je distribuované aj odovzdané pomocou platformy GitHub, modulu Classroom. Pre prihlásenie sa na vypracovanie zadania sa prihláste svojim účtom na platformu GitHub a následne kliknite na tento odkaz:

https://classroom.github.com/a/S2BbF3Ve

Po potvrdení sa vám vytvorí súkromný repozitár s nastaveným projektom a so znením zadania v súbore README.md (znenie zadanie sa nachádza aj nižšie ⬇). Pozorne si zadanie prečítajte pre začatím vypracovania.

Vypracujte zadanie samostatne a podľa svojich najlepších vedomostí. Implementáciu môžte priebežne pushovať do repozitára až do uplynutia termínu, ktorý je uvedený v zadaní a bude oznámený aj v MS Teams.

Pri každej aktualizácii kódu je spustená GitHub automatizácia, ktorý overí, či váš kód je skompilovateľný a spustiteľný.

V prípade otázok, problémov alebo akejkoľvek potreby konzultácií môžte kontaktovať cvičiaceho na MS Teams alebo emailom.

Video s inštrukciami

Video je síce pôvodne pre zadaní 1, ale princíp je rovnaký aj pri tomto zadaní 2.


Semestrálne zadanie 2 - Správa zoznamu úloh - TODO List

Cieľom zadania je implementovať jednoduchú aplikáciu manažéra úloh, tzv. TODO list pomocou jazyka C++ (štandard C++17).

Program má pracovať so zoznamom úloh, ktorý pomocou zadaných príkazov bude upravovať. Zoznam úloh je ukladaný na disk do súboru. Program ponúka niekoľko príkazov a možností pre manipuláciu s úlohami. Program neponúka používateľské menu, spracuje zadaný príkaz a skončí.

Úloha (Task)

Úloha je objekt, ktorý má nasledovné atribúty:

  • názov - Názov úlohy. Typ string. Názov úlohy je unikátny v rámci celého programu. Viaceré funkcionality vyhľadajú úlohu podľa názvu.
  • popis - Dlhší popis o obsahu úlohy. Typ string.
  • priorita - Priorita označujúca dôležitosť úlohy. Typ int. Nadobúda hodnoty kladných čísel (t.j. N > 0). Čím nižšie číslo tím je úloha dôležitejšia (priorita 1 == najdôležitejšia úloha).
  • termín dokončenia - Dátum kedy má byť úloha dokončená. Typ string, formát ISO 8601 yyyy-mm-dd (napr. 2025-04-13).
  • status dokončenia - Označenie či je úloha dokončená alebo nie. Typ bool. Hodnota true znamená, že úloha je dokončená.

Funkcionalita

Aplikácia má poskytovať niekoľko príkazov, ktoré sú zadané ako argument spustenia programu spolu s ďalšími pomenovanými parametrami (po anglicky options). Program poskytuje nasledovné funkcionality:

  • pridanie novej úlohy
  • vymazanie úlohy
  • označenie úlohy za dokončenú
  • vypísanie úloh pre určitý dátum
  • vypísanie dostupnej funkcionality (tzv. help text)

Pridanie úlohy

zadanie2 add <-t --title názov_úlohy> [--desc popis_úlohy] [-p --priority priorita_úlohy] [-d --deadline termín_úlohy]

Ak je ako prvý argument programu uvedený príkaz add je vytvorená nová úloha podľa zadaných parametrov:

  • -t alebo --title arg : Definovanie názvu novej úlohy. Argument za parametrom je hodnota názvu úlohy. Tento parameter je povinný.
  • --desc arg : Definovanie popisu novej úlohy. Argument za parametrom je hodnota popisu úlohy. Tento parameter je voliteľný a nemá defaultnú hodnotu.
  • -p alebo --priority arg : Definovanie priority úlohy. Argument za parametrom je celočíselná hodnota priority úlohy. Tento parameter je voliteľný a defaultná hodnota je 5.
  • -d alebo --deadline arg : Definovanie termínu splnenia úlohy. Argument za parametrom je reťazec dátumu vo formáte ISO 8601 t.j. yyyy-mm-dd (ROK-MESIAC-DEŇ = 2025-04-14). Tento parameter je voliteľný a defaultná hodnota je dnešný dátum.

Ak nie je zadaný názov úlohy, program nič neurobí.

Vymazanie úlohy

zadanie2 remove <-t --title názov_úlohy>

Ak je ako prvý argument uvedený príkaz remove podľa hodnoty v parametri --title je vymazaná úloha, ktorá je definovaná uvedeným názvom. Príkaz pracuje s parametrom:

  • -t alebo --title arg : Definovanie názvu úlohy na vymazanie. Argument za parametrom je hodnota názvu úlohy. Tento parameter je povinný.

Ak názov úlohy nie je zadaný alebo úloha so zadaným názvom neexistuje, program vypíše adekvátnu hlášku a nič neurobí. Ak je úloha so zadaným názvom nájdená, je vymazaná zo všetkých štruktúr programu.

Označenie úlohy za dokončenú

zadanie2 done <-t --title názov_úlohy>

Ak je ako prvý argument uvedený príkaz done podľa hodnoty v parametri --title je úloha, ktorá je definovaná uvedeným názvom, označená ako dokončená (atribút statusu dokončenia nastavený na true). Príkaz pracuje s parametrom:

  • -t alebo --title arg : Definovanie názvu úlohy na dokončenie. Argument za parametrom je hodnota názvu úlohy. Tento parameter je povinný.

Ak názov úlohy nie je zadaný alebo úloha so zadaným názvom neexistuje, program vypíše adekvátnu hlášku a nič neurobí. Ak je úloha so zadaným názvom nájdená, úloha je označená ako dokončená.

Vypísanie úloh pre určitý dátum

zadanie2 list [-d --deadline termín_úlohy] [--done]

zadanie2 list [--today] [--done]

zadanie2 list [--tomorrow] [--done]

Ak je ako prvý argument uvedený príkaz list sú vypísané úlohy podľa zadaných kritérií na základe uvedených parametrov:

  • -d alebo --deadline arg : Definovanie termínu úlohy. Argument za parametrom je reťazec dátumu vo formáte ISO 8601 t.j. yyyy-mm-dd (ROK-MESIAC-DEŇ = 2025-04-14). Tento parameter je voliteľný.
  • --done : Ak je tento parameter prítomný sú vypísané úlohy označené ako dokončené. Ak tento parameter nie je uvedený sú vypísané úlohy, ktoré ešte nie sú dokončené.
  • --today : Ak je tento parameter uvedený, sú vypísané úlohy pre dnešný dátum. Tento parameter nie je možné kombinovať s parametrom --deadline. Ak sú uvedené oba, iba parameter --deadline je vyhodnotený.
  • --tomorrow : Ak je tento parameter uvedený, sú vypísané úlohy pre nasledujúci deň. Tento parameter nie je možné kombinovať s parametrom --deadline. Ak sú uvedené oba, iba parameter --deadline je vyhodnotený.

V prípade ak nie sú zadané žiadne parametre sú vypísané všetky úlohy, ktoré má program načítané.

Vypísanie dostupnej funkcionality

zadanie2 [-h --help]

Program vypíše tzv. help text, čo je zrozumiteľný výpis všetkých argumentov a parametrov programu a ich popis ako ich použiť. Help text je aktivovaný cez zadaný parameter --help alebo skrátene -h.

Ak pri implementácií použijete knižnicu cxxopts, ktorá je zahrnutá v tomto projekte, tak vytvorený objekt cxxopts::Options obsahuje metódu string help(), ktorá vráti naformátovaný string tzv. help textu, ktorý stačí vypísať.

Implementácia

V rámci implementácie programu môžte použiť všetky štandardné knižnice a funkcie jazyka C++, v štandarde C++17. Pre implementáciu štruktúr môžte použiť knižnice STL (ako vector, queue, map a ďalšie).

Knižnice

Je odporúčané použiť knižnice a funkcie, ktoré sú zahrnuté v tomto projekte. Pre ich použitie ich stačí zahrnúť do Vášho zdrojového kódu: #include "cxxopts.hpp" a #include "utils.hpp" . Knižnice sú automaticky zahrnuté pri kompilácii vďaka cmake konfigurácií. Zdrojové kódy knižníc sa nachádzajú v priečinku include.

Pre implementáciu spracovania argumentu a parametrov je odporúčané použiť knižnicu cxxopts https://github.com/jarro2783/cxxopts, ktorá je už zahrnutá v tomto projekte.

Súbor tasks.db

Program má pri svojom spustení načítať súbor tasks.db. Ide o textový súbor, kde sú uložené všetky úlohy s ktorými má program pracovať. Ak súbor pri spustený neexistuje je automaticky vytvorený v priečinku, kde je program spustený (t.j. relatívna cesta ./tasks.db). Pred skončením programu alebo po vykonaní zmeny úloh sú úlohy ihneď uložené do súboru tasks.db pre perzistentné uloženie úloh pre ďalšie spustenie programu. Súbor má nasledovný formát pre uloženie úloh:

názov_úlohy|popis_úlohy|priorita|termín_úlohy|status_dokončenia_úlohy (0 = nedokončená, 1 = dokončená)

Jednotlivé atribúty úlohy sú oddelené symbolom ’ | ‘ (anglicky pipe). Status dokončenia úlohy je vyjadrený číslom 0 pre nedokončenú úlohu a číslom 1 pre dokončenú úlohu. Obsah súboru je pri každom uložení programom celý prepísaný aktuálnym zoznamom úloh.

Príklad súboru:

Spraviť zadanie|Treba spraviť vypracovanie na zadanie2|1|2025-04-28|0
Pozrieť si AVL strom|Mal by som sa bližšie pozrieť na AVL strom|2|2025-04-21|0
Prihlásiť sa na zadanie2||2|2025-04-14|1

AVL strom

Úlohy implementujte ako C++ triedu. Pre zoznam úloh môžte použiť ľubovoľne zvolený STL kontajner či inú štruktúru, ktorú uznáte za vhodnú pri zadanej funkcionalite. V rámci programu implementujte vlastný AVL strom (samo-vyvažovací vyhľadávací strom), ktorý má predstavovať index úloh podľa termínu úlohy, t.j. podľa stringu vo formáte dátumu. Pre porovnanie uzlov stromu použite funkciu int std:strcmp(const char *str1, const char *str2). V rámci uzla stromu má byť zoznam/vektor na referencie/pointre úloh, ktoré pripadajú pre daný dátum. Pridanie novej úlohy má pridať aj pointer na túto úloh do stromu pre daný dátum a tak isto pri vymazaní úlohy má odstrániť pointer na úlohu zo stromu. Viac o AVL strome sa môžte dozvedieť tu:

Zdrojové súbory

Implementácia môže byť umiestnená v jednom alebo viacerých zdrojových .cpp súboroch. Program musí byť spúšťaný z main súboru, src/main.cpp. V prípade rozdelenie kódu do viacerých súborov, nezabudnite pridať tieto zdrojové súbory do príkazu add_executable v rámci súboru src/CMakeLists.txt aby boli skompilované s celým programom.

Git

Pre kontrolu kompilácie je v repozitáry nastavená automatizácia cez GitHub pipeline. Pipeline sa spustí automaticky pre každý git push do vetvy main. GitHub pipeline sa pokúsi kód v repozitáry z posledného commitu skompilovať a následne spustiť. Kontrola spustenia programu je voči výpisu tzv. help textu, t.j. je spustený príkaz bin/zadanie2 --help. Pipeline je možné spustiť ľubovolný počet krát. Spustenie pipeline je možné vidieť v záložke “Actions” vo vašom repozitáry vypracovania zadania.

Hodnotenie

Zadanie je ohodnotené 20 bodmi. Odovzdanný program musí byť skompilovateľný (kompilátorom GCC, resp. G++) a spustiteľný, inak je hodnotený 0 bodmi. Pri vypracovaní zadania sa kontroluje originalita vypracovaní a všetky vypracovania so zhodou vyššou ako 70% sú hodnotené 0 bodmi. Hodnotený bude iba posledný commit vo vašom repozitáry zadania, ktorý bol urobený do termínu odovzdania. Vypracovanie bude podrobené automatizovaným testom, ktoré budú prevolávať program s definovanými parametrami a kontrolovať obsah výstupného súboru programu tasks.db. Je teda veľmi dôležité dodržať špecifikáciu vstupov a parametrov v sekcií Funkcionalita a dodržať formát súboru tasks.db. Vypracovanie bude hodnotené aj ručne. Pri hodnotení vypracovania sa bude prihliadať na:

  • práca so štrutkúrami
  • využitie STL knižníc
  • implementácia AVL stromu
  • práca s pamäťou (alokácia a uvoľnenie pamäte)
  • využitie tried (použitie princípov enkapsulácie)
  • využitie podmienok/control flow (if, if-else a pod.)
  • korektnosť kódu
  • prezentácia údajov používateľovi

Odovzdanie

Po prihlásení sa na zadanie 2 cez GitHub Classroom vám je automaticky vytvorená kópia repozitára, ktorý bude nastavený ako privátny pre vás na vypracovanie (t.j. máte povolený commit a push do repozitára). Skontrolujte si, či sa váš repozitár nachádza pod skupinou Interes-Group, inak vyučujúci nemajú prístup ku vášmu repozitáru a zadanie sa nepovažuje za odovzdané. Ak sa vám repozitár nevytvorí ihneď kontaktuje vyučujúceho na MS Teams alebo na univerzitnom emaily. Je prísne zakázané dávať prístup k vášmu repozitáru inému študentovi, alebo osobe, ktorá nie je vyučujúci. V repozitáry by sa mali vytvoriť dve vetvy main a feedback a vytvorí sa tzv. pull request z vetvy main do vetvy feedback. Váš kód pushujte do vetvy main. Hodnotenie vypracovania, ako aj komentár ku kódu, uvidíte v danom pull requeste. Ak sa vám vetva feedback alebo pull request nevytvorí ihneď kontaktuje vyučujúceho na MS Teams alebo na univerzitnom emaily.

V repozitáry upravujte iba súbory pod priečinkom src. Ostatné súbory je zakázané upravovať, predovšetkým súbory pre kompiláciu, súbory obsahujúce github pipeline-y (.github) a súbory obsahujúce automatizované testy (tests). Pri zmene týchto súborov môže byť vypracovanie ohodnotené 0 bodmi.

Vypracovanie zadania priebežne commitujte/pushujte do repozitára vytvoreného GitHubom pre toto zadanie. Váš kód commitujte/pushujte do vetvy main. Hodnotený bude posledný commit/push do termínu odovzdania vypracovania. Vypracovanie je nutné odovzdať/commitnúť/pushnúť do repozitára do 28.04.2025 23:59. Neodovzdanie je hodnotené 0 bodmi.

V prípade otázok, alebo technických problémov môžete kontaktovať vyučujúcich na MS Teams alebo na univerzitnom emaily.