PROG-2 logo
Neprihlásený používateľ

Špecifikácia zadania

Cieľom zadania je napísať konzolový textový procesor v jazyku C. Textový procesor bude načítavať, spracovávať riadky textu a vypisovať výsledky. Program bude riadený preddefinovanými príkazmi, ktoré bude potrebné rozpoznať. Príkazy môžeme rozdeliť do niekoľkých kategórií: I/O príkazy, pohyb v texte, detekcia slov a reťazcové operácie. Program bude načítavať a vykonávať príkazy pokiaľ používateľ nezadá ukončovací príkaz. V zadaní si precvičíte polia, pointre, znaky a reťazce.

Úloha

Vaša konzolová aplikácia napísaná v jazyku C bude fungovať v týchto krokoch:

  1. Spustenie skompilovaného programu v termináli.
  2. Načítanie riadku textu.
  3. Rozpoznanie a vykonanie príkazu:
  4. Bol zadaný príkaz quit?
    • Nie: choď naspäť na krok 2.
    • Áno: koniec programu


Obrázok 1: Fázy činnosti programu (veľký obrázok).


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.

Textový procesor

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.

Polia

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

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'.



Obrázok 2: Pole op a jeho stav na začiatku programu(veľký obrázok).

Pole mem

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'.

Pointre

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:

  • Pointer sp reprezentuje začiatok používateľom zvoleného podreťazca v poli op.
  • Pointer ep reprezentuje koniec používateľom zvoleného podreťazca v poli op.


Obrázok 3: Pointre sp a ep a ich stav na začiatku programu (veľký obrázok).

Načítavanie riadkov textu

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.

Funkcia readline

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.

  • Funkcia vráti načítaný riadok textu bez znaku \n.
  • V načítanom riadku je potrebné rozpoznať príkaz textového procesora.
  • Na definovanie MMAX použite makro #define MMAX 1000
  • Funkcia využíva interné pole, ktoré reprezentuje načítaný riadok a jeho kapacita je zámerne vyššia ako kapacita poľa op (MMAX>N). Je to tak z toho dôvodu, že načítaný riadok musí mať dostatočnú kapacitu na to, aby sa spolu s príkazom textového procesora mohol načítať v rámci jedného riadku aj vstupný text do poľa op (príkaz in). A taktiež preto, aby sme v rámci zadania mohli testovať chybovú situáciu ERR_OVERFLOW.
  • V prípade príkazu in je po zavolaní tejto funkcie potrebné príslušnú časť načítaného riadku (tú, ktorá obsahuje vstupný text do poľa op) hlboko prekopírovať do poľa op. Hlbokú kópiu je potrebné urobiť preto, že vnútorné pole buffer sa po načítaní nového riadku vždy prepíše. Hlbokú kópiu reťazca viete vytvoriť pomocou knižničnej funkcie strcpy alebo memcpy.
// 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;
}

Príkazy textového procesora

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ú.

I/O príkazy

Sú to príkazy určené na načítavanie riadkov textu a vypisovanie výsledkov (obsahu poľa op alebo mem).

Príkaz in

Štruktúra príkazu:

in [text]

Špecifikácia príkazu:

  • Tento príkaz načíta text do poľa op.
  • Za slovom in (vždy malými písmenami) je vždy 1 medzera.
  • Zvyšok obsahu za medzerou je chápaný ako text, ktorý je potrebné prekopírovať do poľa op ako reťazec (to znamená, že musí byť ukončený znakom \0).
  • V prípade kopírovania reťazca do poľa op sa musí vykonať hlboká kópia (použite knižničné funkcie strcpy alebo memcpy).
  • V rámci automatizovaného hodnotenia vášho programu bude mať načítaný text dĺžku vždy aspoň 1 (t.j. za medzerou sa vyskytne vždy aspoň 1 znak).
  • Starý obsah poľa op sa po načítaní reťazca prepíše novým obsahom.
  • Po úspešnom skopírovaní sa pointer:
    • sp nastaví tak, aby ukazoval na začiatok reťazca v poli op
    • ep sa nastaví tak, aby ukazoval na miesto za posledným znakom reťazca v poli op, t.j. na jeho ukončujúci znak \0

