Todo List
Práca so spojkovým zoznamom a základnými CRUD operáciami nad ním.
About
Aj vy zvyknete zabúdať? Neviem, ako vy, ale čo si nezapíšem, tak o tom veľmi neviem. V rámci tejto úlohy teda vytvoríte jednoduchú implementáciu todolist-u v jazyku C.
Objectives
- Osvojiť si problematiku dynamických štruktúrovaných údajov.
- Naučiť sa vytvárať a prehľadávať spájané zoznamy.
Content
Warmup
Začneme prípravou projektu.
Úloha
Stiahnite si do priečinku, ktorý bude koreňovým priečinkom vášho
projektu, hlavičkový súbor todo.h
.
Súbor si stiahnite z tejto adresy.
Úloha
Vytvorte si súbor todo.c
, ktorý bude obsahovať
implementáciu modulu todo
a main.c
, ktorý bude
obsahovať hlavnú funkciu programu main()
.
Úloha
Vytvorte súbor Makefile
, ktorý zabezpečí preklad a
vyčistenie riešenia.
Súbor Makefile
bude obsahovať tieto ciele:
all
- zabezpečí kompletný preklad riešenia a po jeho zavolaní vznikne spustiteľný súbortodo
todo.o
- preloží len modultodo
clean
- vymaže všetky spustiteľné súbory a objektové súbory z projektu
Úloha
Otestujte správnosť vami vytvorené súboru Makefile
spustením každého jedného cieľa.
New Task
Začneme vytvorením novej úlohy a pozrieme sa bližšie na to, z akých
členov sa skladá štruktúra task
, ktorá úlohu definuje.
Úloha
Implementujte funkciu create_task()
, pomocou ktorej
vytvoríte novú úlohu.
Úloha je definovaná pomocou štruktúry struct task
,
ktorej definíciu nájdete v súbore todo.h
. Každá úloha
má:
description
- reťazec opisujúci úlohuactive
- stav riešenia úlohydue_date
- dátum, do ktorého má byť úloha splnená
Funkcia pre vytvorenie úlohy má dva parametre:
description
- opis úlohydue_date
- dátum, do ktorého má byť úloha splnená
Funkcia po úspešnom vytvorení úlohy vráti referenciu na ňu. Parameter
description
je povinný, čo znamená, že ak nebude zadaný
(miesto parametra funkcia dostane prázdny reťazec alebo
NULL
), funkcia vráti NULL
.
Poznámka
Parameter due_date
nateraz nie je dôležitý. Vrátime sa
ku nemu neskôr.
Úloha
Vytvorte pomocnú funkciu print_task()
, ktorá vypíše
úlohu na obrazovku.
Funkcia bude mať jeden parameter, ktorým bude referencia na
existujúcu úlohu. Ak miesto existujúcej úlohy dostane NULL
,
nič na obrazovku nevypíše. V opačnom prípade zobrazí všetky informácie
týkajúce sa úlohy.
Poznámka
Tvar výpisu nie je nijak predpísaný. Funkcia taktiež nie je
definovaná v hlavičkovom súbore, pretože je pomocná. Zadefinujte si ju
preto rovno v súbore main.c
.
Todo List
Funkciu, ktorá vytvorí práve jednu úlohu do zoznamu úloh už máme pripravenú. V tomto kroku však vytvoríme funkciu, pomocou ktorej budeme vedieť zreťaziť úlohy do jedného zoznamu.
Úloha
Vytvorte funkciu add_task()
, ktorá pridá k existujúcemu
zoznamu úloh novú.
Funkcia má dva parametre:
first
- Referencia na prvú úlohu zoznamu. Ak zoznam zatiaľ neobsahuje žiadnu úlohu, bude jej hodnotouNULL
.task
- Referencia na novo pridávanú úlohu typustruct task
. Ak miesto existujúcej referencie funkcia dostane hodnotuNULL
, do zoznamu sa nič nepridá a zostane bez zmien.
Nová úloha sa vždy pridá na koniec zoznamu. Nezabudnite však ošetriť prípady, keď:
- je zoznam prázdny a neobsahuje žiadnu úlohu
- keď zoznam obsahuj aspoň jednu úlohu
Funkcia vždy vráti referenciu na prvý prvok zoznamu. Ak však po
zavolaní funkcie nedôjde k vytvoreniu žiadneho zoznamu, vráti hodnotu
NULL
.
Úloha
Otestujte vytvorenú funkciu vytvorením zoznamu, ktorý bude obsahovať aspoň tri položky a následne jeho vypísaním jeho obsahu od prvej až po poslednú položku.
Traverse Todo List
Síce sme posledne urobili funkciu print_task()
, ktorá
vypíše informácie o jednej úlohe, nevieme však zatiaľ vypísať celý
zoznam. Vytvoríme preto pomocnú funkciu, ktorá túto funkcionalitu
zabezpečí.
Úloha
Vytvorite pomocnú funkciu print_list()
, ktorá vypíše
celý zoznam úloh.
Funkcia má jeden parameter:
first
- referencia na prvú úlohu v zozname.
Funkcia nevracia žiadnu hodnotu. Miesto toho vypíše jednotlivé úlohy na obrazoku.
Update Existing Task
V tomto kroku vytvoríte funkciu, pomocou ktorej budete vedieť aktualizovať existujúcu úlohu v zozname úloh.
Úloha
Vytvorte funkciu update_task()
, pomocou ktorej budete
vedieť aktualizovať opis existujúcej úlohy.
Funkcia má tieto parametre:
task
- referencia na úlohu, ktorú je potrebné aktualizovať,description
- nový (resp. aktualizovaný) opis úlohy
Funkcia vráti refernciu na úlohu alebo vráti NULL
, ak
opis alebo referencia na úlohu sú NULL
.
Úloha
Overte vami vytvorenú funkciu.
Clear Completed Tasks
Po čase sa v zozname úloh začnú jednotlivé úlohy meniť na úlohy, ktoré sú už vybavené (v papierovom prevedení hotové úlohy zvykneme škrtať). V tomto kroku vytvoríte funkciu, ktorá z existujúceho zoznamu odstráni už hotové úlohy.
Úloha
Vytvorte funkciu clear_completed()
, pomocou ktorej
budete vedieť zo zoznamu odstrániť všetky už hotové úlohy.
Funkcia má jeden parameter:
first
- referencia na prvú úlohu v zozname.
Funkcia vráti referenciu na prvú úlohu v zozname alebo
NULL
, ak zoznam po vyčistení zostane prázdny alebo
referencia na first
je NULL
.
Úloha
Overte vami vytvorenú funkciu.
Additional Tasks
Vytvorte pomocnú funkciu
is_active()
, ktorá overí, či sa úloha stále rieši (je aktívna). Funkcia vracia hodnotu typubool
. Ak však referencia na úlohu v parametri funkcie jeNULL
, funkcia vráti automaticky hodnotufalse
. Funkcia vráti hodnotutrue
v prípade, ak je člen úlohyactive
nastavený na hodnotutrue
.Vytvorte pomocnú funkciu
is_completed()
, ktorá overí, či je už úloha hotová (neaktívna). Funkcia vráti hodnotutrue
v prípade, ak je člen úlohyactive
nastavený na hodnotufalse
.Vytvorte pomocnú funkciu
make_task_active()
, ktorá nastaví úlohu na aktívnu.Vytvorte pomocnú funkciu
make_task_inactive()
, ktorá nastaví úlohu na neaktívnu.