Neprihlásený používateľ |

Špecifikácia zadania

Napíšte textový procesor v jazyku C, ktorý bude spracovávať riadky textu zadané z klávesnice. Program sa spustí s command-line (ďalej len CMD) argumentami, podľa ktorých sa určia operácie spracovania textu. Spracovanie textu bude prebiehať po jednotlivých načítaných riadkoch, ktoré bude zadávať používateľ z klávesnice. Každý riadok sa spracuje pomocou operácií špecifikovaných CMD argumentami a následne sa vypíše na štandardný výstup. Program bude takýmto spôsobom spracovávať text pokiaľ nebude načítaný prázdny riadok. Zmyslom tohto zadania je precvičenie si práce s CMD argumentami a reťazcami.

Textový procesor

Textový procesor v tomto zadaní je riadkovo-orientovaný. To znamená, že vstupný text načítava z klávesnice po riadkoch, ktoré vždy spracuje podľa zadefinovaných operácií a výsledok spracovania vypíše na štandardný výstup. Textový procesor sa spustí v termináli spolu s jeho CMD argumentami (prepínače a spol.). Program najprv rozpozná platné prepínače a ich povinné parametre a následne začne spracovávať a vypisovať načítané riadky.

CMD argumenty

CMD argumenty sú argumenty programu, ktoré sa zadávajú v termináli pri jeho spustení. Slúžia na ovládanie správania sa programu z miesta jeho spustenia. Môžeme zadať ľubovoľný počet argumentov v ľubovoľnom tvare (okrem niektorých špeciálnych znakov, ktoré sú osobitne interpretované terminálom). 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.

Príklad spustenia programu s CMD argumentami v Linux termináli:

./program 123 abc "hello world"

Daný príklad ilustruje situáciu spustenia skompilovaného programu program v termináli so zadaním CMD argumentov. Jednotlivé argumenty sú vymenované v nasledovnom zozname.

  • Prvok argv[0] obsahuje cestu k programu program.
  • Prvok argv[1] obsahuje reťazec "123". Pozor, jedná sa o textovú reprezentáciu čísla.
  • Prvok argv[2] obsahuje reťazec "abc".
  • Prvok argv[3] obsahuje reťazec "hello world". Aj napriek tomu, že tento reťazec pozostáva z viacerých slov oddelených medzerou, je stále chápaný ako samostatný argument, nakoľko je uzatvorený v úvodzovkách.

V zdrojovom kóde vieme pristúpiť k CMD argumentom pomocou parametrov funkcie main.

int main(int argc, char* argv[])
{
    /*
        argc - pocet CMD argumentov
        argv - pole argumentov (technicky je to pole retazcov)
    */
    return 0;
} 

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

  • Prepínače (z angl. options). 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 riadku 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-option argumenty. 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 našom prípade budú všetky non-option argumenty umiestnené až za všetkými prepínačmi a ich parametrami.

Program môžeme z terminálu spustiť s rôznymi prepínačmi a ich parametrami. Taktiež môžeme zadať prepínače v rôznom poradí. Treba sa vysporiadať aj so situáciami, kedy používateľ zadá neplatný prepínač alebo zabudne uviesť povinný parameter platného prepínača. Navyše, okrem prepínačov a ich parametrov vieme program spustiť aj so zvyšnými non-option argumentami.

Ukážka rôznych typov CMD argumentov:

./program -a -b param arg1 arg2 arg3

Popis zadaných CMD argumentov:

  • -a je prepínač bez parametra
  • -b je prepínač s parametrom param
  • arg1, arg2 a arg3 sú non-option argumenty
Spracovanie CMD argumentov pomocou funkcie getopt

Celý proces rozpoznania prepínačov, ich parametrov a non-option argumentov sa dá jednoducho automatizovať pomocou knižničnej funkcie getopt. Funkcia getopt okrem iného odhaľuje aj situácie nesprávneho použitia prepínačov. Odporúčame preto využiť túto funkciu, ušetrí vám veľa nervov a času. Funkciu getopt je možné použiť len v Unix-like systémoch. Používatelia Windows musia mať preto na jej využitie nainštalované vývojové prostredie MinGW, Cygwin, MSYS2 alebo WSL a používať ním distribuovaný kompilátor GCC. Funkciu getopt je možné použiť po vložení hlavičkového súboru unistd.h.

Hlavička funkcie getopt:

int getopt(int argc, char *const argv[], const char *optstring);
  • argc je počet CMD argumentov
  • argv je pole CMD argumentov (každý argument je reťazec)
  • optstring je reťazec špecifikujúci platné prepínače (t.j. také, ktoré váš program rozpoznáva) a taktiež uvádza, či dané prepínače majú parametre