Chybové situácie:

  • Ak má text, ktorý sa snažíme načítať do poľa op viac ako N znakov, príkaz sa nevykoná a nastane chybová situácia ERR_OVERFLOW.


Obrázok 4: Vizualizácia načítania reťazca do poľa op (veľký obrázok).


Príkaz out op

Štruktúra príkazu:

out op

Špecifikácia príkazu:

  • Tento príkaz vypíše reťazec v poli op.
  • Výpis nastane v samostatnom riadku.
  • Ak pole op obsahuje prázdny reťazec (t.j. taký, ktorý obsahuje len ukončovací znak \0), tak sa vypíše len prázdny riadok (t.j. len znak \n).


Obrázok 5: Vizualizácia príkazu out op (veľký obrázok).


Príkaz out range

Štruktúra príkazu:

out range

Špecifikácia príkazu:

  • Tento príkaz vypíše podreťazec z poľa op.
  • Podreťazec je definovaný rozsahom [sp,ep).
  • Výpis nastane v samostatnom riadku.
  • Ak sp = ep, tak sa vypíše prázdny riadok.

Chybové situácie:

  • Ak sp > ep, príkaz sa nevykoná a nastane chybová situácia ERR_POSITION.


Obrázok 6: Vizualizácia príkazu out range (veľký obrázok).


Príkaz out mem

Štruktúra príkazu:

out mem

Špecifikácia príkazu:

  • Tento príkaz vypíše reťazec v poli mem (pomocná pamäť).
  • Výpis nastane v samostatnom riadku.
  • Ak pole mem obsahuje prázdny reťazec, tak sa vypíše prázdny riadok.


Obrázok 7: Vizualizácia príkazu out mem (veľký obrázok).

Pohyb v texte

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.

Príkaz move {sp/ep} n

Štruktúra príkazu:

move {sp/ep} n

Špecifikácia príkazu:

  • Tento príkaz posunie pointer sp/ep o n pozícií.
  • Ak je n záporné, pointer posúvame doľava.
  • Ak je n kladné, pointer posúvame doprava.
  • Obidva pointre sa môžu posúvať len medzi začiatkom a koncom reťazca (po jeho ukončovací znak \0) v poli op.

Chybové situácie:

  • Ak by sa mali pointre posunúť mimo dovolenú oblasť (t.j. pred prvý znak poľa op alebo za ukončovací znak reťazca v poli op), príkaz sa nevykoná a nastane chybová situácia ERR_OUT_OF_RANGE.
  • Ukončovací znak \0 reťazca v poli op je považovaný za dovolenú pozíciu, na ktorú sa pointre môžu posunúť.


Obrázok 8: Vizualizácia príkazu move (posun doprava, doľava a zakázaný posun) (veľký obrázok).


Príkaz start {sp/ep}

Štruktúra príkazu:

start {sp/ep}

Špecifikácia príkazu:

  • Tento príkaz posunie pointer sp/ep na začiatok reťazca v poli op (na index 0).


Obrázok 9: Vizualizácia príkazu start (veľký obrázok).


Príkaz end {sp/ep}

Štruktúra príkazu:

end {sp/ep}

Špecifikácia príkazu:

  • Tento príkaz posunie pointer sp/ep za posledný znak reťazca v poli op (t.j. tak, aby ukazoval na jeho ukončovací znak \0).


Obrázok 10: Vizualizácia príkazu end (veľký obrázok).


Detekcia slov

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.

Slovo

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.




Obrázok 11: Vizualizácia slov v načítanom riadku (veľký obrázok).


Príkaz first

Štruktúra príkazu:

first

Špecifikácia príkazu:

  • Tento príkaz nájde prvé slovo v načítanom reťazci v poli op.
  • Posunie pointer sp na začiatok prvého slova.
  • Posunie pointer ep za koniec prvého slova (t.j. jeden znak vpravo od posledného znaku slova).
  • Ak sa v načítanom reťazci v poli op nenachádza žiadne slovo, pointre sp aj ep sa nastavia na začiatok poľa op (na index 0).


