4 - Dekompozice programu

Cíle cvičení

  1. Dekompozice programu na funkce.
  2. Implementace funkčního a správného programu s ošetřením možných chybových stavů.

Materiály

Ú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.

  1. 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');
  2. Testujte chování programu pro špatný vstup, např. clang main.c && echo “1” | ./a.out ; echo $?.
  3. 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).
  4. 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”
  5. 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.
  6. Dekomponujte tisk trojúhelníku na funkce
    • void print_triangle(char c, int lines); a
    • void print_line(char c, int n);
  7. Zjednodušte hlavní funkci definováním funkcí
    • int read_input(int *n); a
    • int print_error(int ret, int n);
  8. 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 <input > out.std 2> out.err.
  9. Program rozšiřte o zpracování argumentů programu argc a argv s využitím funkce sscanf().

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 main_env.c) s nastavení LOCALE (understanding-locale-environment-variables)
  • int main(int argc, char *argv[], char *envp[])
courses/b0b36prp/labs/lab04.txt · Last modified: 2024/09/15 16:46 by faiglj