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 1.1

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 1.2

Vytvorte si súbor todo.c, ktorý bude obsahovať implementáciu modulu todo a main.c, ktorý bude obsahovať hlavnú funkciu programu main().

Úloha 1.3

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úbor todo
  • todo.o - preloží len modul todo
  • clean - vymaže všetky spustiteľné súbory a objektové súbory z projektu

Úloha 1.4

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 2.1

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 úlohu
  • active - stav riešenia úlohy
  • due_date - dátum, do ktorého má byť úloha splnená

Funkcia pre vytvorenie úlohy má dva parametre:

  • description - opis úlohy
  • due_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 2.2

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 3.1

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 hodnotou NULL.

  • task - Referencia na novo pridávanú úlohu typu struct task. Ak miesto existujúcej referencie funkcia dostane hodnotu NULL, 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 3.2

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 4.1

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 5.1

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 5.2

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 6.1

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 6.2

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