Obrázok 12: Vizualizácia príkazu first (veľký obrázok).


Príkaz last

Štruktúra príkazu:

last

Špecifikácia príkazu:

  • Tento príkaz nájde posledné slovo v načítanom reťazci v poli op.
  • Posunie pointer sp na začiatok posledného slova.
  • Posunie pointer ep za koniec posledného slova (t.j. jeden znak vpravo od posledného znaku slova).
  • Ak sa v načítanom reťazci v poli op nenachádza žiadne slovo, pointre sp aj ep sa nastavia za koniec reťazca v poli op (t.j. tak, aby ukazovali na jeho ukončovací znak \0).


Obrázok 13: Vizualizácia príkazu last (veľký obrázok).


Príkaz prev

Štruktúra príkazu:

prev

Špecifikácia príkazu:

  • Tento príkaz nájde predošlé slovo v načítanom reťazci v poli op.
  • Hľadanie sa začína od pozície sp.
  • Posunie pointer sp na začiatok predošlého slova.
  • Posunie pointer ep za koniec predošlého slova (t.j. jeden znak vpravo od posledného znaku slova).
  • Ak sp pred hľadaním ukazuje na znak existujúceho slova, tak toto slovo sa v hľadaní preskočí.
  • Ak sa v načítanom reťazci v poli op nenachádza od pozície sp predošlé slovo, pointre sp aj ep sa nastavia na začiatok poľa op (na index 0).


Obrázok 14: Vizualizácia príkazu prev (veľký obrázok).


Príkaz next

Štruktúra príkazu:

next

Špecifikácia príkazu:

  • Tento príkaz nájde nasledujúce slovo v načítanom reťazci v poli op.
  • Hľadanie sa začína od pozície sp.
  • Posunie pointer sp na začiatok nasledujúceho slova.
  • Posunie pointer ep za koniec nasledujúceho slova (t.j. jeden znak vpravo od posledného znaku slova).
  • Ak sp pred hľadaním ukazuje na znak existujúceho slova, tak toto slovo sa v hľadaní preskočí.
  • Ak sa v načítanom reťazci v poli op nenachádza od pozície sp nasledujúce slovo, pointre sp aj ep sa nastavia za koniec reťazca v poli op (t.j. tak, aby ukazovali na jeho ukončovací znak \0).


Obrázok 15: Vizualizácia príkazu next (veľký obrázok).


Operácie s reťazcami

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.

Príkaz del

Štruktúra príkazu:

del

Špecifikácia príkazu:

  • Tento príkaz vymaže podreťazec z reťazca, ktorý je v poli op.
  • Vymazávaný podreťazec je definovaný rozsahom [sp,ep).
  • Ak za vymazávaným podreťazcom zostali v poli op nejaké znaky, tak sa posunú doľava, tak aby vyplnili priestor po vymazanom podreťazci.
  • Po vymazaní zostane pointer sp nezmenený.
  • Po vymazaní sa pointer ep nastaví na rovnakú pozíciu ako sp.
  • Ak pred vymazaním platí sp = ep, tak sa nič nevymaže.

Chybové situácie:

  • Ak pred vykonaním príkazu platí sp > ep, príkaz sa nevykoná a nastane chybová situácia ERR_POSITION.


Obrázok 16: Vizualizácia príkazu del (veľký obrázok).


Príkaz crop

Štruktúra príkazu:

crop

Špecifikácia príkazu:

  • Tento príkaz vymaže z op všetko okrem podreťazca, ktorý je daný rozsahom [sp,ep).
  • Po vymazaní sa zostávajúci podreťazec [sp,ep) presunie na začiatok poľa op a ukončí sa znakom \0.
  • Po vymazaní bude pointer sp ukazovať na začiatok poľa op (na index 0).
  • Po vymazaní bude pointer ep ukazovať za koniec reťazca v poli op (t.j. bude ukazovať na jeho ukončovací znak \0).
  • Ak pred vymazaním platí sp = ep, tak sa vymaže celý reťazec v poli op a zostane v ňom prázdny reťazec (t.j. taký, ktorý obsahuje len znak \0).

