Neprihlásený používateľ |

Špecifikácia zadania

Cieľom zadania je napísať jednoduchý textový procesor v jazyku C, ktorý bude spracovávať vstupný text podľa zadaných command-line argumentov. Hlavné úlohy programu sú rozpoznať command-line argumenty, ošetriť chybové situácie, načítať text, odstrániť určité skupiny znakov, vyhľadať a nahradiť slová v riadkoch a vypísať výsledky spracovania textu. V zadaní si precvičíte znaky, reťazce, pointre a spracovanie command-line argumentov programu.

Textový procesor

Program bude ovládaný pomocou terminálu a command-line argumentov. Vykoná nasledovnú postupnosť krokov. Poradie krokov je pevne dané a nesmie sa meniť.

  1. Spracovanie command-line argumentov pomocou knižničnej funkcie getopt.
  2. Detekcia potenciálnych chybových situácií.
  3. Načítanie vstupného textu.
  4. Vykonanie vstupných operácií. Sem patrí predvolená vstupná operácia, odstránenie číslic a odstránenie interpunkčných znakov.
  5. Hľadanie a nahrádzanie slov. Sem patrí case-sensitive a case-insensitive režim nahrádzania.
  6. Vykonanie výstupných operácií. Sem patrí predvolená výstupná operácia a split view režim zobrazenia výsledkov.

Obrázok 1: Diagram funkcionality aplikácie (Zobraziť veľký obrázok)

Command-line argumenty

Aplikácia bude riadená CMD (command-line) argumentmi, ktoré používateľ zadá pri spustení v termináli. CMD argumenty slúžia na ovládanie správania sa programu z miesta jeho spustenia. Každý CMD argument je reprezentovaný ako C reťazec.

Všetky CMD argumenty sú k dispozícii prostredníctvom poľa reťazcov argv, ktoré má dĺžku argc prvkov. Prvok argv[0] obsahuje cestu k spúšťanému programu. Ostatné prvky poľa argv predstavujú používateľom zadané CMD argumenty. Pole argv a jeho dĺžka argc sú parametrami hlavnej funkcie main. Technicky je argv pole reťazcov.

int main (int argc, char *argv[]){
    // your code
    return 0;
}

Na obrázku 2 vidíme príklad spustenia programu v termináli s CMD argumentmi. Treba si uvedomiť, že v prípade reťazca argv[3] sa jedná o jeden viac-slovný argument, nakoľko je uzavretý v úvodzovkách.


Obrázok 2: Príklad spustenia programu s CMD argumentmi

V tomto zadaní budeme rozlišovať 3 typy CMD argumentov:

  • Prepínače (z angl. options)
  • Parametre prepínačov
  • "Neprepínače" (z angl. non-options)
Prepínače

Prepínačom rozumieme CMD argument v tvare -x, kde x je ľubovoľné písmeno. Prepínače budú reprezentovať príslušné operácie spracovania načítaného textu.

Parametre prepínačov

Prepínač môže mať stanovený aj svoj parameter, napr. -p abc, kde za prepínačom -p nasleduje jeho parameter abc.

Non-options

Každý CMD argument, ktorý nepatrí ani do jednej z dvoch vyššie uvedených kategórií je považovaný za tzv. non-option argument. V prípade tohto zadania budú všetky non-option argumenty umiestnené až za všetkými prepínačmi a ich parametrami (t.j. budú zadané ako posledné).


Obrázok 3: Príklad spustenia programu s CMD argumentmi a identifikácia prepínačov, ich parametrov a non-option argumentov.

Funkcia getopt

Proces rozpoznania CMD argumentov sa dá automatizovať pomocou knižničnej funkcie getopt. Funkcia getopt taktiež odhaľuje aj situácie nesprávneho použitia prepínačov.

Táto funkcia nepatrí do štandarnej knižnice jazyka C, ale pre potreby tohto zadania ju môžete použiť. Je dostupná len v Linux prostredí (taktiež aj MinGW, Cygwin, MSYS2 a WSL). Treba do programu vložiť hlavičkový súbor unistd.h. Na obrázku 4 vidíme hlavičku funkcie getopt.


Obrázok 4: Hlavička funkcie getopt

Parameter optstring špecifikuje platné prepínače nášho programu. Ak tento reťazec začína znakom :, znamená to, že výpis všetkých chybových správ (na stderr) bude deaktivovaný. Písmená v tomto reťazci predstavujú platné prepínače. Ak je za písmenom znak :, znamená to, že prepínač vyžaduje svoj parameter. Opakovaným volaním funkcie getopt získavame písmená rozpoznaných prepínačov. Ak funkcia rozpoznala všetky platné prepínače, vráti hodnotu -1. Na obrázku 5 vidíme príklad reťazca optstring. Viac informácií sa dočítate v dokumentácii.


