Zápočet 27.1.2016 (10:00)

befelemepeseveze at 2016-01-27 18:57:57

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.