Chybové situácie:

  • Ak pred vykonaním príkazu platí sp > ep, príkaz sa nevykoná a nastane chybová situácia ERR_POSITION.


Obrázok 17: Vizualizácia príkazu crop (veľký obrázok).


Príkaz copy

Štruktúra príkazu:

copy

Špecifikácia príkazu:

  • Tento príkaz prekopíruje podreťazec, ktorý je daný rozsahom [sp,ep) z poľa op do poľa mem (pomocná pamäť).
  • Pôvodný obsah poľa mem sa prepíše novým obsahom.
  • Prekopírovaný obsah v poli mem sa musí ukončiť znakom \0.
  • Ak pred vymazaním platí sp = ep, do poľa mem sa nič neprekopíruje (v poli mem ostáva pôvodný obsah).

Chybové situácie:

  • Ak pred vykonaním príkazu platí sp > ep, príkaz sa nevykoná a nastane chybová situácia ERR_POSITION.


Obrázok 18: Vizualizácia príkazu copy (veľký obrázok).


Príkaz insert {n/mem}

Štruktúra príkazu:

insert {n/mem}

Špecifikácia príkazu:

  • Tento príkaz môže mať 2 tvary:
    • insert n: na miesto, kam ukazuje pointer sp vloží n medzier (n bude vždy kladné číslo)
    • insert mem: na miesto, kam ukazuje pointer sp sa vloží reťazec uložený v poli mem, ale bez znaku \0.
  • Po vložení nového obsahu sa reťazec v poli op zväčší, predchádzajúci obsah sa od pozície pointra sp posunie doprava.
  • Po vykonaní príkazu sa pozícia pointra sp nezmení.
  • Po vykonaní príkazu sa pointer ep posunie o príslušný počet znakov doprava (n znakov alebo dĺžku reťazca v poli mem).
  • Ak bol príkaz v tvare insert mem a v poli mem sa nachádza prázdny reťazec (taký, ktorý obsahuje len znak \0), tak príkaz nič nevykoná.

Chybové situácie:

  • Ak by malo počas vkladania obsahu dôjsť k pretečeniu kapacity poľa op, príkaz sa nevykoná a nastane chybová situácia ERR_OVERFLOW.
  • Ak pred vykonaním príkazu platí sp > ep, príkaz sa nevykoná a nastane chybová situácia ERR_POSITION.


Obrázok 19: Vizualizácia príkazu insert n (veľký obrázok).







Obrázok 20: Vizualizácia príkazu insert mem (veľký obrázok).


Príkaz replace

Štruktúra príkazu:

replace

Špecifikácia príkazu:

  • Obsah v poli op daný rozsahom [sp,ep) sa prepíše reťazcom, ktorý sa nachádza v poli mem (okrem znaku \0).
  • Ak je v poli mem prázdny reťazec, tak sa prepisovanie nevykoná.
  • Ak je v poli mem menej znakov, tak sa prepisovanie skončí, keď sa vyčerpajú znaky v poli mem.
  • Ak je v poli mem viac znakov, ako dovoľuje rozsah [sp,ep), tak sa prekopíruje len príslušná časť reťazca v poli mem.
  • Pointre sp a ep zostanú nezmenené.
  • Ak pred vykonaním príkazu platí sp = ep, tak sa prepisovanie nevykoná.

Chybové situácie:

  • Ak pred vykonaním príkazu platí sp > ep, príkaz sa nevykoná a nastane chybová situácia ERR_POSITION.


Obrázok 21: Vizualizácia príkazu replace (situácia, keď pole mem obsahuje kratší reťazec ako dovoľuje rozsah [sp,ep)) (veľký obrázok).






Obrázok 22: Vizualizácia príkazu replace (situácia, keď pole mem obsahuje dlhší reťazec ako dovoľuje rozsah [sp,ep)) (veľký obrázok).


Ukončenie programu

Príkaz quit

Štruktúra príkazu:

quit

Ak načítaný riadok obsahuje príkaz quit, program skončí s návratovou hodnotou 0.

Chybové situácie