Nasledujúci príklad demonštruje použitie funkcie getopt pri spracovaní CMD argumentov programu.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]){

	// Poznamky ku 'getopt':

	// Retazec 'optstring' specifikuje platne prepinace programu.

	// Ak funkcia 'getopt' narazi na neplatny prepinac, vrati znak '?'.
	// Ak 'optstring' zacina znakom ':', vtedy 'getopt' vrati znak ':'
	// v pripade chybajuceho povinneho parametra prepinaca.

	// Ak je v 'optstringu' za pismenom prepinaca znak ':', znamena to,
	// ze dany prepinac ma povinny parameter.

	// Povinny parameter aktualneho prepinaca vieme ziskat cez globalny
	// smernik 'optarg'.

	// Ked su rozpoznane vsetky prepinace, funkcia 'getopt' vrati -1.
	// Ak zostali nejake non-option argumenty, tak prvy non-option argument
	// ma index dany globalnou premennou 'optind'.

	int opt;
	char* optstring = ":ab:c";

    while ((opt = getopt(argc, argv, optstring)) != -1) {
        switch (opt) {
            case 'a':
                printf("Prepinac -a\n");
                break;
            case 'b':
                printf("Prepinac -b a jeho povinny parameter %s\n",optarg);
                break;
            case 'c':
            	printf("Prepinac -c\n");
            	break;
            default: /* '?' alebo ':' */
                printf("Neplatny prepinac alebo chybajuci param. prepinaca\n");
                return 1;
        }
    }
    if(optind < argc){
    	for(int i=optind;i<argc;i++){
    		printf("Non-option CMD argument: %s\n",argv[i]);
    	}
    }

	return 0;
}

Skompilovaný program spustíme z terminálu v tvare:

./program -a -b ahoj -c slovo1 slovo2

Dostaneme nasledovný výstup:

Prepinac -a
Prepinac -b a jeho povinny parameter ahoj
Prepinac -c
Non-option CMD argument: slovo1
Non-option CMD argument: slovo2

Súvisiace zdroje:

Načítanie riadkov textu

Po spustení programu a rozpoznaní CMD argumentov začne textový procesor načítavať riadky textu. Na načítanie riadku odporúčame použiť knižničnú funkciu fgets. V zadaní bude platiť, že maximálna dĺžka načítaného riadku je 1 000 znakov (zahŕňa znaky riadku a znak nového riadku '\n'). Vzhľadom na toto obmedzenie si viete vo vašom programe vytvoriť pole s dostatočnou kapacitou, v ktorom bude uložený načítaný riadok. Nezabudnite však, že každý reťazec v jazyku C musí byť ukončený terminačným znakom '\0' a treba to brať do úvahy pri určovaní veľkosti poľa na reprezentáciu načítaného riadku.

Načítavanie riadkov bude prebiehať až dovtedy, pokiaľ používateľ nezadá prázdny riadok, t.j. reťazec, ktorý neobsahuje žiadne znaky (t.j. používateľ nič nenapíše, ale stlačí len Enter). V prípade funkcie fgets sa prázdny riadok prejaví ako načítaný reťazec, ktorý bude obsahovať len znak '\n'. Textový procesor po načítaní prázdneho riadku regulérne ukončí svoju činnosť a funkcia main vráti hodnotu 0.

Súvisiace zdroje:

Spracovanie riadkov textu

Textový procesor vykonáva nasledovné typy operácií s načítaným riadkom. Poradie operácií je pevne určené a nemení sa. Zadané prepínače pri spustení programu len určujú, ktorá z operácií sa vykoná.

  1. Vstupné operácie (môžu sa kombinovať)
    • Predvolená vstupná operácia.
    • Prepínač -d
    • Prepínač -p
  2. Case konverzie (nemôžu sa kombinovať)
    • Prepínač -u
    • Prepínač -l
  3. Nahrádzanie slov (nemôžu sa kombinovať)
    • Prepínač -r (case-sensitive režim)
    • Prepínač -R (case-insensitive režim)

Algoritmus textového procesora vyjadrujúci poradie operácií spracovania riadku je znázornený na obrázku 1.


Obrázok 1: Algoritmus textového procesora (zobraziť originál obrázku).
Ukončenie programu

Textový procesor končí svoju činnosť po načítaní prázdneho riadku. Funkcia main vtedy vráti hodnotu 0. Viac o načítaní prázdneho riadku nájdete v časti Načítanie riadkov textu.

Chybové situácie

Textový procesor môže naraziť na 2 chybové situácie:

  • Situácia 1. Nastáva ak je program spustený s neplatným prepínačom (nie je v zozname známych prepínačov). Vtedy program musí skončiť bez akéhokoľvek výstupu a funkcia main vráti hodnotu 1.
  • Situácia 2. Nastáva ak nie je zadaný povinný parameter prepínača -r alebo -R. Vtedy program musí skončiť bez akéhokoľvek výstupu a funkcia main vráti hodnotu 2.

