Warning
This page is located in archive. Go to the latest version of this course pages.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision Both sides next revision
courses:b3b36prg:hw:hw04 [2018/02/18 07:44]
faiglj [HW 04 - Hledání textu v souborech]
courses:b3b36prg:hw:hw04 [2018/02/18 19:31]
faiglj
Line 8: Line 8:
 ^ Počet uploadů |  20 |  ^ Počet uploadů |  20 | 
  
 +===== Povinné zadání =====
  
-====== Povinné zadání ======+<wrap alert>​Bez použití knihovny <​string.h></​wrap>​ (nebo podobné) napište program, který ze zadaného souboru vypíše všechny řádky obsahující zadaný řetězec. Budete tak implementovat zjednodušenou verzi programu grep pro příkazový řádek, který je dostupný ve většině operačních systémů Unixového typu.
  
-  * Bez použití knihovny ''​<string.h>''​ (nebo podobné) napište ​program, který ze zadaného souboru ''​FILE''​ vypíše všechny řádky obsahující ​řetězec ​''​PATTERN''​. +Program bude volán ve tvaru: 
-  * následně volán s argumenty ''​./​grep PATTERN ​FILE''​. +<code>./program ​PATTERN ​FILE</​code>​ 
-  * Za konec řádku je považován znak '''​\n'''​ (a tento znak není povážován za součást řádku).+kde PATTERN je hledaný ​řetězecFILE název souboru.
  
-/* Program implementujte v souboru ''​grep.c'',​ který ​bude kompilován jako <code c> +V případě jakékoli chyby vypište smysluplný důvod chyby na standardní chybový výstup a program ​bude ukončen s nenulovou návratovou hodnotou.
-gcc grep.c -Wall -Werror -pedantic -g -std=c99 -o grep +
-</​code>​ */ +
-==== Příklad 1 ====+
  
-^    ^  Očekávaný výstup ​ ^  Očekávaný chybový výstup ​ ^  Návratová hodnota ​ ^ +Program implementujte v souboru ​grep.c
-| <​code>​ $ ./grep "​string.h"​ grep.c +
- # kde grep.c ​je váš zdrojový soubor +
-</​code>​ |  žádný ​ |  žádný ​ |  0  |+
  
 +Pro rozpoznání konce řádku je možné používat znak '​\n'​.
  
-==== Příklad 2  ====+<wrap important>​V případě prázdeného výstupu ukončete program s návratovou hodnotou **1**.</​wrap>​
  
-^  ​PATTERN ​ ​^  ​Vstupní soubor ​ ​^ ​ Očekávaný výstup ​ ^  Očekávaný chybový výstup ​ ^  Návratová hodnota ​ ^+/* 
 +Příklad možných situací k ošetření:​ 
 +     * Vstupní argumenty nejsou zadány. 
 +     * Vstupní soubor neexistuje nebo nejde načíst. 
 +     * Při čtení se vyskytla chyba např. čtení se nezdařilo nebo dynamická alokace paměti selhala.  
 + 
 +*/ 
 + 
 +==== Příklad 1 ==== 
 + 
 +První příklad je motivován praktickou ukázkou, jak v Ubuntu zjistit velikost volné operační paměti z příkazové řádky. 
 + 
 +<​code>​grep MemFr /​proc/​meminfo</​code>​ 
 +<​code>​./​program MemFr /​proc/​meminfo</​code>​ 
 + 
 +^  ​Obsah vstupního souboru ​ ​^  ​Řetězec PATTERN ​ ​^ ​ Očekávaný výstup ​ ^  Očekávaný chybový výstup ​ ^  Návratová hodnota ​ ^
 | <​code>​ | <​code>​
-vzor+MemTotal: ​      ​16430396 kB 
 +MemFree: ​        ​4848016 kB 
 +MemAvailable: ​  ​11697864 kB 
 +Buffers: ​        ​1139932 kB 
 +Cached: ​         5662728 kB 
 +...
 </​code>​ | <​code>​ </​code>​ | <​code>​
-Tady je jeden vzor. A jeste jeden vzor. +MemFr
-A tady neni zadny.+
 </​code>​ | <​code>​ </​code>​ | <​code>​
-Tady je jeden vzor. A jeste jeden vzor.+MemFree: ​        ​4848016 kB
 </​code>​ |  žádný ​ |  0  | </​code>​ |  žádný ​ |  0  |
  
 +==== Příklad 2 ====
  