V tomto zadaní budeme rozlišovať 3 chybové situácie.

  • ERR_OVERFLOW
    • nastane ak je nedostatok miesta v poli op na vykonanie operácie
    • môže vzniknúť počas príkazov in a insert {n/mem}
  • ERR_POSITION
    • nastane ak pre pointre platí sp > ep (pointer sp je vpravo od ep)
    • môže vzniknúť počas príkazov out range, del, crop, copy, insert a replace
  • ERR_OUT_OF_RANGE
    • nastane ak sa snažíme posunúť pointer sp/ep mimo reťazec v poli op (pred začiatok poľa alebo za ukončovací znak reťazca)
    • môže vzniknúť počas príkazov move {sp/ep} n
Čo sa má stať po odhalení chybovej situácie?
  • Podľa typu odhalenej chybovej situácie sa vypíše príslušné chybové hlásenie na štandardný výstup: reťazec ERR_OVERFLOW, ERR_POSITION alebo ERR_OUT_OF_RANGE.
  • Následne program korektne skončí (funkcia main vráti hodnotu 0).

Ako testovať váš program?

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


Obrázok 23: Štruktúra balíka s testovacími súbormi (veľký obrázok).


Ako spustiť program s presmerovaním štandardného vstupu z TXT súboru

Š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.

Hodnotenie zadania

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.

Testovacie scenáre
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

Scenár 10, prípad 6.

Video zachytáva spustenie skompilovaného programu a zadávanie vstupov v zmysle testovacieho prípadu 6 v scenári 10.

Scenár 10, prípad 7.

Video zachytáva spustenie skompilovaného programu a zadávanie vstupov v zmysle testovacieho prípadu 7 v scenári 10.

Scenár 10, prípad 8.

Video zachytáva spustenie skompilovaného programu a zadávanie vstupov v zmysle testovacieho prípadu 8 v scenári 10.

Testovacie príklady

Všetky testovacie príklady na stiahnutie

Extra balík s testovacími súbormi Nové

Načítanie a výpis riadku

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 Výstup

Vstup

in A
out op
quit

Výstup

A

Vstup Výstup

Vstup

in abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
out op
quit

Výstup

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

Vstup Výstup

Vstup

in velmi  kratky    text
out op
quit

Výstup

velmi  kratky    text

Vstup Výstup

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 Výstup

Vstup

in 100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.
out op
quit

Výstup

100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.100znakov.

Vstup Výstup

Pohyb v texte

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 Výstup

Vstup

in Nezlyhal som. Prave som nasiel 10 000 sposobov, ktore nebudu fungovat.
move ep -57
out range
quit

Výstup

Nezlyhal som.

Vstup Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

Vstup

in Mam rad kritiku. Robi ta silnym.
move ep -5
move sp 17
end ep
out range
quit

Výstup

Robi ta silnym.

Vstup Výstup

Príkazy first/last

Vstup

in +---------S()()SLOVO
first
out range
quit

Výstup

S

Vstup Výstup

Vstup

in ....   ....   mama
first
out range
quit

Výstup

mama

Vstup Výstup

Vstup

in ######a2W896ff   ......ter56f4h    5555
first
out range
quit

Výstup

a2W896ff

Vstup Výstup

Vstup

in ?????????????????
first
out range
quit

Výstup


Vypíše sa prázdny riadok.

Vstup Výstup

Vstup

in a ----  aaabbc ?d?
last
out range
quit

Výstup

d

Vstup Výstup

Vstup

in @@@JEDEN&&&&DVA%%%TRI$$$$
last
out range
quit

Výstup

TRI

Vstup Výstup

Vstup

in +++++ 777777niekde  ***** vo999 12vesmire ----
last
out range
quit

Výstup

12vesmire

Vstup Výstup

Vstup

in %%%%%%       )))))
last
out range
quit

Výstup


Vypíše sa prázdny riadok

Vstup Výstup

Príkazy next/prev

Vstup

in start stred koniec
next
out range
quit

Výstup

stred

Vstup Výstup

Vstup

in --=--=--=--=--=--=--=--=--=--=--
next
out range
quit

Výstup


Vypíše sa prázdny riadok

Vstup Výstup

Vstup