Vstup

Po spustení programu a rozpoznaní zadaných prepínačov textový procesor vstupuje do fázy načítavania a spracovávania riadkov. Používateľ môže zadať ľubovoľný riadok s dĺžkou maximálne 1 000 znakov (tento počet zahŕňa dĺžku riadku + znak nového riadku '\n'). Načítanie riadku je vždy potvrdené stlačením Enteru.

Operácie spracovania textu

Po načítaní riadku dôjde k jeho spracovaniu pomocou operácií, ktoré špecifikoval používateľ CMD argumentami. Poradie operácií je pevné dané (viď obrázok 1).

1. Vstupné operácie

Tieto operácie slúžia na povolenie/zakázanie určitej skupiny znakov v načítanom riadku. Rozlišujeme 3 typy vstupných operácií. Operácie dané prepínačmi -d a -p sa môžu kombinovať.

  • Predvolená vstupná operácia. Po načítaní vstupného riadku sa v ňom ponechajú len malé a veľké písmená anglickej abecedy a medzery. Ostatné znaky sa odfiltrujú. Táto operácia sa vykoná vždy.
  • Prepínač -d. Pri zadaní tohto prepínača sa vo vstupnom riadku okrem predvolených znakov (písmená a medzery) ponechajú aj číslice. Na overenie, či je znak číslicou môžeme použiť knižničnú funkciu isdigit.
  • Prepínač -p. Pri zadaní tohto prepínača sa vo vstupnom riadku okrem predvolených znakov (písmená a medzery) ponechajú aj interpunkčné znaky. Na overenie, či sa jedná o interpunkčný znak môžeme použiť knižničnú funkciu ispunct.

    Interpunkčné znaky sú:

    !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Príklad predvolenej vstupnej operácie

Ukážka obsahuje spustenie programu v termináli, načítaný riadok a pod ním vypísaný výsledok vstupnej operácie.

./program
!123Dnes+svieti.slnko456slovo slovo slovo?
Dnessvietislnkoslovo slovo slovo

Príklad operácie -d

Ukážka obsahuje spustenie programu v termináli, načítaný riadok a pod ním vypísaný výsledok vstupnej operácie.

./program -d
Pismena++a ***CISLA 123456 BUDU zachovane. T./e#s]t   96
Pismenaa CISLA 123456 BUDU zachovane Test   96

Príklad operácie -p

Ukážka obsahuje spustenie programu v termináli, načítaný riadok a pod ním vypísaný výsledok vstupnej operácie.

./program -p
---Interpunkcia+++ sa ne49o612dstran9i. <<<123456789>>>   a+r=c
---Interpunkcia+++ sa neodstrani. <<<>>>   a+r=c

Príklad kombinácie operácií -d a -p

Ukážka obsahuje spustenie programu v termináli, načítaný riadok a pod ním vypísaný výsledok vstupnej operácie.

./program -d -p
C9i,sl452a aj [i]nt95erp3unkci\a nez;;'96aniknu a 9 +    P
C9i,sl452a aj [i]nt95erp3unkci\a nez;;'96aniknu a 9 +    P

Súvisiace zdroje:

2. Case konverzie

Tieto operácie slúžia na konverziu načítaných písmen v riadku z veľkých na malé alebo opačne. Konverzie sa nesmú kombinovať (testovací softvér ani nebude testovať prípady kombinácie oboch operácií súčasne).

2.1 Lowercase

Lowercase konverzia sa vykoná len v prípade, že bol zadaný prepínač -l. Výsledkom lowercase konverzie je prevod všetkých veľkých písmen na malé. Ostatné znaky riadku zostanú nezmenené.

Príklady lowercase konverzie

Ukážky obsahujú spustenie programu v termináli, načítaný riadok a pod ním vypísaný výsledok lowercase konverzie.

./program -l
VELKE pismena 123. StRiEdAvE pIsMeNa_?     ABC--1--def
velke pismena  striedave pismena     abcdef
./program -d -p -l
***162AbCdeF PPPPP.W.+U+X    7Aa.
***162abcdef ppppp.w.+u+x    7aa.

2.2 Uppercase

Uppercase konverzia sa vykoná len v prípade, že bol zadaný prepínač -u. Výsledkom uppercase konverzie je prevod všetkých malých písmen na veľké. Ostatné znaky riadku zostanú nezmenené.

Príklady uppercase konverzie

Ukážky obsahujú spustenie programu v termináli, načítaný riadok a pod ním vypísaný výsledok uppercase konverzie.

