Dnešní zápočtový test začínal zvesela, neboť se nikdo nemohl přihlásit na žádný počítač (hláška o špatném hesle). Nakonec byl ale zavolán nějaký IT expert, který problém asi za 20 minut vyřešil. Takže nakonec jsme začínali programovat jen s asi hodinovým zpožděním. To vše se neobešlo bez optimistických připomínek zkoušejícího (Mgr. Petr Malý), že "do půl jedný to určitě budeme mít hotový, protože zadání je naprosto primitivní".
Každopádně v půl jedný to neměl asi nikdo. Já jsem odevzdával cca 10 minut před začátkem dalšího zápočtového testu (ve 14:00). Přede mnou bylo asi tak 3 - 5 úspěšných. Celkovou úspěšnost netuším, ale asi nic moc.
O co šlo?
V podstatě to byla úloha, kterou by šlo za hodinku vyřešit v unixovém awkčku. Jedinej problém byl, že se to mělo udělat v C++.
Stručně: Naprogramujte preprocesor pro direktivy #include, #define, #ifdef (#elifdef/#else/#end).
Méně stručně aneb co všechno to musí umět:
Parametry příkazové řádky: aplikace.exe vstupniSoubor.txt vystupniSoubor.txt
Parametry maker:
#define makro(arg1,arg2,arg3) Parametry makra byly arg1, arg2 a arg3. Takto se makro pouzije: $makro(jedna,dva,tri)
Výstup:
Takto se makro pouzije: Parametry makra byly jedna, dva a tri.
Detekce zacyklení (musí skončit chybovou hláškou):
// soubor a.txt #include "b.txt" // soubor b.txt #include "c.txt" // soubor c.txt #include "a.txt" <-- CYKLUS! Musí být odhalen!
Podmíněné bloky:
#define C #ifdef A#include "a.txt"A je definovano. #elifdef B#include "b.txt"B je definovano. #else#define DA ani B nebylo definovano. #end #ifdef DD je definovano. #end
Výstup:
A ani B nebylo definovano.D je definovano.
Makro v makru:
#define makro1 $mak #define makro2 ro3 #define makro3 Ahoj! Jak se mas? $makro1$makro2
Výstup:
Ahoj! Jak se mas?
Další specifikace & povolená zjednodušení:
V názvu makra (definice) mohou být jen alfanumerické znaky (dokonce jsme to mohli dělat i bez čísel, ale to bylo asi zbytečné zjednodušení).
Chyby na vstupu (kromě zacyklení) nebylo třeba nějak extra řešit (něco jako volání makra se špatným počtem parametrů se nějak neřešilo).
Mezi výrazem #define a názvem makra, stejně tak mezi názvem makra a samotným "rozvinutím" může být libovolný počet bílých znaků (kromě newlinu).
Samotné "rozvinutí" makra je nutné zachovat tak, jak je (tj. vč. případných znaků tabulátoru, mezer apod. - to je vcelku logické, jinak by nešly do maker dávat mezery).
Makro uvnitř makra se nesmí rozvinout přímo v definici, ale až při použití.
Je povoleno (a je to i nutné) procházet vstupní soubor vícekrát.