in .......4hockey......2football89........basketball.......5chess.................
move sp 7
next
out range
quit

Výstup

2football89

Vstup Výstup

Vstup

in !!!!) 8Bavi  ?   ma6  /  &^zi4vot.   ? FOREVER.
move sp 21
next
out range
quit

Výstup

zi4vot

Vstup Výstup

Vstup

in prikaz prev v tejto vete nenajde slovo
prev
out range
quit

Výstup


Vypíše sa prázdny riadok

Vstup Výstup

Vstup

in a 5----b 6&&&c @@@@8@@ d;;;;102 e
move sp 19
prev
out range
quit

Výstup

c

Vstup Výstup

Vstup

in seat leon ***&   *+-  %$$$
move sp 22
prev
out range
quit

Výstup

leon

Vstup Výstup

Príkaz del

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 Výstup

Vstup

in Myslim, teda som.
move sp 10
move ep -10
del

Výstup

ERR_POSITION

Vstup Výstup

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 Výstup

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 Výstup

Vstup

in Boh nie je ochotny urobit vsetko, a tak nam vziat slobodnu volu a podiel na slave, ktory nam patri.
move ep -96
out range
del
out op
quit

Výstup

Boh
 nie je ochotny urobit vsetko, a tak nam vziat slobodnu volu a podiel na slave, ktory nam patri.

Vstup Výstup

Príkaz crop

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 Výstup

Vstup

in Je len jedno dobro, poznanie a jedno zlo, nevedomost.
move sp 30
move ep -28
crop

Výstup

ERR_POSITION

Vstup Výstup

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 Výstup

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 Výstup

Vstup

in Filozofia je boj proti ocareniu nasej inteligencie pomocou jazyka.
move sp 13
move ep -50
out range
crop
out op
quit

Výstup

boj
boj

Vstup Výstup

Príkaz copy

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 Výstup

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 Výstup

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 Výstup

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 Výstup

Vstup

in Metafyzika je temny ocean bez brehov a majakov, posiaty mnohymi filozofickymi troskami.
move sp 78
copy
out mem
quit

Výstup

troskami.

Vstup Výstup

Príkaz insert

Vstup

in Filozofia je zaroven najvznesenejsia a najtrivialnejsia ludska cinnost.
insert 30

Výstup

ERR_OVERFLOW

Vstup Výstup

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 Výstup

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 Výstup

Vstup

in Eighty percent of success is showing up.
insert 15
out op
quit

Výstup

               Eighty percent of success is showing up.

Vstup Výstup

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 Výstup

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 Výstup

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 Výstup

Vstup

in I have always depended on the kindness of strangers.
move sp 30
move ep -1
copy
out mem
move sp -30
insert mem
out op
quit

Výstup

kindness of strangers
kindness of strangersI have always depended on the kindness of strangers.

Vstup Výstup

Príkaz replace

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 Výstup

Vstup

in If you are going through hell, keep going.
move sp 27
move ep -25
replace

Výstup

ERR_POSITION

Vstup Výstup

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 Výstup

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 Výstup

Vstup

in Keep your friends close, but your enemies closer.
move sp 18
move ep -26
out range
copy
move sp 7
move ep 4
replace
out op
quit

Výstup

close
Keep your friends close, clt your enemies closer.

Vstup Výstup

Rôzne kombinácie existujúcich príkazov

Vstup

in United we stand, divided we fall.
last
out range
del
out op
quit

Výstup

fall
United we stand, divided we .

Vstup Výstup

Vstup

in Whatever you are, be a good one.
next
out range
crop
out op
quit

Výstup

you
you

Vstup Výstup

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 Výstup

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 Výstup

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 Výstup

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 Výstup

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.

Vstup Výstup

Vstup

in If you cannot do great things, do small things in a great way.
last
out range
prev
out range
end ep
copy
out mem
crop
move sp 5
replace
out op
quit

Výstup

way
great
great way.
greatgreat

Vstup Výstup

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 univerzitnom Google STU konte.

Prednášky
Jazyk C
Zdroje použité pri tvorbe zadania a prezentácie
Copyright © 2025, 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.
Animácie vytvárame pomocou Animate.css.