./program -u
987 .-]AakfpWRsqb   aaa   TTT   ...p
 AAKFPWRSQB   AAA   TTT   P
./program -d -p -u
[[[male slovo]]]   111(((VELKE SLOVO)))999   ...  111 a 9d8T315w
[[[MALE SLOVO]]]   111(((VELKE SLOVO)))999   ...  111 A 9D8T315W
3. Nahrádzanie slov

Tieto operácie slúžia na nahradenie určených slov v riadku pomocou reťazca, ktorý bol zadaný ako parameter prepínača -r alebo -R. Tento parameter budeme označovať ako replace_string. Prepínače -r alebo -R sa nesmú kombinovať (testovací softvér ani nebude testovať prípady kombinácie oboch operácií súčasne).

Pri nahrádzaní slov sa očakáva, že používateľ môže pri spustení programu z terminálu zadať aj tzv. non-option argumenty (bližšie sú opísané v časti CMD argumenty). Množinu non-option argumentov budeme v tomto prípade označovať ako N.

3.1 Definícia slova

V zmysle tohto zadania budeme slovom označovať ľubovoľnú alfanumerickú postupnosť znakov, ktorá je oddelená od okolitého textu ne-alfanumerickými znakmi. Na zistenie, či je konkrétny znak alfanumerický môžete použiť knižničnú funkciu isalnum. Každý načítaný riadok textu vieme reprezentovať ako množinu slov W={w1, w2, w3 ..., wn}.

Poznámka: alfanumerická postupnosť je postupnosť obsahujúca len malé/veľké písmená a číslice.

Príklady reťazcov, ktoré sú považované za slová

hello
WORLD
123word
FANTASTIC777
1a2b3C
a
A
4

Obrázok 2: Ukážka rozdelenia načítaného riadku na slová v zmysle zadania. Slová sú označené modrou farbou. Všetky ostatné znaky slúžia ako separátory slov.

3.2 Case-sensitive režim

Vykoná sa ak je zadaný prepínač -r a jeho povinný parameter replace_string, pomocou ktorého nahrádzame slová v množine W. Počas tejto operácie postupne prechádzame slová v množine W zľava doprava a nahrádzame ich pomocou reťazca replace_string. Ostatné znaky riadku, ktoré netvoria slová zostávajú nezmenené. Podmienky kedy dochádza k nahradeniu slova a vysvetlenie ako samotné nahradenie prebieha sú uvedené nižšie.

Ukážka príkazu spustenia programu:

./program -r replace_string arg1 arg2 ar3
  • CMD argument replace_string je povinným parametrom prepínača -r.
  • CMD argumenty arg1, arg2 a arg3 predstavujú množinu N, t.j. non-option argumenty programu.

Ktoré slová v načítanom riadku sú nahradené pomocou reťazca replace_string?

  • Ak je množina N neprázdna. Pre každé jedno slovo wi v množine W hľadáme jeho case-sensitive predponu v množine N, t.j. zisťujeme, či množina N neobsahuje reťazec, ktorý by bol jeho case-sensitive predponou. Ak pre skúmané slovo wi nájdeme case-sensitive predponu v množine N, potom dôjde k nahradeniu slova wi 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 replace_string.

Akým spôsobom prebieha nahrádzanie slova v riadku pomocou reťazca replace_string?

Postupne nahrádzame znaky skúmaného slova wi znakmi reťazca replace_string. Musíme rešpektovať veľkosť písmen (z angl. case) v reťazci replace_string. Ak je replace_string kratší ako slovo wi, nahradíme len príslušnú časť slova wi a jeho zvyšok ponecháme nezmenený. Ak je replace_string dlhší ako slovo wi, nahrádzanie prebieha len po koniec slova wi.

Príklady prepínača -r

Ukážky obsahujú spustenie programu v termináli, načítaný riadok a pod ním vypísaný výsledok spracovania riadku pomocou prepínača -r.

Prípad, kedy je množina N prázdna.
./program -d -p -r PaPa123
:::Ahoj*** ako sa+dnes.mas?  alfanumericky+programatorsky OK123 ???
:::PaPa*** PaP Pa+PaPa.PaP?  PaPa123ericky+PaPa123atorsky PaPa1 ???
Prípad, kedy množina N obsahuje 1 reťazec.
./program -d -p -r 4GreaT4 Fix
fix FIxka Fixacia ohen 856 Fixinela Fix.Fix+Fix    Fixo*FixFixFixFix
fix FIxka 4GreaT4 ohen 856 4GreaT4a 4Gr.4Gr+4Gr    4Gre*4GreaT4ixFix
Prípad, kedy množina N obsahuje 3 reťazce.
./program -d -p -r heSlo123 pri Nie TRI
Priehrada.pri.pri666tomny.priNiest.Nieco.Nieco.niekto.TRI.TRIsto.TRI333
Priehrada.heS.heSlo123mny.heSlo123.heSlo.heSlo.niekto.heS.heSlo1.heSlo1