Obrázok 5: Príklad reťazca optstring

Načítanie textu

Po spustení programu a rozpoznaní CMD argumentov začne textový procesor načítavať text. Text je ideálne načítavať po riadkoch zo štandardného vstupu (stdin). Načítavanie skončí, keď používateľ zadá prázdny riadok. Prázdny riadok je reťazec, ktorý obsahuje len znak nového riadku \n (samozrejme je ešte korektne ukončený terminačným znakom \0).

V zadaní bude platiť, že maximálna dĺžka načítaného riadku je 1 000 znakov (znaky riadku + znak nového riadku \n). Treba použiť pole s kapacitou 1001 znakov (1 miesto navyše kvôli ukončovaciemu znaku \0). Na načítanie riadku môžete použiť knižničnú funkciu fgets. Hlavička tejto funkcie je na obrázku 6.


Obrázok 6: Hlavička funkcie fgets (viac informácií v jej dokumentácii)

V zadaní budeme v texte hľadať slová. Maximálna dĺžka slova je 20 znakov (bez ukončovacieho znaku \0).

Vstupné operácie

Tieto operácie slúžia na odstránenie určitej skupiny znakov v načítanom texte. Operácie dané prepínačom –d a –p sa môžu kombinovať. Rozlišujeme 3 typy vstupných operácií.

  • Predvolená operácia
  • Prepínač -d
  • Prepínač -p
Predvolená vstupná operácia

Po načítaní textu sa v ňom ponechajú všetky znaky. Vykoná sa, keď nie je zadaný prepínač -d ani -p.

Príklad spustenia programu a vykonanie predvolenej vstupnej operácie.
z3.exe
Vstup:
This is a sample text.
123456
.,-%$~+*-

Výstup:
This is a sample text.
123456
.,-%$~+*-
Prepínač -d

Pri zadaní tohto prepínača sa v načítanom texte odstránia číslice. Na overenie, či je znak číslicou môžeme použiť knižničnú funkciu isdigit.

Príklad spustenia programu a vykonanie prepínača -d.
z3.exe -d
Vstup:
ahoj
hello 123 world
F1u2n3n4y5
.3.3.3.
a 999 b

Výstup:
ahoj
hello  world
Funny
....
a  b
Prepínač -p

Pri zadaní tohto prepínača sa v načítanom texte odstránia interpunkčné znaky. Na overenie, či je znak interpunkčný môžeme použiť knižničnú funkciu ispunct. Interpunkčné znaky v jazyku C sú: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Príklad spustenia programu a vykonanie prepínača -p.
z3.exe -p
Vstup:
dogs & cats
123456 123456
what a world!
<html>
?a?1?5?W?

Výstup:
dogs  cats
123456 123456
what a world
html
a15W
Súčasné použitie oboch prepínačov

Prepínače môžeme použiť aj súčasne. Uvádzame príklad spustenia programu s obomi prepínačmi súčasne.

z3.exe -d -p
Vstup:
prett7y l8in45e123
.w.oo.w.
?Si74m,p---le s2tup74id+**.

Výstup:
pretty line
woow
Simple stupid

Hľadanie a nahrádzanie slov

Tieto operácie slúžia na nahradenie vyhovujúcich slov v texte iný zadaným slovom. Rozlišujeme 2 nahrádzacie režimy (nesmú sa kombinovať):

  • Case-sensitive (prepínač -r)
  • Case-insensitive (prepínač -R)
Definícia slova

Nahrádzanie prebieha po slovách. V zmysle tohto zadania budeme slovom označovať ľubovoľnú alfabetickú postupnosť znakov, ktorá je oddelená od okolitého textu ne-alfabetickými znakmi.

Na zistenie, či je znak alfabetický môžete použiť knižničnú funkciu isalpha. Každý načítaný riadok textu vieme reprezentovať ako množinu slov $W = \{w_1, w_2, w_3, ... , w_K\}$. Na obrázku 7 vidíme príklad zadaných riadkov textu a identifikované slová v nich.



Obrázok 7: Príklady identifikovaných slov v riadku

Ak sú zadané prepínače -d alebo -p, tak sa z textu najskôr odstránia všetky číslice alebo interpunkčné znaky a až následne sa v texte identifikujú slová.

Príklad spustenia programu:
z3.exe -d -p
Zadanie vstupného textu:
==;D<23o9b?r+o z7v5<6.i%t;a~z|}i. *n11a2*d z9l(4om).
Identifikované sú 4 slová: Dobro zvitazi nad zlom

