Vaša konzolová aplikácia napísaná v jazyku C bude fungovať v týchto krokoch:
Poznámka k chybovým situáciám:
Počas behu programu sa môže v rámci niektorých príkazov vyskytnúť niektorá z 3 chybových situácií, ktoré v zadaní rozlišujeme. V tomto prípade sa daný príkaz nevykoná a program vypíše predpísané chybové hlásenie na štandardný výstup (stdout) a skončí štandardným spôsobom (funkcia main vráti 0). Viac o chybových sitáciách nájdete v kapitole Chybové situácie.
Nasledovný text predstavuje základné pokyny k implementácii zadania. Hovorí o tom, aké polia a pointre budeme v zadaní používať a akým spôsobom je potrebné načítavať riadky textu.
V tomto zadaní budeme používať 2 polia: op a mem. Pole op predstavuje textový reťazec, ktorý práve spracovávame. Má kapacitu N+1 znakov, kde N=100. Toto pole dokáže reprezentovať reťazec dlhý 100 znakov (+1 rezervované miesto pre ukončovací znak \0).
Pole op predstavuje textový reťazec, ktorý práve spracovávame. Má kapacitu N+1 znakov, kde N=100. Toto pole dokáže reprezentovať reťazec dlhý 100 znakov (+1 rezervované miesto pre ukončovací znak \0). Na začiatku programu bude obsahovať prázdny reťazec, t.j. op[0]='\0'.
Predstavuje pomocnú pamäť, do ktorej môžeme počas behu programu kopírovať textový obsah z poľa op. Má rovnakú kapacitu ako pole op, t.j. N+1 znakov. Na začiatku programu taktiež obsahuje prázdny reťazec. t.j. mem[0]='\0'.
V tomto zadaní budeme používať 2 pointre: sp (skratka pre start pointer) a ep (skratka pre end pointer). Obidva pointre budú ukazovať počas behu programu na konkrétny prvok v poli op. Na začiatku programu budú obidva pointre ukazovať na začiatok poľa op.
Pointre:
Text budeme načítavať a spracovávať po riadkoch. Každý načítaný riadok predstavuje jeden príkaz textového procesora (vždy treba určiť, o aký príkaz sa jedná). Každý príkaz vykoná príslušnú operáciu. Program bude ignorovať neznáme príkazy. Program bude v cykle načítavať riadky textu pokiaľ nebude zadaný ukončovací príkaz.
Na načítavanie riadkov textu môžete využiť dodanú funkciu readline. V nasledovnom zozname uvádzame zopár technických poznámok k tejto funkcii.
#define MMAX 1000
// Popis:
// Pomocna funkcia, ktora vrati nacitany riadok bez znaku '\n'.
//
// Poznamka 1:
// Interny buffer, do ktoreho sa uklada nacitany riadok ma zamerne
// velku kapacitu (MMAX>N), aby bolo mozne nacitat spolu s prikazom
// textoveho procesora aj vstupny textovy retazec do pola op
// (prikaz in) a taktiez, aby sa mohla testovat chybova
// situacia ERR_OVERFLOW.
//
// Poznamka 2:
// V pripade prikazu in je potrebne po zavolani funkcie prislusnu cast
// vrateneho buffera skopirovat do pola 'op' (treba urobit hlboku kopiu).
// Je potrebne urobit hlboku kopiu, pretoze sa kazdym nacitanim noveho
// riadku buffer prepisuje.
//
// maximalny pocet nacitanych znakov riadku
#define MMAX 1000
const char *readline() {
// staticke pole zostava platne aj po skonceni funkcie
static char buffer[MMAX + 1] = {0};
// nacitanie riadku
fgets(buffer, sizeof(buffer), stdin);
// odstranenie znaku noveho riadku
buffer[strcspn(buffer, "\n")] = '\0';
return buffer;
}
Po načítaní riadku je potrebné rozpoznať, aký príkaz obsahuje. V nasledovnom texte vysvetľujeme aké príkazy rozlišujeme, aký majú zápis a akú operáciu vykonávajú.
Sú to príkazy určené na načítavanie riadkov textu a vypisovanie výsledkov (obsahu poľa op alebo mem).
Štruktúra príkazu:
in [text]
Špecifikácia príkazu:
Chybové situácie:
Štruktúra príkazu:
out op
Špecifikácia príkazu:
Štruktúra príkazu:
out range
Špecifikácia príkazu:
Chybové situácie:
Štruktúra príkazu:
out mem
Špecifikácia príkazu:
Sú to príkazy, ktoré nám umožňujú ľubovoľne sa pohybovať (doľava/doprava) v načítanom texte pomocou pointrov alebo priamo skočiť na začiatok/koniec načítaného textu.
Štruktúra príkazu:
move {sp/ep} n
Špecifikácia príkazu:
Chybové situácie:
Štruktúra príkazu:
start {sp/ep}
Špecifikácia príkazu:
Štruktúra príkazu:
end {sp/ep}
Špecifikácia príkazu:
Sú to príkazy, ktoré nám umožňujú nájsť prvé/posledné slovo v načítanom reťazci alebo nájsť predošlé/nasledujúce slovo od aktuálnej pozície.
Z zmysle tohto zadania budeme za slovo považovať akúkoľvek dlhú postupnosť po sebe idúcich alfanumerických znakov, ktorá je od okolitého textu oddelená aspoň 1 ne-alfanumerickým znakom.
Štruktúra príkazu:
first
Špecifikácia príkazu:
Štruktúra príkazu:
last
Špecifikácia príkazu:
Štruktúra príkazu:
prev
Špecifikácia príkazu:
Štruktúra príkazu:
next
Špecifikácia príkazu:
Sú to príkazy, pomocou ktorých dokážeme vymazávať, vkladať a prepisovať obsah v reťazci, ktorý je uložený v poli op alebo kopírovať jeho obsah do pomocnej pamäte.
Štruktúra príkazu:
del
Špecifikácia príkazu:
Chybové situácie:
Štruktúra príkazu:
crop
Špecifikácia príkazu:
Chybové situácie:
Štruktúra príkazu:
copy
Špecifikácia príkazu:
Chybové situácie:
Štruktúra príkazu:
insert {n/mem}
Špecifikácia príkazu:
Chybové situácie:
Štruktúra príkazu:
replace
Špecifikácia príkazu:
Chybové situácie:
Štruktúra príkazu:
quit
Ak načítaný riadok obsahuje príkaz quit, program skončí s návratovou hodnotou 0.
V tomto zadaní budeme rozlišovať 3 chybové situácie.
K dispozícii máte balík s testovacími súbormi pomocou, ktorých si viete otestovať funkcionalitu vášho programu v jednotlivých scenároch.
Balík je distribuovaný ako ZIP súbor s názvom z3_testing.zip
, ktorý obsahuje
tieto adresáre:
stdin
- adresár, ktorý obsahuje TXT súbory, v ktorých sú uložené vstupy
do programu pre všetky testovacie prípady a scenáre (odporúčame skompilovaný program spúšťať pomocou
presmerovania štandardného vstupu z týchto súborov)
stdout
- adresár, ktorý obsahuje správne výstupy pre všetky testovacie
prípady vo všetkých scenároch
Štandardný vstup programu vieme v termináli jednoducho presmerovať pomocou operátora <
. Použitím tohto operátora sa vstup bude čerpať z dodaného textového súboru
a nie z klávesnice. Príklad spustenia programu s presmerovaním štandardného vstupu v Linux termináli je uvedený
pod textom.
./my_program < input.txt
Uvádzame príklad ako testovať váš program pomocou dodaných TXT súborov pre jednotlivé scenáre. V príklade je
program testovaný pre náhodne vybrané testovacie prípady v scenári 1. Program z3
predstavuje skompilované zadanie č. 3 a predpokladáme, že sa nachádza v
adresári stdin
.
./z3 < scenar_1/example_1.txt
./z3 < scenar_1/example_2.txt
./z3 < scenar_1/example_3.txt
Uvádzame aj príklad ako si rýchlo v Linux termináli otestovať, či váš program vypísal očakávaný výstup pre
zvolený testovací scenár a prípad. Využijeme na to presmerovanie štandardného vstupu a príkaz diff
na porovnanie obsahu dvoch textov. Budeme predpokladať, že skompilovaný
program sa nachádza na rovnakej úrovni ako adresáre stdin
a stdout
. V tomto príklade testujeme, či náš program správne funguje v testovacom
prípade 2 v rámci scenára 4. Ak sa po spustení tohto príkazu nič nevypíše, signalizuje to, že výstup nášho
programu sa nelíši od správneho výstupu.
./z3 < stdin/scenar_4/example_2.txt | diff - stdout/scenar_4/example_2.txt --ignore-trailing-space
Poznámka: pokročilí programátori a nadšenci si môžu proces testovania a porovnávania výstupov programu so
správnym výstupom automatizovať pomocou Python, Linux shell skriptov resp. Powershell skriptov a pod. Ideálny
nástrojom na porovnávanie obsahu dvoch TXT súborov je príkaz diff
. Viac
informácií nájdete na tomto odkaze.
Odovzdávací systém otestuje a vyhodnotí 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
Načítanie a výpis riadku (in a out op)
Môžu sa tu vyskytnúť príkazy: in, out op, quit |
0,5 b |
Scenár 2
Pohyb v texte (move {sp/ep} n, start {sp/ep},
end {sp/ep})
Môžu sa tu vyskytnúť príkazy: in, move, start, end, out range, quit |
0,5 b |
Scenár 3
Príkazy first/last
Môžu sa tu vyskytnúť príkazy: in, first, last, out range, quit |
0,5 b |
Scenár 4
Príkazy prev/next
Môžu sa tu vyskytnúť príkazy: in, move, next, prev, out range, quit |
0,5 b |
Scenár 5
Príkaz del
Môžu sa tu vyskytnúť príkazy: in, move, del, out op, out range, quit |
1,0 b |
Scenár 6
Príkaz crop
Môžu sa tu vyskytnúť príkazy: in, move, crop, out op, out range, quit |
1,0 b |
Scenár 7
Príkaz copy
Môžu sa tu vyskytnúť príkazy: in, move, copy, out mem, quit |
1,0 b |
Scenár 8
Príkaz insert {n/mem}
Môžu sa tu vyskytnúť príkazy: in, move, copy, insert n, insert mem, out op, out mem, quit |
1,0 b |
Scenár 9
Príkaz replace
Môžu sa tu vyskytnúť príkazy: in, move, copy, replace, out op, out range, out mem, quit |
1,0 b |
Scenár 10
Rôzne kombinácie existujúcich príkazov
|
3,0 b |
Súčet | 10,0 b |
Video zachytáva spustenie skompilovaného programu a zadávanie vstupov v zmysle testovacieho prípadu 6 v scenári 10.
Video zachytáva spustenie skompilovaného programu a zadávanie vstupov v zmysle testovacieho prípadu 7 v scenári 10.
Video zachytáva spustenie skompilovaného programu a zadávanie vstupov v zmysle testovacieho prípadu 8 v scenári 10.
Všetky testovacie príklady na stiahnutie
Extra balík s testovacími súbormi Nové
Vstup
in this_is_very_long_text_this_is_very_long_text_this_is_very_long_text_this_is_very_long_text_this_is_very_long_text_this_is_very_long_text
Výstup
ERR_OVERFLOW
Vstup
in abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
out op
quit
Výstup
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Vstup
in Text, ktory obsahuje vela slov. Slnko stale svieti. Pocuvam hlas srdca. Programujem v jazyku C.
out op
quit
Výstup
Text, ktory obsahuje vela slov. Slnko stale svieti. Pocuvam hlas srdca. Programujem v jazyku C.
Vstup
in Nezalezi na tom, ako pomaly ides, pokial sa nezastavis.
move sp 21
out range
quit
Výstup
pomaly ides, pokial sa nezastavis.
Vstup
in Nezlyhal som. Prave som nasiel 10 000 sposobov, ktore nebudu fungovat.
move ep -57
out range
quit
Výstup
Nezlyhal som.
Vstup
in Ak chcete zit stastny zivot, spojte ho s cielom, nie s ludmi alebo vecami.
move sp 14
move ep -47
out range
quit
Výstup
stastny zivot
Vstup
in Ak by bol zivot predvidatelny, prestal by byt zivotom a bol by bez chuti.
move sp 102
Výstup
ERR_OUT_OF_RANGE
Vstup
in Cele tajomstvo uspesneho zivota je zistit, co je osudom cloveka urobit, a potom to urobit.
move ep -106
Výstup
ERR_OUT_OF_RANGE
Vstup
in Ak chcete pisat o zivote, musite ho najskor zit.
move sp 3
move ep -16
start sp
out range
quit
Výstup
Ak chcete pisat o zivote, musite
Vstup
in +++++ 777777niekde ***** vo999 12vesmire ----
last
out range
quit
Výstup
12vesmire
Vstup
in --=--=--=--=--=--=--=--=--=--=--
next
out range
quit
Výstup
Vypíše sa prázdny riadok
Vstup
in .......4hockey......2football89........basketball.......5chess.................
move sp 7
next
out range
quit
Výstup
2football89
Vstup
in !!!!) 8Bavi ? ma6 / &^zi4vot. ? FOREVER.
move sp 21
next
out range
quit
Výstup
zi4vot
Vstup
in prikaz prev v tejto vete nenajde slovo
prev
out range
quit
Výstup
Vypíše sa prázdny riadok
Vstup
in O com sa neda hovorit, o tom treba mlcat.
move sp 9
move ep -32
out range
del
out op
quit
Výstup
O com sa neda hovorit, o tom treba mlcat.
Vstup
in Ten, kto ma velke myslienky, casto robi velke chyby.
move sp 20
move ep -31
out range
del
out op
quit
Výstup
s
Ten, kto ma velke mylienky, casto robi velke chyby.
Vstup
in Vedomosti ziadneho cloveka tu nemozu prekrocit jeho skusenosti.
move sp 10
move ep -33
out range
del
out op
quit
Výstup
ziadneho cloveka tu
Vedomosti nemozu prekrocit jeho skusenosti.
Vstup
in Sloboda spociva v robeni toho, po com clovek tuzi.
move sp 25
move ep -25
out range
crop
out op
quit
Výstup
Vypíšu sa len 2 prázdne riadky.
Vstup
in Je len jedno dobro, poznanie a jedno zlo, nevedomost.
move sp 30
move ep -28
crop
Výstup
ERR_POSITION
Vstup
in Ak by Boh neexistoval, bolo by potrebne ho vynajst.
move sp 6
move ep -44
out range
crop
out op
quit
Výstup
B
B
Vstup
in Volny cas je matkou filozofie.
move sp 6
out range
crop
out op
quit
Výstup
cas je matkou filozofie.
cas je matkou filozofie.
Vstup
in Je len jedna vec, na ktoru sa da filozof spolahnut, a to, ze protireci inym filozofom.
move sp 16
move ep -70
copy
out mem
quit
Výstup
Vypíše sa prázdny riadok.
Vstup
in Sme tym, co opakovane robime. Dokonalost teda nie je cin, ale zvyk.
move sp 40
move ep -40
copy
Výstup
ERR_POSITION
Vstup
in Zivot musi byt chapany dozadu. Ale musi sa zit dopredu.
move sp 31
move ep -23
copy
out mem
quit
Výstup
A
Vstup
in Veda je to, co vies. Filozofia je to, co nevies.
move ep -28
copy
out mem
quit
Výstup
Veda je to, co vies.
Vstup
in Filozofia je zaroven najvznesenejsia a najtrivialnejsia ludska cinnost.
insert 30
Výstup
ERR_OVERFLOW
Vstup
in Ask not what your country can do for you; ask what you can do for your country.
move sp 26
copy
out mem
insert mem
Výstup
can do for you; ask what you can do for your country.
ERR_OVERFLOW
Vstup
in Ask, and it shall be given you; seek, and you shall find.
insert mem
out op
quit
Výstup
Ask, and it shall be given you; seek, and you shall find.
Vstup
in Eighty percent of success is showing up.
insert 15
out op
quit
Výstup
Eighty percent of success is showing up.
Vstup
in Frankly, my dear, I don't give a damn.
move sp 8
insert 5
out op
quit
Výstup
Frankly, my dear, I don't give a damn.
Vstup
in Genius is one percent inspiration and ninety-nine percent perspiration.
move sp 71
insert 3
out op
quit
Výstup
Genius is one percent inspiration and ninety-nine percent perspiration.
Vstup
in Go ahead, make my day.
move sp 10
move ep -5
copy
out mem
move sp -8
insert mem
out op
quit
Výstup
make my
Gomake my ahead, make my day.
Vstup
in I think therefore I am.
move sp 5
move ep -18
out range
replace
out op
quit
Výstup
I think therefore I am.
Vstup
in If you are going through hell, keep going.
move sp 27
move ep -25
replace
Výstup
ERR_POSITION
Vstup
in If you want something done right, do it yourself.
replace
out op
quit
Výstup
If you want something done right, do it yourself.
Vstup
in I will be back.
move sp 10
move ep -1
out range
copy
move sp -7
move ep -5
replace
out op
quit
Výstup
back
I wbackbe back.
Vstup
in United we stand, divided we fall.
last
out range
del
out op
quit
Výstup
fall
United we stand, divided we .
Vstup
in Whatever you are, be a good one.
next
out range
crop
out op
quit
Výstup
you
you
Vstup
in Confident people have a way of carrying themselves that makes others attracted to them.
move sp 22
next
copy
out mem
quit
Výstup
way
Vstup
in When you change your thoughts, remember to also change your world.
move sp 41
prev
copy
out mem
quit
Výstup
remember
Vstup
in The more you know who you are, and what you want, the less you let things upset you.
move sp 50
prev
copy
out mem
first
out range
insert mem
out op
quit
Výstup
want
The
wantThe more you know who you are, and what you want, the less you let things upset you.
Vstup
in Do one thing every day that scares you.
move sp 3
next
copy
out mem
next
out range
replace
out op
quit
Výstup
thing
every
Do one thing thing day that scares you.
Vstup
in It is never too late to be what you might have been.
move sp 30
first
out range
del
last
copy
out mem
prev
out range
prev
out range
insert mem
out op
quit
Výstup
It
been
have
might
is never too late to be what you beenmight have been.
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 univerzitnom Google STU konte.