od befelemepeseveze » 27. 1. 2016 18: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:
Kód: Vybrat vše
#define makro(arg1,arg2,arg3) Parametry makra byly arg1, arg2 a arg3.
Takto se makro pouzije: $makro(jedna,dva,tri)
Výstup:
Kód: Vybrat vše
Takto se makro pouzije: Parametry makra byly jedna, dva a tri.
Detekce zacyklení (musí skončit chybovou hláškou):
Kód: Vybrat vše
// soubor c.txt
#include "a.txt" <-- CYKLUS! Musí být odhalen!
Podmíněné bloky:
Kód: Vybrat vše
#define C
#ifdef A
#include "a.txt"
A je definovano.
#elifdef B
#include "b.txt"
B je definovano.
#else
#define D
A ani B nebylo definovano.
#end
#ifdef D
D je definovano.
#end
Výstup:
Kód: Vybrat vše
A ani B nebylo definovano.
D je definovano.
Makro v makru:
Kód: Vybrat vše
#define makro1 $mak
#define makro2 ro3
#define makro3 Ahoj! Jak se mas?
$makro1$makro2
Výstup:
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.
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.
[size=130][b]O co šlo?[/b][/size]
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++.
[b]Stručně:[/b] Naprogramujte [b]preprocesor[/b] pro direktivy [color=#BF0000][b]#include[/b][/color], [color=#BF0000][b]#define[/b][/color], [color=#BF0000][b]#ifdef[/b][/color] (#elifdef/#else/#end).
[b]Méně stručně aneb co všechno to musí umět:[/b]
Parametry příkazové řádky: [b]aplikace.exe vstupniSoubor.txt vystupniSoubor.txt[/b]
[size=120][b]Parametry maker:[/b][/size]
[code]#define makro(arg1,arg2,arg3) Parametry makra byly arg1, arg2 a arg3.
Takto se makro pouzije: $makro(jedna,dva,tri)[/code]
[i]Výstup:[/i]
[code]Takto se makro pouzije: Parametry makra byly jedna, dva a tri.[/code]
[size=120][b]Detekce zacyklení[/b] (musí skončit chybovou hláškou):[/size]
[code]// soubor a.txt
#include "b.txt"[/code]
[code]// soubor b.txt
#include "c.txt"[/code]
[code]// soubor c.txt
#include "a.txt" <-- CYKLUS! Musí být odhalen![/code]
[size=120][b]Podmíněné bloky[/b]:[/size]
[code]#define C
#ifdef A
#include "a.txt"
A je definovano.
#elifdef B
#include "b.txt"
B je definovano.
#else
#define D
A ani B nebylo definovano.
#end
#ifdef D
D je definovano.
#end[/code]
[i]Výstup:[/i]
[code] A ani B nebylo definovano.
D je definovano.[/code]
[size=120][b]Makro v makru:[/b][/size]
[code]#define makro1 $mak
#define makro2 ro3
#define makro3 Ahoj! Jak se mas?
$makro1$makro2[/code]
[i]Výstup:[/i]
[code]Ahoj! Jak se mas?[/code]
[size=120][b]Další specifikace & povolená zjednodušení[/b]:[/size]
[list][*]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.[/list]