Prepínač -r (case-sensitive režim)

Tento nahrádzací režim má nasledovný formát spustenia v termináli:

z3.exe -r replace_string arg1 arg2 arg3 ... argX

Vysvetlivky:

  • Reťazec replace_string je povinným parametrom prepínača -r. Pomocou tohto reťazca nahrádzame identifikované slová v riadku. Spôsob nahrádzania slova bude vysvetlený nižšie.
  • Množina nepovinných non-option argumentov $N = \{arg_1, arg_2, arg_3, ..., arg_X\}$ predstavuje tzv. case-sensitive predpony, ktoré sa použijú na určenie slov, ktoré budú nahradené pomocou reťazca replace_string.
Algoritmus nahrádzania slov

Po identifikácii všetkých slov v načítanom riadku, určíme ktoré z týchto slov budú nahradené pomocou reťazca replace_string. Všetky ostatné znaky, ktoré netvoria slová v riadku zostanú nezmenené.

Určenie slov, ktoré sa majú nahradiť sa vykoná jedných z 2 možných spôsobov:

  • Ak je množina $N$ neprázdna: pre každé jedno slovo $w_i$ v množine $W$ hľadáme jeho case-sensitive predponu v množine $N$. Ak pre skúmané slovo $w_i$ nájdeme case-sensitive predponu v množine $N$, potom dôjde k nahradeniu slova $w_i$ pomocou reťazca replace_string.
  • Ak je množina $N$ prázdna: v tomto prípade nedochádza k hľadaniu predpony. Namiesto toho sa nahradí každé jedno slovo z množiny $W$ pomocou reťazca replace_string.
Nahradenie slova

Slovo $w_i$ sa nahradí pomocou reťazca replace_string takým spôsobom, že sa postupne nahrádzajú znaky slova $w_i$ (zľava doprava) znakmi reťazca replace_string.

  • Ak je replace_string kratší ako slovo $w_i$, nahradíme len príslušnú časť slova $w_i$ (počet nahradených znakov je rovný dĺžke reťazca replace_string). Zvyšok slova ponecháme nezmenený.
  • Ak je replace_string dlhší ako slovo $w_i$, nahrádzanie prebieha len po koniec slova $w_i$.
Príklad

Na príklade nižšie máme znázornený case-sensitive režim nahradenia slov v riadku

Program spustíme príkazom:
z3.exe -r Vianoce abc ABC Abc
Zadaný riadok textu:
Abc, SLOVO_123Abcedg, dnes? ... **AbcDEFGH**
Výsledok nahradenia slov:
Via, SLOVO_123Vianoc, dnes? ... **VianoceH**

Na obrázku 8 vidíme vizualizáciu riadku po nahradení slov s farebným označením pozície nahradených slov (modrou farbou).


Obrázok 8: Vizualizácia riadku s nahradenými slovami (príklad vyššie)


Prepínač -R (case-insensitive režim)

Tento nahrádzací režim má nasledovný formát spustenia v termináli:

z3.exe -R replace_string arg1 arg2 arg3 ... argX

Tento režim funguje podobne ako case-sensitive režim nahrádzania, avšak s jedným rozdielom. Rozdiel spočíva v tom, že pri určovaní slov, ktoré majú byť nahradené, obsahuje množina $N$ tzv. case-insensitive predpony. Pri posudzovaní zhody case-insensitive predpony nezáleží na tom, či je písmeno malé alebo veľké. Proces nahrádzania písmen zostáva rovnaký ako v prípade case-sensitive režimu.

Príklad

Na príklade nižšie máme znázornený case-insensitive režim nahradenia slov v riadku

Program spustíme príkazom:
z3.exe -R "Hello world" Pr
Zadaný riadok textu:
pRosim.p?PROGRAM 9pragmaticky @@@ 123-please
Výsledok nahradenia slov:
Hello .p?Hello w 9Hello world @@@ 123-please

Na obrázku 9 vidíme vizualizáciu riadku po nahradení slov s farebným označením pozície nahradených slov (modrou farbou).


Obrázok 9: Vizualizácia riadku s nahradenými slovami (príklad vyššie)

Výstupné operácie

Tieto operácie slúžia na výpis výsledku spracovania textu. Rozlišujeme 2 výstupné operácie.

  • Predvolená výstupná operácia (ak nie je zadaný prepínač -s)
  • Prepínač –s (split view režim zobrazenia)
Predvolená výstupná operácia

Jej úlohou je vypísať celý text po spracovaní (t.j. po aplikovaní vstupných operácií a nahradení slov). Žiadne formátovanie výpisu sa nevykoná.