-==== Příklad 3  ====+Prázdný výstup 
 +<​code>​grep NeexistujiciText /​proc/​meminfo</​code>​
  
-^  ​PATTERN ​ ​^  ​Vstupní soubor ​ ​^ ​ Očekávaný výstup ​ ^  Očekávaný chybový výstup ​ ^  Návratová hodnota ​ ^+^  ​Obsah vstupního souboru ​ ​^  ​Řetězec PATTERN ​ ​^ ​ Očekávaný výstup ​ ^  Očekávaný chybový výstup ​ ^  Návratová hodnota ​ ^
 | <​code>​ | <​code>​
-Vzor+MemTotal: ​      ​16430396 kB 
 +MemFree: ​        ​4848016 kB 
 +MemAvailable: ​  ​11697864 kB 
 +Buffers: ​        ​1139932 kB 
 +Cached: ​         5662728 kB 
 +...
 </​code>​ | <​code>​ </​code>​ | <​code>​
-Tady je jeden vzor. A jeste jeden vzor. +NeexistujiciText 
-A tady neni zadny. +</​code>​ |  žádný ​ |  žádný ​ |  ​ |
-</​code>​ |  žádný ​ |  žádný ​ |  ​ |+
  
  
 +===== Volitelné zadání =====
  
-====== Volitené ​zadání ​======+Ve volitelné části můžete přidat tři různé funkcionality,​ za které můžete získat body. Počet argumentů tedy již nebude konstantní a program bude volán ve tvaru: 
 +<​code>​./​program [OPTIONS] PATTERN [FILE]</​code>​ 
 +kde PATTERN je hledaný řetězec, FILE název souboru a OPTIONS jsou volitelné argumenty pro volitelné ​zadání.
  
-Volitelné zadání rozšiřuje povinné zadání o precizované ošetření možných vstupů. Proto  +==== A - Přesměrování ​na standartní vstup (0.5b) ====
-v případě jakékoli chyby vypište smysluplný důvod chyby na standardní chybový výstup a program bude ukončen s definovanou nenulovou návratovou hodnotou+
  
-Chybykteré byste měli detekovat, jsou uvedeny v následující tabulce.+Pokud nebude zadán argument volitelný argument FILEbude jako vstup použit **stdin**. Díky tomu je možné přesměrovat výstup jiného programu a filtrovat tak jeho výstup.
  
-Chyby se musí vyhodnocovat v níže uvedeném pořadí. To znamená, že pokud se program zavolá jako <​code>​./grep ''​</​code> ​pak program vyhodnoti chybu podle prvního řádku a skončí (nikoli podle druhého řádku).+<​code>​dmesg | grep dvd</​code>​
  
-^  Chyba  ^  Očekávaný chybový výstup ​ ^  Návratová hodnota ​ ^ +Příklad výstupu: 
-| Nejsou uvedeny oba arumenty | <​code>​Error: Chybejici argument(y).</​code>​ |  100  | +<​code>​ 
-| Argument PATTERN je prázdnýMůžete otestovat<​code>​./grep ''​ soubor.c<​/code> | <​code>​Error:​ Prazdny PATTERN.<​/code> |  101  | +[    2.653604] sr 5:0:0:0: [sr0] scsi3-mmc drive: 48x/48x writer dvd-ram cd/rw xa/form2 cdda tray 
-| Neexistující vstupní soubor. | <​code>​Error:​ Soubor nelze otevrit.</​code>​ |  102  | +</​code>​
-| Nepodařilo se dynamicky alokovat paměť. | <​code>​Error:​ Alokace pameti selhala.</​code> ​|  200  |+
  
 +==== B - Regulární výrazy (1b) ====
  
-====== Odevzdávané soubory a kompilace ======+Pouze speciální symboly [*,+,?] bez závorkování. Speciální symbol se vyskytuje maximálně jednou.
  
-/+<​code>​./​program ​-E PATTERN [FILE]</​code>​
-Odevzdávejte soubory *.h a *.c. Pouze soubor ''​grep.c''​ může obsahovat funkci ''​main()'', ​program ​však může být složen z více souborů. Všechny soubory uložte přímo do zip archivu a **nevytvářejte žádné složky**. ​+
  
-**<fc #​ff0000>​Povinné soubory</​fc>​**: +[[https://​en.wikipedia.org/​wiki/​Regular_expression|Regulární výrazy]]
-*/+
  