3.3 Case-insensitive režim

Vykoná sa ak je zadaný prepínač -R a jeho povinný parameter replace_string, pomocou ktorého nahrádzame slová v množine W. Počas tejto operácie postupne prechádzame slová v množine W zľava doprava a nahrádzame ich pomocou reťazca replace_string. Ostatné znaky riadku, ktoré netvoria slová zostávajú nezmenené. Podmienky kedy dochádza k nahradeniu slova a vysvetlenie ako samotné nahradenie prebieha sú uvedené nižšie.

Ukážka príkazu spustenia programu:

./program -R replace_string arg1 arg2 ar3
  • CMD argument replace_string je povinným parametrom prepínača -R.
  • CMD argumenty arg1, arg2 a arg3 predstavujú množinu N, t.j. non-option argumenty programu.

Ktoré slová v načítanom riadku sú nahradené pomocou reťazca replace_string?

  • Ak je množina N neprázdna. Pre každé jedno slovo wi v množine W hľadáme jeho case-insensitive predponu v množine N, t.j. zisťujeme, či množina N neobsahuje reťazec, ktorý by bol jeho case-insensitive predponou. Ak pre skúmané slovo wi nájdeme case-insensitive predponu v množine N, potom dôjde k nahradeniu slova wi 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 replace_string.

Akým spôsobom prebieha nahrádzanie slova v riadku pomocou reťazca replace_string?

Postupne nahrádzame znaky skúmaného slova wi znakmi reťazca replace_string. Pri alfabetických znakoch reťazca replace_string musíme nastaviť veľkosť nahradeného písmena tak, aby korešpondovala s veľkosťou písmena na rovnakej pozícii v slove wi. Pri nahrádzaní numerických znakov v slove wi alfabetickými z reťazca replace_string, zachovávame veľkosť písmen z reťazca replace_string.

Ak je replace_string kratší ako slovo wi, nahradíme len príslušnú časť slova wi a jeho zvyšok ponecháme nezmenený. Ak je replace_string dlhší ako slovo wi, nahrádzanie prebieha len po koniec slova wi.

Príklady prepínača -R

Ukážky obsahujú spustenie programu v termináli, načítaný riadok a pod ním vypísaný výsledok spracovania riadku pomocou prepínača -R.

Prípad, kedy je množina N prázdna.
./program -d -p -R REPlace555
M n SaTurDay hello 123 123456789 rePLace123 BriGhTNESS aAaaaaAa*bXbb.P6p
R r RePlaCe5 repla REP REPlace55 rePLace555 RepLaCE555 rEplacE5*rEpl.REp
Prípad, kedy množina N obsahuje 1 reťazec.
./program -d -p -R JakuBiSKO auto
auto AuTomatizacia213 AUTO automatika Australia aUtO1111 anglicko 456 aUtomobilka
jaku JaKubiskoacia213 JAKU jakubiskoa Australia jAkUBiSK anglicko 456 jAkubiskoka
Prípad, kedy množina N obsahuje 4 reťazce.
./program -d -p -R 12Havo sto D Pries 888
15 pRieStoR priemer dom STOkrat 888 8 Dvere d9r70+Stopka.percent
15 12haVooR priemer 12h 12Havot 12H 8 12hav 12hav+12havo.percent

Súvisiace zdroje, ktoré môžu pomôcť pri implementácii prepínačov -r a -R:

Výstup

Každý riadok sa po spracovaní vypíše na štandardný výstup. Okrem spracovaných riadkov sa nevypisuje žiadny iný text.

Hodnotenie zadania

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

Testovacie scenáre
Scenár 1
Chybová situácia 1.
0.5b
Scenár 2
Chybová situácia 2.
0.5b
Scenár 3
Spustenie programu bez prepínačov.
1.0b
Scenár 4
Len prepínač -d.
0.5b
Scenár 5
Len prepínač -p.
0.5b
Scenár 6
Kombinácia prepínačov -d a -p.
0.5b
Scenár 7
Vstupná operácia + prepínač -l.
0.5b
Scenár 8
Vstupná operácia + prepínač -u.
0.5b
Scenár 9
Vstupná operácia + prepínač -r. Bez non-option argumentov.
1.0b
Scenár 10
Vstupná operácia + prepínač -r. So zadanými non-option argumentami.
1.0b
Scenár 11
Vstupná operácia + prepínač -R. Bez non-option argumentov.
1.0b
Scenár 12
Vstupná operácia + prepínač -R. So zadanými non-option argumentami.
1.0b
Scenár 13
Rôzne platné kombinácie všetkých prepínačov.
1.5b
Súčet 10 b

