Weather Forecast

jednosmerný spájaný zoznam, práca s dátumom a časom

Motivácia

Vašou úlohou dnes bude pracovať s hodnotami pre predpoveď počasia. Vytvoríte jednosmerný spájaný (spojkový) zoznam pomocou vlastného štruktúrovaného typu a naučíte sa, ako čítať údaje spájaného zoznamu a ako pridať/vymazať záznam do/zo spájaného zoznamu. Zaujímavou výzvou bude tiež knižnica time.h, z ktorej použijete aspoň jeden údajový typ a funkciu.

Ciele

  1. Porozumieť problematike spájaných zoznamov.
  2. Osvojiť si prácu so základnými operáciami nad jednosmerným spájaným zoznamom (CRUD).
  3. Rutinne pracovať so štruktúrovaným údajovým typom a dynamickou alokáciou pamäte.
  4. Oboznámiť sa s typmi a funkciami knižnice time.h.

Postup

Krok #1: Warm Up!

Úloha 1.1

Stiahnite si kostru projektu dnešného cvičenia z tejto adresy a rozbaľte ho.
Projekt si môžete z uvedenj adresy stiahnuť pomocou nástroja wget v tvare:
wget http://it4kt.cnl.sk/c/pvjc/2017/download/forecast.zip
Projekt sa následne uloží do aktuálneho priečinku. Následne ho rozbaľte pomocou programu unzip v tvare:
unzip forecast.zip

Úloha 1.2

Oboznámte sa s projektom.
Prezrite si štruktúru projektu.

Krok #2: Inserting Data

Úloha 2.1

Vytvorte funkciu insert_data(), pomocou ktorej pripojíte nový záznam na koniec zoznamu tvoriaceho predpoveď počasia.
Samotné údaje v súbore kosice.csv sú usporiadané od najstarších po najnovšie. Údaje teda vždy pridávajte na koniec zoznamu.

Úloha 2.2

Aktualizujte funkciu load_data() tak, aby pre každý načítaný záznam zo súboru kosice.csv pripojila k zoznamu predpovede nový záznam.

Krok #3: Forecast Traversal

Úloha 3.1

Vytvorte funkciu print_data() pomocou ktorej vypíšete predpoveď počasia od najstarších údajov po najnovšie.
Samotné údaje vypíšte v nasledovnom poradí:
  1. datetime - časová pečiatka reprezentujúca dátum a čas,
  2. temperature - teplota, údaj reprezentujte so zaokrúhlením na dve desatinné miesta s postfixom C, ktorý opisuje teplotu v stupňoch celzia, výstup vypíšte na 7 miest (príklad " -1.23C")
  3. pressure - tlak, údaj reprezentujte so zaokrúhlením na dve desatinné miesta s postfixom hPa, výstup vypíšte na 10 miest (príklad "974.60hPa")
  4. humidity - vlhkosť, údaj je uvádzaný v percentách, vypíšte ho s postfixom % na 4 miesta (príklad " 99%")
  5. speed - rýchlosť vetra, údaj reprezentujte so zaokrúhlením na dve desatinné miesta s postfixom m/s, výstup vypíšte na 8 miest (príklad " 2.34m/s")
  6. wind direction - smer vetra, údaj reprezentujte ako celé číslo, vypíšte ho bez postfixu na 3 miesta (príklad "151")
Vypísaný výstup môže vyzerať nasledovne:
1458777600    0.73C 971.18hPa  72%  3.26m/s 357

Úloha 3.2

Overte správnosť svojej implementácie.

Úloha 3.3

Upravte spôsob výpisu dátumu tak, aby ste miesto časovej pečiatky v tvare celého čísla vypísali ozajstný čas v tvare DD.MM.YYYY HH:MM.
Na vyriešenie tejto úlohy sa pozrite na funkcie, ktoré ponúka knižnica time.h.

Úloha 3.4

Overte správnosť svojej implementácie.
Správnosť konverzie Unixovej časovej pečiatky si môžete overiť napr. na tomto webe alebo priamo z príkazového riadku zadaním
date -ud @1458507600
kde 1458507600 reprezentuje danú časovú pečiatku.

Krok #4: Deleting Data

Úloha 4.1

Vytvorte funkciu delete_all(), ktorá odstráni všetky položky z pamäte.

Úloha 4.2

Overte funkčnosť riešenia.

Funkciu zavolajte pri ukončovaní programu (pri stlačení voľby 0).

Správnosť otestuje použitím programu valgrind, ktorý by zobraziť počet vytvorených alokácií a dealokácií pamäte. Tento počet by mal byť rovnaký.

Krok #5: Additional Actions

Úloha 5.1

Implementujte voľbu hlavného menu programu na vypočítanie priemernej teploty za celkové obdobie.

Úloha 5.2

Implementujte voľbu hlavného menu na zistenie počasia v zadaný termín.
Pri implementácii sa používateľa najprv opýtajte na dátum v tvare "DD.MM.YYYY" a vráťte údaj o počasí predpovedaný o 12:00 v daný deň.

Doplnkové úlohy

Diskusia

Upozornenie: Do svojich príspevkov nevkladajte správne riešenia úloh a ani ich od ostatných nežiadajte! Nepoužívajte sprosté slová! Takéto príspevky budú zmazané! Riaďte sa podľa pravidiel etického kódexu.