{{indexmenu_n>3}} ====== Lab 03 - Dekompozice programu ====== * Pro vyučující: [[courses:b3b36prg:internal:tutorialinstruction:03|]]. {{ :courses:b3b36prg:labs:prg-lab03.zip |Výchozí soubory prg-lab03.zip}} //(Pokročilé úkoly)// ===== Cíle cvičení ===== - Dekompozice programu na funkce. - Implementace funkčního a správného programu s ošetřením možných chybových stavů. ===== Ú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 10 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í program s přesměrováním vstup a výstup, 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:b3b36prg: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 ''lec03/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)