Poznámka: Počas testovania budú použité vstupné texty s rôznym počtom riadkov.

Video

Záznam zo seminára č. 6 (22. marec 2022)

Testovacie príklady

Zoznam blokov:
  • Blok 1: Chybová situácia 1.
  • Blok 2: Chybová situácia 2.
  • Blok 3: Spustenie programu bez prepínačov.
  • Blok 4: Len prepínač -d.
  • Blok 5: Len prepínač -p.
  • Blok 6: Kombinácia prepínačov -d a -p.
  • Blok 7: Vstupná operácia + prepínač -l.
  • Blok 8: Vstupná operácia + prepínač -u.
  • Blok 9: Vstupná operácia + prepínač -r. Bez non-option argumentov.
  • Blok 10: Vstupná operácia + prepínač -r. So zadanými non-option argumentami.
  • Blok 11: Vstupná operácia + prepínač -R. Bez non-option argumentov.
  • Blok 12: Vstupná operácia + prepínač -R. So zadanými non-option argumentami.
  • Blok 13: Rôzne platné kombinácie všetkých prepínačov.

Blok 1

Chybová situácia 1.

Príklad 1

Spustenie programu:

./z3 -a

Program skončí bez výstupu a vráti hodnotu 1.

Príklad 2

Spustenie programu:

./z3 -p -h -u

Program skončí bez výstupu a vráti hodnotu 1.

Príklad 3

Spustenie programu:

./z3 -d -l -e -R work a b c

Program skončí bez výstupu a vráti hodnotu 1.

Blok 2

Chybová situácia 2.

Príklad 1

Spustenie programu:

./z3 -d -R

Program skončí bez výstupu a vráti hodnotu 2.

Príklad 2

Spustenie programu:

./z3 -p -u -d -r

Program skončí bez výstupu a vráti hodnotu 2.

Blok 3

Spustenie programu bez prepínačov.

Príklad 1

Spustenie programu:

./z3

Vstup:

obycajne slova v riadku
123 cisla spolu s 896 pismenami
+ SLOVA Pis/mena 98?6 cisla In&terpun...kcia
vela medzier A         Z
124356u794685
[]45,4./9*+Q

Výstup:

obycajne slova v riadku
 cisla spolu s  pismenami
 SLOVA Pismena  cisla Interpunkcia
vela medzier A         Z
u
Q

Blok 4

Len prepínač -d.

Príklad 1

Spustenie programu:

./z3 -d

Vstup:

123456 1 2 3
abecdefgh
9 Otazka a Odpoved 5
9*-7845-+ +96
a*a*a*a
     1
98s45tuop*-+ *5fRLx126  9*+e

Výstup:

123456 1 2 3
abecdefgh
9 Otazka a Odpoved 5
97845 96
aaaa
     1
98s45tuop 5fRLx126  9e

Blok 5

Len prepínač -p.

Príklad 1

Spustenie programu:

./z3 -p

Vstup:

???+-*/ )(*&%$#     [.]
72mozno 1236preto lebo ?45
111:11111
aaa bbb c
***3333***
999977777!

Výstup:

???+-*/ )(*&%$#     [.]
mozno preto lebo ?
:
aaa bbb c
******
!

Blok 6

Kombinácia prepínačov -d a -p.

Príklad 1

Spustenie programu:

./z3 -p -d
./z3 -d -p

Vstup:

jednoducha veta je najkrajsia
?
8
A
555   ---- ++++
aaa PPPRL 9 6    u
   ]]]]]] ===
99999 7777 4444
a5445UI./-*-R85SPe56.*

Výstup:

jednoducha veta je najkrajsia
?
8
A
555   ---- ++++
aaa PPPRL 9 6    u
   ]]]]]] ===
99999 7777 4444
a5445UI./-*-R85SPe56.*

Blok 7

Vstupná operácia + prepínač -l.

Príklad 1

Spustenie programu:

./z3 -l

Vstup:

VSETKO JE PISANE VELKYMI PISMENAMI
malinke pismenka
1 2 a3 4 5 6
++++++W+
hOrE-DoLe
eeWeee+++F++RRRRR99999

Výstup:

vsetko je pisane velkymi pismenami
malinke pismenka
  a   
w
horedole
eeweeefrrrrr
Príklad 2

Spustenie programu:

./z3 -d -l
./z3 -l -d

Vstup:

  98 56 gr 951 WPL wOnHdB
1800
====14===
@@@@@@eeee9865
WHEEEEEL.
To LowerCase

Výstup:

  98 56 gr 951 wpl wonhdb
1800
14
eeee9865
wheeeeel
to lowercase
Príklad 3

Spustenie programu:

