Druhá domácí úloha z předmětu IJC byla opět rozdělená na několik částí – vlastní implementace POSIXového příkazu tail (v C i C++) a přepis programu počítajícího četnost slov z C++ do C. Obzvlášť druhá část byla obávaná, protože bylo potřeba používat hashovací tabulku, kterou mnozí viděli poprvé. Navíc se předpokládala znalost používání modulů a statických/dynamických knihoven. Ani tak ale nebyl problém získat stejně jako z první domácí úlohy plný počet, tedy 15 bodů
Implementace tail v C
POSIXový příkaz tail vypisuje ze souboru (parametr nebo stdin) posledních 10 řádků. Dalším parametrem je možné počet řádků změnit, případně nevypisovat posledních n řádků, ale od n. řádku do konce souboru. Pro zjednodušení bylo dovoleno omezit si délku řádku, samozřejmě nějak rozumně, aby neomezovala běžné soubory, takže např. 1024 znaků.
Asi jediná zajímavá část byl právě výpis posledních n řádků. Alokoval jsem si buffer pro požadovaný počet řádků a s postupným procházením souboru jsem do něj ukládal řádky jako do FIFO paměti. Na konci pak virtuálně spojím oba konce bufferu a od současné pozice jdu dokola a vypisuju řádky, dokud se nevrátím na výchozí index. Dál už je to jenom omáčka okolo…
Implementace tail v C++
Ještě před zadáním projektu jsem čekal, že půjde o něco, kde opravdu poznáme ten zásadní rozdíl mezi C a C++, tady se to ale nekonalo. Až na detaily byl program stejný jako v C. Změna byla pouze v tom, že pro buffer nabízí C++ speciální objekt, takže není potřeba ručně alokovat a uvolňovat.
Wordcount aneb četnost slov
Tady už se rozdíl mezi C a C++ ukázal. Původní program v C++ má asi 20 řádků, zatímco klasické C se opravdu hodně nafouklo. Za vším stojí speciální objekt z C++ – asociativní pole, které je přímo stvořené pro tento typ úlohy (anebo byla spíš úloha stvořená pro asociativní pole C++?) a elegantně řeší problém.
V C je potřeba využít hashovací tabulku, což samo o sobě není zase takový problém. Mnohem zajímavější byl ale požadavek mít nad tabulkou vytvořený iterátor, což už si žádá trochu přemýšlení. O konkrétním řešení se nebudu rozepisovat, protože člověk, který chápe pojem iterátor, určitě tuší, jak na to
Tohle byla ta nejobávanější část, sice je trochu delší (už kvůli rozdělení do modulů), ale nějak hardcore mi nepřišla a jak se umí dr. Peringer rozparádit už asi nezjistím, neboť jsem si do dalšího semestru namísto C++ zapsal Javu (a opravdu to není ze strachu
).
Mé řešení hodnocené 15 body z 15 možných si můžete stáhnout tady