CourseWare Wiki
Switch Term
Summer 2023 / 2024
Summer 2022 / 2023
Summer 2021 / 2022
Summer 2020 / 2021
Summer 2019 / 2020
Summer 2018 / 2019
Summer 2017 / 2018
Older
Search
Log In
b172
courses
b3b36prg
hw
hw04
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.
View differences:
Side by Side
Inline
Go
Link to this comparison view
2018/02/19 15:20 faiglj [HW 04 - Hledání textu v souborech]
2018/02/19 15:20 faiglj [HW 04 - Hledání textu v souborech]
2018/02/18 19:31 faiglj
2018/02/18 07:44 faiglj [HW 04 - Hledání textu v souborech]
2018/02/06 17:18 external edit
Go
Next revision
Previous revision
2018/02/19 15:20 faiglj [HW 04 - Hledání textu v souborech]
2018/02/19 15:20 faiglj [HW 04 - Hledání textu v souborech]
2018/02/18 19:31 faiglj
2018/02/18 07:44 faiglj [HW 04 - Hledání textu v souborech]
2018/02/06 17:18 external edit
Go
Last revision
Both sides next revision
courses:b3b36prg:hw:hw04 [2018/02/06 17:18]
127.0.0.1
external edit
courses:b3b36prg:hw:hw04 [2018/02/19 15:20]
faiglj
[HW 04 - Hledání textu v souborech]
Line 2:
Line 2:
======== HW 04 - Hledání textu v souborech ========
======== HW 04 - Hledání textu v souborech ========
-
^ Termín odevzdání | <wrap important>
25
.03.
2017
23:59 PDT</wrap> (([[https://www.timeanddate.com/time/zones/pst|PDT]]))|
+
^ Termín odevzdání | <wrap important>
24
.03.
2018
23:59 PDT</wrap> (([[https://www.timeanddate.com/time/zones/pst|PDT]]))|
^ Povinné zadání | 3b |
^ Povinné zadání | 3b |
-
^ Volitelné zadání | <wrap tip>
4b
</wrap>|
+
^ Volitelné zadání | <wrap tip>
3b
</wrap>|
^ Bonusové zadání | není |
^ Bonusové zadání | není |
^ 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ězec
,
FILE
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ý |
1
|
-
</code> | žádný | žádný |
0
|
+
+
===== 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
.
+
-
Chyby
,
které byste m
ě
li detekovat, jsou uvedeny v následující tabulce
.
+
Pokud nebude zadán argument volitelný argument FILE
,
bude 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