./z3 -p -l
./z3 -l -p

Vstup:

'''''''
88888888888888+
aaaaaaaaaaa
EEEEEEE
PPppPpPpMjUyHbGfDeWsAq
*4+Egu+6TS5*/'STIO';H9S
Y                  Y
PapA PLease giVE Me tHe moOn
7000PE74RFE748KTN1253Y D1E6N9

Výstup:

'''''''
+
aaaaaaaaaaa
eeeeeee
ppppppppmjuyhbgfdewsaq
*+egu+ts*/'stio';hs
y                  y
papa please give me the moon
perfektny den
Príklad 4

Spustenie programu:

./z3 -p -d -l

Vstup:

777 Velmi D\O\B\R\Y    VYSL\EDOk?
???? !!!!
    9 8 800
aaaano 14
16NIEE
A bc CDEFGH 1.9.3.1 Q89Q9Q9 U/U/U/U/U PARDON

Výstup:

777 velmi d\o\b\r\y    vysl\edok?
???? !!!!
    9 8 800
aaaano 14
16niee
a bc cdefgh 1.9.3.1 q89q9q9 u/u/u/u/u pardon

Blok 8

Vstupná operácia + prepínač -u.

Príklad 1

Spustenie programu:

./z3 -u

Vstup:

1.6,9/3[L
dva krat dva
STO PLUS OSEM
CISLO 1963 T
$$$$ 123 SLOVO slovko

Výstup:

L
DVA KRAT DVA
STO PLUS OSEM
CISLO  T
  SLOVO SLOVKO
Príklad 2

Spustenie programu:

./z3 -d -u
./z3 -u -d

Vstup:

1236 fymk PLEC wv5u1n96w U5ET5X5W5 w.h.y.g.sd fUY4GKpe59vnHX
999983
ERFGT 6581
963258 4 tools for good people

Výstup:

1236 FYMK PLEC WV5U1N96W U5ET5X5W5 WHYGSD FUY4GKPE59VNHX
999983
ERFGT 6581
963258 4 TOOLS FOR GOOD PEOPLE
Príklad 3

Spustenie programu:

./z3 -p -u
./z3 -u -p

Vstup:

please lift me up
THERE IS NOTHING TO DO
So5meTIMES ? WE des4irE @ mORe7
.......9......
//-----w-#
The.World.Has.Totally.Changed.

Výstup:

PLEASE LIFT ME UP
THERE IS NOTHING TO DO
SOMETIMES ? WE DESIRE @ MORE
.............
//-----W-#
THE.WORLD.HAS.TOTALLY.CHANGED.
Príklad 4

Spustenie programu:

./z3 -d -p -u

Vstup:

.z
p
985 475 26 15489658
--.-.-.-.-
AAA PPOOO   LRPTKSJS
sfjsdklfj tert w qwe e asd asd
df5*46df(* 5g456g4 5@6h45,./s*-82 ,.1/sd+5

Výstup:

.Z
P
985 475 26 15489658
--.-.-.-.-
AAA PPOOO   LRPTKSJS
SFJSDKLFJ TERT W QWE E ASD ASD
DF5*46DF(* 5G456G4 5@6H45,./S*-82 ,.1/SD+5

Blok 9

Vstupná operácia + prepínač -r. Bez non-option argumentov.

Príklad 1

Spustenie programu:

./z3 -r KLADIvo

Vstup:

r pl KOW
WEWE457786786AFSF
dfg******1125663ERFGT PLOK
velmidlheslovo vodopad
uik 98955weqwe /././.qaWWPr

Výstup:

K KL KLA
KLADIvoF
KLADIvoT KLAD
KLADIvoheslovo KLADIvo
KLA KLADI KLADIv
Príklad 2

Spustenie programu:

./z3 -d -p -r rU8

Vstup:

a    B     9+7  pl  W8s   w.9.Y  reg 489
word1 word2 word3
sh LOOOONG
F4SF4S6  ER4ERT54E6R d98sdf1iii
------?   ...

Výstup:

r    r     r+r  rU  rU8   r.r.r  rU8 rU8
rU8d1 rU8d2 rU8d3
rU rU8OONG
rU8F4S6  rU8ERT54E6R rU8sdf1iii
------?   ...

Blok 10

Vstupná operácia + prepínač -r. So zadanými non-option argumentami.

Príklad 1

Spustenie programu:

./z3 -d -p -r 123LEKvar 429 BI stro

Vstup:

karta BImetal+BIt 964 BI111-4299854 DIELO strom   stromCEK/429friolk
111 222 555 444
STRO
stro
Bi
strojnyMechanik

Výstup:

karta 123LEKv+123 964 123LE-123LEKv DIELO 123LE   123LEKva/123LEKvar
111 222 555 444
STRO
123L
Bi
123LEKvarchanik

Blok 11

Vstupná operácia + prepínač -R. Bez non-option argumentov.

Príklad 1

Spustenie programu:

./z3 -R AgnoStiC6

Vstup:

4685p
..66R6....
R Pl aHoj PKyHnBgVP psdkKJJyBfsZaQ
4SD6F5SDFu4F.SD.F.S
BIIGsmaaall

Výstup:

a
A
A Ag aGno AGnOsTiC6 agnoSTIc6fsZaQ
AGNOSTiC6DFS
AGNOstic6ll
Príklad 2

Spustenie programu:

./z3 -d -p -R peer2PEER

Vstup:

1   123 54654654
.... **** -
a hj OP WSDR rtghnmj
lll.Repl5454RPiii.RTRPTRTPRTPwopl.
SiDF,SF,Sq54DFdd5F,54F,5F4,5FdddT4WAE,p45IRxprjR54b,5SW4P

Výstup:

p   pee peer2PEE
.... **** -
p pe PE PEER peer2pe
pee.Peer2PEERPiii.PEER2PEERTPwopl.
PeER,PE,Peer2PeeRF,peE,pEe,pEer2PEERE,peeR2peerR54b,pEEr2

Blok 12

Vstupná operácia + prepínač -R. So zadanými non-option argumentami.

Príklad 1

Spustenie programu:

./z3 -d -p -R waYTooG2D a 123 2Sa

Vstup:

anton ALGEBRA AAAAAAAAAAAAAAAA
1 12 123 12345678
2samaritan 2SAUDSKAarabia 2sA
AmERika+2SAlko.123
tramVAJ letisko.LAMPION
???????

Výstup:

wayto WAYTOOG WAYTOOG2DAAAAAAA
1 12 waY waYTooG2
waytoog2dn wAYTOOG2drabia waY
WaYToog+wAYtoo.waY
tramVAJ letisko.LAMPION
???????

Blok 13

Rôzne platné kombinácie všetkých prepínačov.

Príklad 1

Spustenie programu:

./z3 -l -r Soul -d vel 33dub

Vstup:

VELKA NOC
3++3+Dubnica
duB
*****V.E=Lodrom
++++959/6
.... vE**Lecip klokan 33dU*bovc*ov 963 33
ve
33du
vel

Výstup:

Soula noc
Soulbnica
dub
Souldrom
9596
 Soulcip klokan Soulbovcov 963 33
ve
33du
Sou
Príklad 2

Spustenie programu:

./z3 -r 123456 -p -d -u NE

Vstup:

nedela
n
NEvolnost
nedobrovolnost
system
15
.netreba.neplnolety+nervy
VLOCKA=neoliT
nez
neboj

Výstup:

123456
N
123456OST
123456OVOLNOST
SYSTEM
15
.123456A.123456LETY+12345
VLOCKA=123456
123
12345
Príklad 3

Spustenie programu:

./z3 -p -l -R Dubnica x mie POL

Vstup:

POL
polka
MIESTO
X
xx
XXX
X...X....X
MIERUMILOVNY
X12596523626 X4
9MI4E9nk1256a
brana LECO
Xorg.x8888.3257MIE,,74..   POLOVICA+XdeLEgaCIA

Výstup:

dub
dubni
dubnic
d
du
dub
d...d....d
dubnicalovny
d d
dubnic
brana leco
dubn.d.dub,,..   dubnicaa+dubnicacia
Výstup vášho programu si viete porovnať s očakávaným výstupom pomocou Diff nástroja.

Zdroje

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

Prednášky
  1. Prednáška 5: Pointers
  2. Prednáška 6: Reťazce
Jazyk C
  1. Neoficiálna príručka jazyka C. Veľmi dobré na vyhľadávanie knižničných funkcíí, obsahuje popis parametrov funkcíí, návratových hodnôt a príklady.
  2. Oficiálna príručka jazyka C (kompatibilná so štandardom). Veľmi dobré na vyhľadávanie knižničných funkcíí, obsahuje popis parametrov funkcíí, návratových hodnôt a príklady. Je to najspoľahlivejší zdroj informácií, avšak prezentovaný veľmi technicky a pre začiatočníkov miestami náročne na pochopenie.
  3. Knižničné funkcie jazyka C na manipuláciu s reťazcami
  4. C strings
  5. String Manipulations In C Programming Using Library Functions
  6. String Examples in C Programming
Ostatné
  1. Použité grafické materiály.
Copyright © 2022, Pavol Marák, ÚIM FEI STU.
Vyrobené pomocou Django a Spectre.css.
Videá prehrávame pomocou Plyr prehrávača.
Responzívny dizajn testujeme pomocou Responsive Viewer.