Prepínač –s (split view)

Výstup v tomto prípade bude rozdelený na dve časti:

  • Ľavá časť – slová textu pred vykonaním nahradenia slov (po aplikácii vstupných operácií !)
  • Pravá časť – reťazce, ktoré zo slov vznikli po nahradení.

Výpis bude mať toľko riadkov, koľko slov sa nachádza vo vstupnom texte pred vykonaním nahrádzania slov (po aplikácii vstupných operácií !). Ak k nahradeniu slova nedošlo, tak slovo vľavo aj vpravo bude rovnaké. Každý riadok bude mať vypísané svoje poradové číslo - t.j. poradové číslo riadku, v ktorom bolo dané slovo nájdené pred vykonaním nahrádzania slov. Riadky začíname číslovať od 1. Na obrázku 10 vidíme príklad spustenia programu s prepínačom –s.


Obrázok 10: Príklad split view zobrazenia

V split view režime treba dodržať formátovacie pravidlá podľa obrázku 11.


Obrázok 11: Formát výpisu v split view režime

Chybové situácie

Rozlišujeme 3 chybové situácie, ktoré sa týkajú načítavania CMD argumentov.

E1

Používateľ zadal neplatný prepínač. Písmená platných prepínačov sú d, p, r, R, s. Program vypíše na stdout hlásenie E1 a korektne skončí (return 0).

Príklad chyby E1:
z3.exe -d -e -r ahoj predpona
E2

Chýbajúci povinný parameter prepínača -r alebo -R. Používateľ spustí program s prepínačom -r alebo -R, ale nezadá jeho povinný parameter. Program vypíše na stdout hlásenie E2 a korektne skončí (return 0).

Príklad chyby E2:
z3.exe -p -d -s -r
E3

Parameter prepínača -r alebo -R nemá platnú dĺžku. Platná dĺžka je v intervale $\langle1,20\rangle$. Program vypíše na stdout hlásenie E3 a korektne skončí (return 0).

Príklady chyby E3:
z3.exe -r "" ahoj
z3.exe -R totojeprivelmidlheslovo

Hodnotenie zadania

Odovzdávací systém otestuje a ohodnotí nasledovné oblasti funkcionality vášho programu. Na získanie bodov za konkrétny testovací scenár je nutné, aby testom prešli všetky testovacie prípady v danom scenári.

Testovacie scenáre
Scenár 1
Chybové situácie E1, E2 a E3
0,5 b
Scenár 2
Spustenie bez prepínačov
0,5 b
Scenár 3
Prepínač -d
0,5 b
Scenár 4
Prepínač -p
0,5 b
Scenár 5
Prepínač -r
1,5 b
Scenár 6
Prepínač -R
2,0 b
Scenár 7
Prepínač -s
1,0 b
Scenár 8
Prepínač -s (spolu s prepínačom -r alebo -R)
1,5 b
Scenár 9
Kombinácie rôznych prepínačov
2,0 b
Súčet 10 b

Testovacie príklady

Táto sekcia obsahuje testovacie príklady pre jednotlivé scenáre.

Poznámka: ideálny spôsob testovania vášho programu je prostredníctvom presmerovania štandardného vstupu v termináli z príslušného TXT súboru, ktorý obsahuje vstupy (aby ste sa tak vyhli komplikáciám pri kopírovaní údajov a ich zadávaní pomocou klávesnice).

Zoznam testovacích scenárov:

Scenár 1 Chybové situácie E1, E2 a E3 | Priečinok s01


Scenár 2 Spustenie bez prepínačov | Priečinok s02


Scenár 3 Prepínač -d | Priečinok s03


Scenár 4 Prepínač -p | Priečinok s04


Scenár 5 Prepínač -r | Priečinok s05


Scenár 6 Prepínač -R | Priečinok s06


Scenár 7 Prepínač -s | Priečinok s07


Scenár 8 Prepínač -s (spolu s prepínačom -r alebo -R) | Priečinok s08


Scenár 9 Kombinácie rôznych prepínačov | Priečinok s09

Zdroje

Nasledujúce zdroje vám môžu pomôcť pri programovaní zadania. Odporúčame si tieto zdroje preštudovať. Na prístup k niektorým zdrojom potrebujete byť prihlásení vo vašom Google STU konte.

Prednášky

Jazyk C

Funkcie printf a scanf

Zdroje použité pri tvorbe zadania a prezentácie

Copyright © 2024, Pavol Marák, ÚIM FEI STU.
Vyrobené pomocou Django a Spectre.css.
Regulárne výrazy testujeme pomocou Regular Expression 101.
Videá prehrávame pomocou Plyr prehrávača.