Program bude ovládaný pomocou terminálu a command-line argumentov. Vykoná nasledovnú postupnosť krokov. Poradie krokov je pevne dané a nesmie sa meniť.
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.
V tomto zadaní budeme rozlišovať 3 typy CMD argumentov:
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.
Prepínač môže mať stanovený aj svoj parameter, napr. -p abc
, kde za prepínačom
-p
nasleduje jeho parameter abc
.
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é).
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
.
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.
optstring
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.
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
).
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í.
-d
-p
Po načítaní textu sa v ňom ponechajú všetky znaky.
Vykoná sa, keď nie je zadaný prepínač -d
ani -p
.
z3.exe
Vstup:
This is a sample text.
123456
.,-%$~+*-
Výstup:
This is a sample text.
123456
.,-%$~+*-
-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
.
-d
.
z3.exe -d
Vstup:
ahoj
hello 123 world
F1u2n3n4y5
.3.3.3.
a 999 b
Výstup:
ahoj
hello world
Funny
....
a b
-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ú:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
-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
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
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ť):
-r
)-R
)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.
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á.
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
-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:
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.
replace_string
.
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:
replace_string
.
replace_string
.
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
.
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ý.
replace_string
dlhší ako slovo $w_i$, nahrádzanie prebieha len po koniec
slova $w_i$.
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).
-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íkladNa 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).
Tieto operácie slúžia na výpis výsledku spracovania textu. Rozlišujeme 2 výstupné operácie.
-s
)–s
(split view režim zobrazenia)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á.
–s
(split view)Výstup v tomto prípade bude rozdelený na dve časti:
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
.
V split view režime treba dodržať formátovacie pravidlá podľa obrázku 11.
Rozlišujeme 3 chybové situácie, ktoré sa týkajú načítavania CMD argumentov.
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
).
z3.exe -d -e -r ahoj predpona
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
).
z3.exe -p -d -s -r
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
).
z3.exe -r "" ahoj
z3.exe -R totojeprivelmidlheslovo
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.
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 |
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:
-d
-p
-r
-R
-s
-s
(spolu s prepínačom -r
alebo -R
)s01
-d -u -s
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
-p -R
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
-s -d -r xxxxxxxxxxxxxxxxxxxxxxxxx
Vstup: stdin_03.txt |
Výstup: stdout_03.txt
s02
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
Vstup: stdin_03.txt |
Výstup: stdout_03.txt
-d
|
Priečinok s03
-d
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
-d
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
-d
Vstup: stdin_03.txt |
Výstup: stdout_03.txt
-p
|
Priečinok s04
-p
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
-p
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
-p
Vstup: stdin_03.txt |
Výstup: stdout_03.txt
-r
|
Priečinok s05
-r mbcGG abc Pre fiX
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
-r robotics
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
-r "More words" a Lay
Vstup: stdin_03.txt |
Výstup: stdout_03.txt
-R
|
Priečinok s06
-R jednoslovo abc
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
-R a klam prav
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
-R "a g" t
Vstup: stdin_03.txt |
Výstup: stdout_03.txt
-s
|
Priečinok s07
-s
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
-s
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
-s
(spolu s prepínačom -r
alebo -R
) |
Priečinok s08
-s -r "MEGA" anti
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
-s -R "je to ok" REP
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
s09
-d -p
Vstup: stdin_01.txt |
Výstup: stdout_01.txt
-d -s
Vstup: stdin_02.txt |
Výstup: stdout_02.txt
-d -p -r "Moj horoskop" ra zac
Vstup: stdin_03.txt |
Výstup: stdout_03.txt
-d -p -R planeta V nE sV
Vstup: stdin_04.txt |
Výstup: stdout_04.txt
-d -p -s -R "Svet je zabavny" HR S pOcita
Vstup: stdin_05.txt |
Výstup: stdout_05.txt
-p -s -r stastie fot
Vstup: stdin_06.txt |
Výstup: stdout_06.txt
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