Vypuštění komentářů
Zadání:
Napište program, který vypustí komentáře ze souboru (zdrojový nebo hlavičkový jazyka C/C++) a výsledek zapíše do jiného souboru.
Program vyřešte pomocí stavového automatu (použijte příkaz switch. K „pojmenování“ stavů použijte „textových“ hodnot enum nebo #define)
Komentáře předpokládejte v obou tvarech (tj. „/* */“ i „ // “ ).
Název vstupního i výstupního souboru je předán jako parametr při spuštění programu (parametr „dosovské“ řádky).
Při otevírání souborů otestujte, zda se otevření zdařilo
otevřené soubory zavřete
Nápověda:
příkaz switch realizuje větvení na základě celočíselné proměnné reprezentující akuální stav programu. Celočíselnou proměnnou může být kód stavu, ve kterém se nachází vyhodnocování. Podle aktuálně načteného znaku ze souboru se stav může změnit. Těmito stavy může například být:
TEXT – jsme uprostřed textu, který se kopíruje na výstup (objeví-li se lomítko, je nutno se přepnout do stavu, kdy lze očekávat komentář – lomítko se na výstup nezapíše)
LOMITKO – minulý znak bylo lomítko (podle aktuálního znaku poznáme, zda se jedná o /*, // nebo skutečně o lomítko
C_KOMENT – jsme uvnitř komentáře /*, hvězdička je potencionální konec
HVEZDICKA – je-li aktuálně lomítko, končí komentář, je-li to jiný znak, vracíme se do C_KOMENT
CPP_KOMENT – jsme uvnitř řádkového komentáře – končí koncem řádky (pak je TEXT)
…
Doporučený postup řešení:
v nastavení projektu ( command arguments) napište názvy vstupního a výstupního souboru. Používejte soubory, které nejsou součástí projektu. Mohlo by dojít ke kolizím při otevírání souborů. Jako projekt použijte prázdný bez precompiled headers.
Funkce main by měla mít parametry argc a argv. Vytiskněte je (a zkontrolujte, že mají očekávané hodnoty).
Pokuste se otevřít a zavřít vstupní a výstupní soubor. Otestujte, zda se operace povedly. (Otevření proveďte v textovém modu. K otevření použijte funkci fopen, k zavření fclose. Operace se povedla, pokud fopen nevrátí NULL.).
Zkuste soubor pouze překopírovat. (použijte fgetc a fputc. Obě funkce se chovají tak, že se po provedení posunou v souboru o znak. To je „ znak se pošle do linky a zmizí.“)
Naprogramujte stavový automat.
Pro pokročilé
Doplňte program tak, aby řešil i:
- situaci, kdy se znak pro komentář objeví v řetězci. Např.: printf(“Komentář se píše takto: /* tady je komentář */ nebo takto: // tady je \“řádkový\“ komentář “);
- situaci, kdy by se ve výstupu nemělo objevit více prázdných řádků za sebou (např. když vypouštíme 10 jednořádkových komentářů za sebou). Lze zkusit i jako druhý program a následné zřetězení pomocí roury (neboli pipe). (příklad volání kom_destr.exe <zdroje.cpp | radky_destr.exe >zdroje_vyst.cpp)
Na adrese desatomat.cz je možné shlédnout vytvoření stavového automatu na základě zapsané gramatiky. Po kontrole stavového automatu je automaticky vygenerován i zdrojový kód C++, který tento automat realizuje.
Poslední změna: 2013-10-26