{{indexmenu_n>3}}
====== Lab 03 - Dekompozice programu ======
* Pro vyučující: [[courses:bab36prga:internal:tutorialinstruction:03|]]
*
{{ :courses:bab36prga:labs:prg-lab03.zip |Výchozí soubory lab03-sources.zip}}
===== Úkoly =====
Implementujte program, který přečte ze standardního vstupu celé číslo, které by mělo být v rozsahu 1 až 10 a vytiskne následující trojúhelník, např. pro n=4.
****
***
**
*
Při implementaci funkční program postupně rošiřujte o ošetření chybných vstupů, reportování chyb, případně dekompozici tisknutí trojúhelníku na tisknutí řádků, např. v následujících krocích.
- Implementace základní trivální implementace s využitím ''scanf()'' a dvou (vnořených) for cyklů s ''putchar('*')'' a odřádkováním ''putchar('\n')'';
- Testujte chování programu pro špatný vstup, např. ''clang main.c && echo "1" | ./a.out ; echo $?''.
- Rozšiřte program o kontrolu rozsahu načtené hodnoty a testování návratové hodnoty funkce ''scanf()'' (viz ''man scanf''), např. pro neceločíselný vstup nebo prázdný vstup (např. přesměrovaný ze souboru ''touch in.txt; ./a.out < in.txt'' nebo ukončení vstupu ''CTRL+D'').
- Rozšiřte program o reportování chybného vstupu návratovou hodnotou programu ''100'' a ''101'' s výstupem.
* 100 - ''"ERROR: Cannot read integer value from the standard input\n"''
* 101 - ''"ERROR: Given value %d is not within the range [1, 10]\n"''
- Hodnoty rozsahu 1 a 100 nahraďte definovanými makry ''MIN_VALUE'' a ''MAX_VALUE'' s možností ovlivnění maximální hodnoty při kompilaci , např. ''clang -DMAX_VALUE=100''. Otestujete chování programu pro ruzné vstupy a kompilace s různými hodnotami.
- Dekomponujte tisk trojúhelníku na funkce
* ''void print_triangle(char c, int lines);'' a
* ''void print_line(char c, int n);''
- Zjednodušte hlavní funkci definováním funkcí
* ''int read_input(int *n);'' a
* ''int print_error(int ret, int n);''
- Upravte program pro tisk chybových zpráv na ''stderr'' funkcí ''fprintf()'' a otestujete chování programu s přesměrováním vstupu a výstupu, např. ''./main out.std 2> out.err''.
- Program rozšiřte o zpracování argumentů programu ''argc'' a ''argv'' s využitím funkce ''sscanf()''.
{{:courses:bab36prga:internal:tutorialinstruction:triangle.png?1000|}}
==== Pokročilé úkoly ====
* Program rozšířte o výpisy jak v angličtině tak češtině s využítím proměnné prostředí env (viz ''lec01/main_env.c'') s nastavení LOCALE ([[https://www.ibm.com/docs/en/aix/7.1?topic=locales-understanding-locale-environment-variables|understanding-locale-environment-variables]])
* ''int main(int argc, char **argv, char **envp)''