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

  1. Osvojiť si problematiku dynamických štruktúrovaných údajov.
  2. 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 adresy http://it4kt.cnl.sk/c/pvjc/2018/download/todo.h.

Ú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:

Ú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á:

Funkcia pre vytvorenie úlohy má dva parametre:

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:

Nová úloha sa vždy pridá na koniec zoznamu. Nezabudnite však ošetriť prípady, keď:

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

{.step}

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:

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:

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:

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

  1. Vytvorte pomocnú funkciu is_active(), ktorá overí, či sa úloha stále rieši (je aktívna). Funkcia vracia hodnotu typu bool. Ak však referencia na úlohu v parametri funkcie je NULL, funkcia vráti automaticky hodnotu false. Funkcia vráti hodnotu true v prípade, ak je člen úlohy active nastavený na hodnotu true.

  2. Vytvorte pomocnú funkciu is_completed(), ktorá overí, či je už úloha hotová (neaktívna). Funkcia vráti hodnotu true v prípade, ak je člen úlohy active nastavený na hodnotu false.

  3. Vytvorte pomocnú funkciu make_task_active(), ktorá nastaví úlohu na aktívnu.
  4. Vytvorte pomocnú funkciu make_task_inactive(), ktorá nastaví úlohu na neaktívnu.

Additional Resources

  1. Prednáška č. 7