% Formátovaný vstup/výstup do/z programu, podmínka, kombinace podmínek, % rozhodování v algoritmu
\setcounter{section}{21}
- tzv. IO (input output) operace
- způsob komunikace programu se systémem, uživatelem a dalšími programy
- funkce poskytnuty knihovnou \inlistc{stdio.h}
- čtení vstupu z \inlistc{stdin}^[standard stream pro vstup v terminálu]
- funkce \inlistc{getchar();}, \inlistc{gets();}, \inlistc{scanf(, );}
- \inlistc{getchar} -- načtení jednoho znaku
- \inlistc{gets}
- načtení stringu s mezerami, nelze číst čísla
- konec inputu novým řádkem nebo EOF
- unsafe, chybí ochrana před buffer overflow
- \inlistc{scanf} -- načtení vstupu v zadaném formátu, konec inputu mezerou, \texttt{\textbackslash n} nebo EOF
\lstinputlisting[style=c, caption=Načtení vstupu od uživatele]{../source_codes/22-inputs.c}
- výpis textu do \inlistc{stdout} nebo \inlistc{stderr}
- \inlistc{stdout} -- standard stream pro output
- \inlistc{stderr} -- standard stream pro errory
- funkce \inlistc{putchar}, \inlistc{puts}, \inlistc{printf}, \inlistc{fwrite}
- \inlistc{putchar();} -- vypsání jednoho znaku
- \inlistc{puts();}
- funkce z knihovnyinlistc
- prostý výpis proměnné do \inlistc{stdout} bez formátování
- na konci automaticky \texttt{\textbackslash n}
- \inlistc{printf(, );}
- interpretace prvního stringu jako formátu
- následné proměnné specifikují hodnotu dat ve formátu
- nekončí automaticky novým řádkem
- \inlistc{fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);}
- \inlistc{*ptr} -- buffer na vypsání, \inlistc{size, nmemb} -- délka a počet dat
- zápis binárních dat do souboru nebo streamu
- využití formátovací značek pro definici formátu outputu -- \inlistc{%d, %i, %u, %c}\dots
- zápis do stringu
- formátovací značky různé pro každý data typ (viz otázka~21)
\lstinputlisting[style=c, caption=Použíti printf a scanf]{../source_codes/22-sums.c}
- způsob spouštění kódu za pomocí podmínek
- příkaz \inlistc{if (rule)\{...\} else \{...\}}
- pokud je podmínka splněna, je spuštěn kód v bloku; pokud není splněna, blok je přeskočen
- \inlistc{else} blok spuštěn pouze za nedodržení podmínky
- podmínka -- boolenový výraz
- v~C použit \inlistc{int}, případně \inlistc{bool} ze \inlistc{stdbool.h}
- \inlistc{true} -- nenulová hodnota (nejčastěji 1), \inlistc{false} -- 0
\begin{table}[htbp] \centering \begin{tabular}{>{\ttfamily}cc} \toprule \textnormal{Znak} & Význam\\ \midrule == & rovnost\\ != & nerovnost\\ < & menší než\\ <= & menší rovno\\ > & větší než\\ >= & větší rovno\\ && & AND\\ || & OR\\ ! & negace\\ \bottomrule \end{tabular} \caption{Logické operátory v~C} \end{table}
\lstinputlisting[style=c, caption=Příklad programu s podmínkou a if]{../source_codes/22-odd-even.c}
\begin{table}[htbp]
\centering
\begin{tabular}{>{\ttfamily}cc}
\toprule
\textnormal{Operátor} & Směr vyhodnocení\\
\midrule
! ++ -- - + &
-
- &
$\longrightarrow$ \\ < <= >= > &$\longrightarrow$ \\ == != &$\longrightarrow$ \\ && &$\longrightarrow$ \\ || &$\longrightarrow$ \\ ? : &$\longleftarrow$ \\ = += -= *= \dots &$\longrightarrow$ \\ , &$\longrightarrow$ \\ \bottomrule \end{tabular} \caption{Priorita vyhodnocování logických výrazů} \label{22operations} \end{table}
- &
- kombinování podmínek za pomocí logických operací \inlistc{&&} a \inlistc{||}
- první vyhodnocení podmínek, následně vyhodnocení kombinací (viz
tab.\ref{22operations}) - vyhodnocení zleva doprava
- logické výrazy možno skládat, závorky pro přednost\dots
- pokud v AND je první argument 0, další hodnoty již nejsou vyhodnoceny
\lstinputlisting[style=c, caption=Příklady boolenových operací]{../source_codes/22-comparision.c}