# Zápočet 27.1.2016 (10:00)

<{ForumPost(poster="befelemepeseveze", timestamp=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.

<{/ForumPost}>

