Zadání

Vaším úkolem je:

Splnění zadání ověříte pomocí testovacího frameworku, který provádí:

Předepsané rozhraní

Vaše implementace musí naplnit zde popsané veřejné rozhraní (můžete však publikovat i další funkce). Testovací aplikace používá pouze typ timetable a níže jmenované funkce.

Rozhraní můžete realizovat libovolným způsobem, pro který bude testovací framework přeložitelný a funkční. Do testovacího frameworku přitom nezasahujte (můžete si samozřejmě napsat další testy).

Předepsané rozhraní vynucuje určitou základní strukturu reprezentace jízdního řádu, ponechává však volnost ve volbě druhu vnitřních kontejnerů a neurčuje formát jednotlivých objektů.

Reprezentace času

Čas je reprezentován číselným typem packed_time jako minuty v daném dni. Ke konverzi z a na čitelnou formu jsou určeny funkce packed_time pack_time(int hh, int mm), int hours(packed_time tm) a int minutes(packed_time tm). (V CPP File Icon kostře ke stažení jsou tyto funkce již implementovány.)

Předepsané typy

Ostatní typy používané v předepsaném rozhraní nemají předepsaná jména ani obsah.

Modifikující funkce

Funkce k procházení struktury jízdního řádu

Všechny tyto funkce dostávají jako první parametr odkaz na objekt. Tímto objektem je buďto celý jízdní řád, nebo vnitřní objekt reprezentující nějaký prvek jízdního řádu. Vnitřní objekty jsou součástí datové struktury jízdního řádu a testovací aplikace s nimi manipuluje pouze prostřednictvím odkazů na ně. Obsah vnitřních objektů je zpřístupněn pouze nepřímo funkcemi popsanými v této sekci. Objekty těchto typů se nesmějí vyskytovat mimo datovou strukturu jízdního řádu.

Jména typů vnitřních objektů ani jejich obsah není předepsán. (V CPP File Icon kostře ke stažení jsou jména některých typů navržena tak, aby bylo možno přeložit alespoň hlavičky předepsaných funkcí.)

Některé z těchto funkcí vracejí odkazy na kontejnery, obsahující výše zmíněné objekty. Procházení těchto kontejnerů je nejčastější způsob, kterým se získávají odkazy na další objekty. Kontejnery mohou být libovolných typů, vnějším uživatelům je povoleno používat pouze základní funkce begin, end a size.

Některé z těchto funkcí vracejí odkazy přímo na jednotlivé prvky těchto kontejnerů, a to buďto ve formě iterátoru (pak je možné procházet sousedy prvků až po začátky či konce těchto kontejnerů), nebo ve formě reference (pak je procházení sousedů nemožné).

Srozumitelný příklad použití těchto funkcí naleznete ve funkci dump_stopwise v testovacím frameworku CPP File Icon dump.hpp

Celý jízdní řád

Zastávka

Nástupiště

Linka na nástupišti

Tento objekt reprezentuje dvojici linka-nástupiště, nikoliv samotnou linku.

Odjezd linky od nástupiště

Tento objekt odpovídá trojici nástupiště-linka-jízda a určuje tedy čas průjezdu linky nástupištěm pro danou jízdu.

Funkce splňují invariant departure_time(* position_in_trip(rd)) == departure_time(rd). Jinými slovy, každý odjezd je zaznamenán dvakrát, jednou v kontejneru odjezdů příslušné linky od příslušného nástupiště, jednou v kontejneru odjezdů příslušné jízdy.

Jízda

Poznámka: Časy odjezdů v kontejneru departures(tr) nemusí být uspořádány vzestupně, pokud jízda překračuje půlnoc. Kromě toho některé jízdy stíhají projet dvěma nástupišti v téže minutě.

Poznámka: Z tohoto objektu nelze určit, o jakou linku se jedná. Pojem linka je chápán pouze jako označení tramvaje v okamžiku průjezdu daným nástupištěm, čímž je umožněna změna čísla linky během jízdy.

Odjezd během jízdy

Poznámka: Z tohoto objektu nelze přímo určit, z kterého nástupiště a pod kterým číslem linky se odjezd koná, přestože tato informace v datech je zaznamenána. Důvodem je zjednodušení rozhraní i implementace.

Aplikační funkce

Soubory ke stažení

Testovací data

Jízdní řád je reprezentován jedním textovým souborem ve formátu tab-separated-values. Význam jednotlivých polí je následující:

Kostra řešení

Kostru je možné s testovacím frameworkem přeložit, nikoliv však slinkovat, protože chybí implementace většiny funkcí. Vašim úkolem je doplnit tyto implementace, k tomu však budete muset pozměnit nebo doplnit i jiné části kostry.

Testovací framework

Testy v recodexu nyní probíhají s těmito parametry:

Projekt pro Visual Studio 2019

Stahujte pomocí "save link as" v prohlížeči.

Vzorové výstupy