-Odevzdávejte pouze jeden soubor:+=== Příklad 2 ===
  
-  * ''​grep.c'' ​       - implementace jednoduchého programu pro hledání řetězce v textových souborech (obsahuje funkci main)+^  Obsah vstupního souboru ​ ^  Řetězec ​'colou?r' ​ ​^ ​ Řetězec ​'colou*r' ​ ​^ ​ Řetězec '​colou+r' ​ ^ 
 +| <​code>​ 
 +color 
 +colour 
 +colouur 
 +colouuur 
 +</​code>​ | <​code>​ 
 +color 
 +colour 
 +</​code>​ | <​code>​ 
 +color 
 +colour 
 +colouur 
 +colouuur 
 +</​code>​ | <​code>​ 
 +colour 
 +colouur 
 +colouuur 
 +</​code>​ |
  
 +==== C - Obarvení výstupu (1.5b) ====
  
 +Obarvení PATTERN ve výstupu červenou barvou, stejně jako originální grep. Text je možné obarvit v terminálu pomocí přidání přesné sekvence znaku (Escape sequence) před a za obarvovaný text, viz. [[https://​en.wikipedia.org/​wiki/​ANSI_escape_code|ANSI escape code]]. ​ Tato funkcionalita se zapíná následujícím přepínačem:​
  
-^  ^  Povinné zadání ​ ^  Volitelné zadání  ​^+<​code>​./​program --color=always PATTERN [FILE]</​code>​ 
 + 
 +Používejte prosím stejné escape sekvence jako systémový grep, aby bylo možné výstup jednoduše zkontrolovat.  
 + 
 +^ ^ Před obarvený test ^ Za obarvený text ^ 
 +| Textový zápis| ESC[01;31m + ESC[K | ESC[m + ESC[K | 
 +| Hexadecimální zápis | 1b 5b 30 31 3b 33 31 6d  + 1b 5b 4b | 1b 5b 6d + 1b 5b 4b  |  
 + 
 +=== Příklad pub05-C === 
 + 
 +^  Obsah vstupního souboru ​ ^  Řetězec PATTERN ​ ^  Očekávaný výstup ​ ^  Očekávaný výstup (hexdump -C)  ^  
 +| <​code>​ 
 +Hello, hello 
 +Bye 
 +</​code>​ | <​code>​ 
 +el 
 +</​code>​ |  H<fc #​FF0000>​el</​fc>​lo,​ h<fc #​FF0000>​el</​fc>​lo ​ | <​code>​ 
 +00000000 ​ 48 1b 5b 30 31 3b 33 31  6d 1b 5b 4b 65 6c 1b 5b  |H.[01;​31m.[Kel.[| 
 +00000010 ​ 6d 1b 5b 4b 6c 6f 2c 20  68 1b 5b 30 31 3b 33 31  |m.[Klo, h.[01;31| 
 +00000020 ​ 6d 1b 5b 4b 65 6c 1b 5b  6d 1b 5b 4b 6c 6f 0a     ​|m.[Kel.[m.[Klo.| 
 +0000002f 
 +</​code> ​ | 
 + 
 + 
 +====== Odevzdání ====== 
 + 
 +Veřejné příklady + Makefile: {{:​courses:​b3b36prg:​hw:​prg-hw04.zip}} 
 + 
 +^  ^  Povinné zadání ​ ^  Volitelné zadání  ​|
 ^ Název v BRUTE |  HW04  || ^ Název v BRUTE |  HW04  ||
-^ Kompilace pomocí | gcc -std=c99 -Werror -Wall -pedantic ​||+^ Odevzdávané soubory |  grep.c ​ || 
 +^ Argumenty při spuštění |  žádné ​ |  --color=always -E  |  
 +^ Kompilace pomocí |  clang -pedantic -Wall -Werror ​-std=c99 ​ || 
 +^ Očekávaná časová složitost ((Kde $n$ je velikost vstupního souboru.)) |  $\mathcal{O}(n)$ ​ |  $\mathcal{O}(n^2)$ ((Složitost je dána použitím reulárních výrazů, jinak $\mathcal{O}(n)$. ))  | 
 + 
 +/* Toť otázka ​motivací bylo přepoužít zajímavé zadání 
 +^ Procvičované oblasti |    ​  ​| 
 +*/ 
courses/b3b36prg/hw/hw04.txt · Last modified: 2018/02/19 15:20 by faiglj