Zkouška 12.9.2017, Topfer

Odpovědět
Karappa

Zkouška 12.9.2017, Topfer

Příspěvek od Karappa »

[Programování] Ahoj. Píšu sem zadání dnešního dlouhého příkladu z programka. Pokud někdo ví jak to správně vyřešit, prosím podělte se s námi.
K pochopení zadání je třeba nejdříve vysvětlit co to je makro. Na vstupu máme text, který obsahuje makra. Makro je něco jako procedura, akorát v textu, místo v kódu. V textu je vymezen speciální znak který značí, že se bude něco dít, ten znak byl sice něco jiného, ale @ se mi dobře píše na klávesnici tak budu používat @. Za znakem @ může následovat buď MACRO "název makra" nebo ENDM, nebo něco jinýho. Pokud z za znakem @ následuje MACRO "název makra" tak to značí začátek definice makra. @ENDM značí konec definice makra. Teď co se s těmi makry dělá. Zkrátka pokud je v textu někde napsáno @Bla, znamená to že @Bla máme smazat a místo toho tam napsat definici makra s názvem @Bla. To je vlastně co program má dělat. Na vstupu dostane text, ve kterém můžou být zadefinována a použita makra a výstupu vyhodí soubor, vekterém jsou použitá makra nahrazena jejich definicemi. Přičemž ty definice se musí smazat. Je to možná trošku těžší na pochopení, tak raději uvedu příklad:
Vstup:
asdfg
@MACRO ABC
123
e
@ENDM
ijk
@ABC
haha
Výstup:
asdfg
ijk
123
e
haha

Čili definice maker jsou smazány a kde mají být použita makra tam je použijeme.

Nyní komplikace a pravidla. V textu mohou být použita pouze makra, která jsou PŘED použitím definována. Makra mohou být definována vícektrát. V tom případě rozhoduje poeslední definice, která byla použita před daným použitím. To znamená, že při různých použití stejného makra se můžou stát různě věci (pokud ho mezi těmi použitími předefinuju). Navíc uprostřed makra může být použité jiné, už zadefinované makro. Například vstup:
abc
@MACRO A
456
@ENDM
@MACRO B
789
@A
@EDNM
@B

je naprosto legitimní a měl by vyústit ve výstup:
abc
789
456

Navíc dokonce můžu v makru definovat jiné makro a pak v rámci toho makra tu definici používat. Pozor ale, pokud definuji v textu makro A a v něm pak definuji makro B, pak makro B nemůžu použít v hlavním textu. To se ale změní pokud použiji makro A. Pokud totiž někde v textu použiji makro A, pak vlastně do textu napíšu definici makra A. Ale v definici makra A je už definice makra B. Tedy od toho bodu dál v textu již může být použito makro B. Tohle je asi ta nejdivnější část, tak se pokusím uvést názorný příklad.
Vstup:
abc
@MACRO A
123
e
@MACRO B
hello
@ENDM
@B
@ENDM
blabla
@B
@A

je nelegitmní, protože chci použít makro B předtím, než ho definuji (je definováno pouze v rámci makra A). Ale Vstup:
abc
@MACRO A
123
e
@MACRO B
hello
@ENDM
@B
@ENDM
blabla
@A
@B
je už legitmní protože před použítím makra B, použiju makro A a tedy vlastně do textu napíšu definici makra B.
Výstup:
abc
123
e
blabla
hello
hello

Doufám že jsem to pro ty, kteří tam nebyli a zajímá je to, vysvětlil dostatečně.

EDIT: Hodně ho zajímalo řešení případných chybných vstupu. Čili věci jako použití nedefinovaného makra a tak. Porgram to musel umět ošetřit tak, aby nespadl a ideálně aby i napsal co se stalo za chybu. Těch chyb tam totiž mohlo být více, než jen použití nedefinovaného makra. Třeba v tom příkladě, co jsem udával jako nelegitmní vstup by asi ideální zpráva uživateli byla "Použil jste makro, které není definováno v hlavním textu, ale pouze v jiném makru" místo "Použil jste nedefinované makro". Jsou asi možné i další různé chyby, ale mě nic nenapadá a přijít na ně bylo součástí řešení.
Odpovědět

Zpět na „Programování 2“