%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Rychla reference k zakladum programovaciho jazyka C
%
%  Martin Bruchanov -- bruxy at regnet dot cz
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\documentclass[a4paper, 10pt, pointednumbers]{scrartcl}
\usepackage{czech}
\usepackage{a4wide}
\usepackage{graphics}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{latexsym}
\usepackage{multicol}

% změna okrajů stránky, které jsou standardně 1 palec = 2.54 cm
\evensidemargin 0mm
\oddsidemargin 0mm
\headsep 0mm
\hoffset -18.4mm
\voffset -17.4mm % vrsek
\topmargin 0in 
\headheight 0cm
\textwidth 197mm
\textheight 28.7cm
\footskip 0mm

\dateczech
%\renewcommand{\arraystretch}{1.2}

%\renewcommand{\tt}[#1]{\texttt{#1}}

\newcommand{\lra}{ $\Longleftrightarrow${}\quad}
\newcommand{\zif}{\textbf{if}{} }
\newcommand{\zelse}{\textbf{else}{} }
\newcommand{\zswitch}{\textbf{switch}{} }
\newcommand{\zcase}{\textbf{case}{} }
\newcommand{\zdefault}{\textbf{default}{} }
\newcommand{\zwhile}{\textbf{while}{} }
\newcommand{\zdo}{\textbf{do}{} }
\newcommand{\zfor}{\textbf{for}{} }
\newcommand{\zgoto}{\textbf{goto}{} }
\newcommand{\zstruct}{\textbf{struct}{} }
\newcommand{\ztypedef}{\textbf{typedef}{} }
\newcommand{\pr}[1]{$_{#1}$}

\renewcommand{\baselinestretch}{.95}
\renewcommand{\arraystretch}{0.9}
\newcommand{\itemspace}{\addtolength\itemsep{-0.3em}}

\pagestyle{empty}

\begin{document} 
\section*{Programovací jazyk C}
\addtocounter{section}{1}

\begin{multicols}{2}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Preprocesor}
% 42

Konstrukce preprocesoru C:
\begin{itemize}\itemspace
\item Definování makra: \\
\qquad \texttt{\#define} \textit{jméno} text rozvoje
\item Makro s parametrem \\
\qquad \texttt{\#define} \textit{jméno($p_0$, $p_2$,\ldots)} rozvoj $p_0$ $p_1$ \ldots
\item Makro s textovým parametrem \\
\qquad \texttt{\#define} \textit{jméno(par)} \texttt{printf("par =" \#par)}
\item Zrušení definice: \\
\qquad \texttt{\#undef} \textit{jméno}
\item Podmíněný preklad na hodnotě \textit{konstanta} \\
\qquad \texttt{\#if} \textit{konstanta} \\
\qquad \texttt{\#elif \#else \#endif} 
\item Vložení souboru z adr. uživatele  \\
\qquad \texttt{\#include "soubor"} 
\item Vložení systémového souboru  \\
\qquad \texttt{\#include} \verb|<soubor>| 
\item Podmíněný překlad, pokud je makro definováno \\
\qquad \texttt{\#ifdef} \textit{makro} \\
\qquad \texttt{\#elif \#else \#endif} 
\item Podmíněný překlad, pokud je makro nedefinováno
\qquad \texttt{\#ifndef} \textit{makro} \\
\qquad \texttt{\#elif \#else \#endif} 
\item Předdefinovaná makra:
\verb|__LINE__|, \verb|__FILE__|, \verb|__TIME__|, \verb|__DATE__|, \verb|__STDC__|
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Proměnné}

\begin{itemize}
\item Celočíselné typy:

\begin{itemize}
\item Se znaménkem (\texttt{signed}): 
	\begin{itemize}
		\item short (short int, signed short, signed short int)
		\item int (signed int, signed)
		\item long (long int, signed long, signed long int)
	\end{itemize}

\item Bez znaménka (\texttt{unsigned}):

	\begin{itemize}
		\item unsigned short
		\item unsigned int
		\item unsigned long
	\end{itemize}
\end{itemize}

\item Znakový typ:
	\begin{itemize}
		\item char (signed char)
		\item unsigned char
	\end{itemize}

\item Reálný typ:

	\begin{itemize}
		\item float -- 32bitová přesnost
		\item double (long float) -- 64bitová přesnost
		\item long double -- 80bitová přesnost
	\end{itemize}

\item Ukazatel:
	
	\begin{itemize}
		\item \verb|void *prt| -- generický uka\-za\-tel
		\item \verb|(void *)0| -- NULL
	\end{itemize}

\item Pole:

	\begin{itemize}
		\item \textit{typ} pole[] --
	\end{itemize}

\item Výčtový typ:
	\begin{itemize}
		\item enum
	\end{itemize}

\item Struktura:

\begin{tabbing}
\zstruct \= název \{ \\
	\>	\textit{typ} název1; \\
	\>	\textit{typ} název2; \\
	\>  unsigned a:4; /* bitové pole o délce 4 bity */ \\
	\}; \\
\end{tabbing}

\begin{tabbing}
\ztypedef \= \zstruct \= NÁZEV \{ \\
	\>	\textit{typ} název2; \\
	\>	\zstruct *NÁZEV ukazatel; \\
	\} název; \\
\end{tabbing}


\item Union

\item Prázdný typ: \texttt{void}

\item Paměťové třídy (před typ proměnné):

\begin{itemize}
\item \texttt{auto} -- lokální prom. na zásobníku,
\item \texttt{extern} -- globální prom. v dat. oblasti,
\item \texttt{static} -- lok. prom., ponechání hodnoty mezi
jednotlivými voláními funkce,
\item \texttt{register} -- lok. prom., uločení v registru počítače.
\end{itemize}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Výrazy}

{\small Čím větší číslo v indexu tím vyšší priorita. }

\begin{itemize}
\item Unární výrazy:
	\begin{itemize}
		\item \textit{prom}\verb|++|\pr{16}, \textit{prom}\verb|--|\pr{16}
		\item \verb|++|\textit{prom}\pr{15}, \verb|--|\textit{prom}\pr{15}
		\item \verb|!|\pr{15} -- log. negace
		\item \verb|~|\pr{15} -- bit. negace (\verb|~0xF0F0=0x0F0F|)
		\item \verb|&|\pr{15} -- adresový operátor
		\item \verb|*|\pr{15} -- nepřímý operátor
		\item \verb|(|\textit{typ}\verb|)|\pr{14} \texttt{proměná} --
		přetypování 
	\end{itemize}

\item Binární výrazy:

	\begin{itemize}
	\item multiplikativní: \verb|*|\pr{13} (násobení), \verb|/|\pr{13} (dělení),
	\verb|%|\pr{13} (zbytek po dělení)
	\item aditivní: \verb|+|\pr{12} (plus), \verb|-|\pr{12} (mínus)
	\item posuny: \verb|<<|\pr{11} (doleva), \verb|>>|\pr{11} (doprava)
	\item rovnosti: \verb|==|\pr{9} (je roven), \verb|!=|\pr{9} (není roven)
	\item relace: \verb|<|\pr{10}, \verb|<=|\pr{10}, \verb|>|\pr{10},
	\verb|>=|\pr{10}
	\item bitové: \verb|&|\pr{8} and, \verb}|}\pr{6} or, \verb|^|\pr{7} xor
	\item logické: \verb|&&|\pr{5} and, \verb}||}\pr{4} or
	\end{itemize}

\item Podmíněný výraz\pr{3}: \textit{výraz-logické-or} ? \textit{výraz} :
\textit{podmíněný výraz}

\begin{itemize}
\item \verb|r = a ? b : c;| \lra \\ \lra \verb|if(a!=0) r=b; else r=c;|
\item \verb|a ? b : c ? d : e ? f : g| \lra \\ \verb|a ? b : (c ? d : (e ? f : g))|
\end{itemize}

\item Dosazovací výrazy\pr{2}: \\
\verb}= += -= *= /= %= <<= >>= &= ^= |=} \\
(priorita 2, asociativní z prava)

\begin{tabular}{ll}
$a$ $op$= $b$ & $a$ = $a$ $op$ $b$ \\
\verb|x*=y=z|  &  \verb|x*=(y=z)| \\
\verb|a=b=d+7| &  \verb|a=(b=(d+7))| \\
\end{tabular}

\item Příklady:
\begin{itemize}
\item \verb|++e| \lra \verb|e+=1| -- inkrem. \textit{před} použitím  
\item \verb|e++| -- inkrementace \textit{po} použití     
\item \verb|--e| \lra  \verb|e-=1| -- dekrem. \textit{před} použitím  
\item \verb|j = ++i| \lra  \verb|j = (i = (i + 1))|            
\item \verb|j = i--| \lra  \verb|j = i; i = i - 1;|   
\end{itemize}
\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Příkazy}

\parbox{3cm}{
	\begin{tabbing}
	 \zif \= (výraz$_1$) \\
		\> příkaz$_1$;   \\
	 \zelse \zif (výraz$_2$) \\
		\> příkaz$_2$;          \\
	 \zelse \zif (výraz$_3$) \\
		\> příkaz$_3$;          \\
	 $\cdots$   \\
	 \zelse \\
		\> příkaz$_n$; \\
	\end{tabbing}
}\hspace{1cm}
\parbox{3cm}{
	\begin{tabbing}
	\zwhile \= (výraz) \\
		\> příkaz; \\
	\end{tabbing}
	\begin{tabbing}
	 \zdo \= příkaz \\
	 \> \zwhile (výraz); \\
	\end{tabbing}
	\vspace{-8mm}
	{\small (oproti while se tělo cyklu provede
		 alespoň jednou)}
}

 
\begin{tabbing}
\zfor \= (výraz$_1$; výraz$_2$; výraz$_3$) \\
	 \>  příkaz;
\end{tabbing}

%\begin{tabbing}
% výraz$_1$;
% while (výraz$_2$;)\{
%	  příkaz;
%	  výraz$_3$;
% \}
%\end{tabbing}

\begin{tabbing}
\zswitch \= (výraz)\{ \\
	\> \zcase \textit{konstanta}: příkaz; \\
	 \>                break; \\
	\> \zdefault:  příkaz; \\				
 \}
\end{tabbing}
	 
\begin{tabbing}
 \zgoto \= \textit{návěští}; \\
 \textit{návěští:}\\
	\> příkaz;
\end{tabbing}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Některé funkce}

\subsubsection{Řídící znaky:}


{\small
\begin{tabular}{ccl}
sekvence & hodnota & význam \\ \hline
\verb|\n|& 0x0A & nová řádka (LF) \\
\verb|\r|& 0x0D & návrat vozíku (CR) \\
\verb|\f|& 0x0C & nová stránka (FF) \\
\verb|\t|& 0x09 & tabulátor (HT) \\
\verb|\b|& 0x08 & posun doleva (BS) \\
\verb|\a|& 0x07 & písknutí (BELL) \\
\verb|\\|& 0x5C & zpětné lomítko \\
\verb|\'|& 0x2C & apostrof (signle quote) \\
\verb|\0|& 0x00 & nulový znak (NULL)
\end{tabular}}



\subsubsection{Formátové specifikace:}

{\small
\% [příznaky][šířka][.přesnost][modifikátor]konverze
}

\begin{itemize}
\item Konverze:

\begin{tabbing}
MMM	\= znak \kill
\verb|%c|	\> znak \\
\verb|%d|	\> desítkové číslo \texttt{signed int} \\
\verb|%ld|	\> desítkové číslo \texttt{signed long} 	\\
\verb|%u|	\> desítkové číslo \texttt{unsigned int} \\
\verb|%lu|	\> desítkové číslo \texttt{unsigned long} \\
\verb|%llu|	\> desítkové číslo \texttt{unsigned long long} \\
\verb|%f|	\> float	\\
\verb|%Lf|	\> long double	\\
\verb|%lf|	\> double	\\
\verb|%x|	\> hexadecimální číslo, např. 1a2b \\
\verb|%X|	\> hexadecimální číslo, např. 1A2B \\
\verb|%o|	\> osmičkové číslo \\
\verb|%s|	\> řetězec	\\
\verb|%p|	\> adresa argumentu	\\
\verb|%n|	\> netiskne, ukládá počet znaků 	\\
\end{tabbing}

\item Modifikátor konverze:

\begin{tabular}{p{1cm}p{5cm}}
\texttt{h}, \texttt{l} & \texttt{d}, \texttt{i} $\rightarrow$ signed short int; 
\texttt{u}, \texttt{o}, \texttt{x}, \texttt{X}  $\rightarrow$ unsigned
short int
\\
\texttt{L} & \texttt{f}, \texttt{e}, \texttt{E}, \texttt{g}, \texttt{G}
$\rightarrow$ long double\\
\end{tabular}

\item Šířka:

\begin{tabular}{cp{5cm}}
$n$ & tiskne alespoň $n$ znaků, mezery zprava \\
$0n$ &tiskne alespoň $n$ znaků, nuly doplňuje zleva \\
\verb|*| & počet znaků udává předchozí argument
\end{tabular}

\item Přesnost:

\begin{tabular}{cp{5cm}}
\texttt{d}, \texttt{i}, \texttt{u}, \texttt{o}, \texttt{x}, \texttt{X}
& minimální počet cifer na výstupu\\
 \texttt{f}, \texttt{e}, \texttt{E} & počet cifer za desetin. tečkou
 \\
\texttt{g}, \texttt{G} & maximální počet významových cifer \\
\texttt{s} & počet tištěných znaků \\
\texttt{*} & počet  znaků udává předchozí argument \\
\end{tabular}

\item Příznak:

\begin{tabular}{cp{5cm}}
\texttt{-} & zarovnává doleva a zprava doplňuje mezery \\
\texttt{+} & tiskne číslo vždy se znaménkem $+/-$ \\
\end{tabular}


\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{Ukazatele}
 
\begin{tabbing}
M \= MMM \= \kill 
Příklady:\\
\> \verb|*poi = 5;| -- na adresu se zapíše 5 \\
\> \verb|i = *poi;| -- získá se obsah na adrese \\
\> \verb|poi = &i;| -- ukazatel na adresu \texttt{i} \\
\> \verb|i = poi; | -- do  \texttt{i} se uloží adresa  \texttt{poi} \\
\> \verb|(* poi)++;| -- hodnota na adrese se inkrementuje \\
\> \verb|double (* p_fd)();| -- ukazatel na funkci vracející double
\\[3mm]
\> \verb|int **xd;| -- \texttt{xd} je ukazatel na
ukazatel na \texttt{int}, \\
\>\> \texttt{*xd} je ukazatel na  \texttt{int}, \\
\>\> \texttt{**xd} je prvek \texttt{int} \\

Pole: \\
\> vícerozměrné -- \texttt{pole}[\textit{řádek}][\textit{sloupec}] \\
\> \verb|x[i]| \lra \verb|*(x+i)| \\ 
\> \verb|x[i][j]|  \lra \verb|*(x[i]+j)| \lra \verb|*(*(x+i)+j)| \\ 
Alokace paměti: \\
\> \verb|int *poi;| \\
\> \verb|poi = (int *) malloc(4*sizeof(int))| -- přidělení \\
\> \verb|poi[0]| \lra \verb|*p_i|,\qquad \verb|poi[1]| \lra \verb|*(poi+1)| \\
\> \verb|free(poi)| -- uvolnění paměti\\
\end{tabbing}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ř

\subsection{Příkazy gdb}

Při použítí \texttt{gcc} kompilovat s parametrem \texttt{-ggdb3}
a bez optimalizací.

\begin{tabbing}
MM \= MMM \= \kill
\>\texttt{run} \textit{argument} -- spustí program s argumentem \\
\>\texttt{bt} -- (backtrace) vypíše použité funkce před pádem \\
\>\texttt{b} \textit{funkce} -- breakpoint na jméno funkce \\
\>\texttt{b} $n$ -- breakpoint na řádku číslo $n$ \\
\>\texttt{tb} \ldots -- dočasný breakpoint \\
\>\texttt{CTRL+C} -- zastaví spuštěný program \\
\>\texttt{info breakpoints} -- seznam nastavených breaků \\
\>\texttt{info locals} -- seznam lokálních proměnných \\
\>\texttt{delete} $n$ -- zruší break číslo $n$ \\
\>\texttt{p} \textit{jméno} -- vypíše obsah proměnné \textit{jméno} \\
\>\texttt{display} -- vypíše obsah sledovaných objektů \\
\>\verb|p*| \textit{ukazatel} -- vypíše obsah na adrese ukazatele \\
\>\texttt{up/down} -- pohyb po stack-framu \\
\>\texttt{next} -- krokování programu\\
\>\texttt{step} -- krokování se zanořuje do funkcí \\
\>\texttt{list} $n$ -- výpis zdrojáko okolo $n$. řádky \\
\>\texttt{thread} -- přepínání mezi vlákny \\
\end{tabbing}
\end{multicols}
\end{document}


