Zkouška 02.06.2011

Seznámení se základními principy operačního systému UNIX, převážně z uživatelského hlediska. Absolvent kurzu by měl být schopen napsat netriviální program v shellu.
Uživatelský avatar
Davpe
Matfyz(ák|ačka) level II
Příspěvky: 98
Registrován: 22. 9. 2010 16:07
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Zkouška 02.06.2011

Příspěvek od Davpe »

Dneska byl za úkol naprogramovat trošku modifikovaný příkaz join.

Parametry:

Kód: Vybrat vše

-t1 c     oddělovač polí prvního souboru [default: posloupnost bílých znaků]
-t2 c     oddělovač polí druhého souboru [default: posloupnost bílých znaků]
-t3 c     oddělovač polí výstupního souboru [default: mezera]
-1 n      číslo pole, ve kterém je klíč v prvním souboru [default: 1]
-2 n      číslo pole, ve kterém je klíč v druhém souboru  [default: 1]
-a1       (all) chci, aby výpis obsahoval všechny řádky prvního souboru (tedy i nespárované)
-a2       (all) chci, aby výpis obsahoval všechny řádky druhého souboru (tedy i nespárované)
-o string    formát výstupu 
vstupní soubor 1
vstupní soubor 2
Příklad parametru -o
1.7,2.3 - chci, aby ve výstupu bylo pole 7 z prvního souboru a potom pole 3 z druhého souboru.
Pole musí být přesně v pořadí, v jakém byla zadána
v případě, že je na začátku 0 (např. 0,1.7,2.3) tak na začátku musí být pole, podle kterého se joinovalo.
[default: pole s klíči, pak všechna pole z prvního souboru, která neobsahují klíč, pak všechna pole z druhého souboru, která neobsahují klíč ]
Pole ve výstupu jsou oddělena oddělovačem -t3

Poznámky Forsta:
Jsou povolena rozšíření, ale samozřejmě je zakázán příkaz join. Soubory už dostanete setříděné podle klíče. Soubory se nevlezou do paměti (jejich část už ano). Tohle omezení tu je kvůli tomu, abyste si to nemohli narvat do asociativních polí AWK a pak to jednoduše spárovat.

Poznámky (z diskuse o zadání):
Forst říkal, že to byla snad jedna z nejkratších diskuzí o zadání, co měl.
Z diskuze se i zjistilo, že řádky musíte vypsat sjoinované v pořadí, v jakém byly zadány, nemůžete si je prostě setřídit, vyřešít spárované řádky a pak vypsat ty nespárované).
Občas se říká, že Forst neřekne všechno, a čeká, že se na to zeptáte u diskuse. Když jsem se zeptal, jak vypadá výstup když uživatel zadá parametr -a1 i parametr -a2 zároveň, tak mi na to řekl že "ten uživatel je hovado" :D Každopádně tohle byl asi jeden z největších problémů téhle úlohy.
Jo a někdo tam odešel hned na začátku, protože neměl zápočet v grupíčku/sisu, ale měl ho jen slíbený, tak pozor na to (stačí, když mu ten konkrétní cvičící napíše mail).

Řešení (Forstovo):
Forst k vzorovému řešení použil příkaz sort -m (který si opravdu nepamatuju) a pak ještě nějaké vychytávky.
Docela kritizoval, že se spousta lidí na některé věci vykašlala a taky hodně kritizoval, že se nenaučili AWK protože spousta věcí v něm šla pěkně (třeba to -o ). Samozřejmě zmínil i, jak by se to dalo udělat i v shellu a šlo to...nějak
Kvadratické řešení (ale pěkně napsané) Forst ještě uznal, kubické a výš už ne, na to nadával.

Výsledky (zhruba) z 24 lidí:
3x 1
3x 2
3x 4
zbytek 3 nebo ústní
(u trojky dával vybrat, že člověk může i na ústní si to třeba zlepšit nebo zhoršit)

Jinak Forst skutečně nebazíruje na detailech a je hodný. Po písemce jsem zjistil, že tam mám 3 docela fatální chyby a že ten algoritmus prostě nic neudělá a dostal jsem bez okolků 1. Přitom jsem tam používal getline z AWK, o kterém Forst na přednášce říkal, že ho nemá moc rád (navíc je to rozšíření) a kdo ho použije, toho se zeptá, jak to udělat v shellu. Pokud jste si s problémem poradili a neudělali moc prasáren, tak projdete v pohodě. Na ústní většinou jdete, pokud Forst nepochopí, co jste mysleli.

Moje řešení (nástin):
Parsování parametrů jsem udělal v shellu, jinak jsem to všechno nabouchal do AWK (skutečně doporučuju se ho naučit, já se ho učil hned ze začátku jako kanón na všechno a vyplatí se to). Měl jsem to asi za hoďku a půl, bez kontroly, zda jsou parametry korektní (na to jsem se vykašlal). Celý kód jsem měl v BEGINu.

Formát -o:
Ten se díky splitu udělá jednoduše, prostě se to rozdělí podle čárek a pak teček a nasype se to do polí, jedno pro první soubor, druhé pole pro druhý soubor. Při výpisu se jen podívám, který prvek v poli mám zapnutý, a ten vypíšu.

Čtení z filů:
něco jako

Kód: Vybrat vše

FS=t1
while (getline < prvni_soubor) {
     for cyklem si celou radku dej do pole podle fieldů. Field, kde je klíč je zadáno v parametru.

     FS=t2
     while (getline < druhy_soubor) {
        for cyklem si celou radku dej do jiného pole podle fieldů. Field, kde je klíč je zadáno v parametru.
        teď jen porovnat, kde se pole shodují a šikovně (přes printf) vypsat. A ošetřit kdy je zapnuto a1 a a2
     }
    FS=t1
    close (druhy_soubor)
}
Ganef
Matfyz(ák|ačka) level I
Příspěvky: 8
Registrován: 19. 1. 2011 15:45
Typ studia: Informatika Bc.

Re: Zkouška 02.06.2011

Příspěvek od Ganef »

Ještě doporučím:

Pokud si věříte, že v té vaší písemce je dobrá myšlenka a máte přehled o tom, kde byste mohli mít chyby, tak se nebojte jít na ústní. Na té ústní si Forst znova projde to vaše řešení a má na to víc času, tak pak i víc uvidí do té myšlenky. Taky je dobrý pokud zvládnete pohotově reagovat. Mě se na ústní párkrát zeptal, kde v tomto řádku je syntaktická chyba a to jsem vždy našel. A asi mi i trochu pomohlo, že jsem to měl napsaný téměř celý.

Po ústní jsem dostal 1, i přesto, že jsem původně byl v hromádce 3.
squo314
Matfyz(ák|ačka) level I
Příspěvky: 8
Registrován: 8. 6. 2011 15:01
Typ studia: Informatika Bc.

Re: Zkouška 02.06.2011

Příspěvek od squo314 »

nacrtol by prosim niekto riesenie v shellu? dik :)
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“