Zápočet 27.1.2016 (10:00)

Základní kurs objektově orientovaného programování v C++. Třídy a objekty, zapouzdření, metody, plymorfismus. Abstraktní datové typy, přetěžování. Kontejnery, iterátory, algoritmy. Šablony, generické programování, kompilační polymorfismus. Výjimky. Bezpečné a přenositelné programování, vazby na OS.
befelemepeseveze

Zápočet 27.1.2016 (10:00)

Příspěvek od befelemepeseveze »

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 a.txt
#include "b.txt"

Kód: Vybrat vše

// soubor b.txt
#include "c.txt"

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:

Kód: Vybrat vše

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.
Odpovědět

Zpět na „NPRG041 Programování v C++“