diff --git a/dokumentace/PC_graph.tex b/dokumentace/PC_graph.tex new file mode 100644 index 0000000..cb7e816 --- /dev/null +++ b/dokumentace/PC_graph.tex @@ -0,0 +1,152 @@ +% Specifikace třídy dokumentu a základní velikosti písma. +\documentclass[12pt, a4paper]{article} + +% Podpora češtiny +\usepackage[utf8]{inputenc} +\usepackage[IL2]{fontenc} +\usepackage[czech]{babel} + +\usepackage{amsfonts} + +% Okraje stránky +\usepackage[ + left=30mm, + right=30mm, + top=40mm, + bottom=30mm, +% twoside, % Při oboustranné sazbě si zkuste nastavit right=25mm a left=35mm. + % showframe % Vykreslí okraje stránky. +]{geometry} + +% Americký styl odstavců (mně se tento styl líbí o poznání více) +\usepackage{parskip} + +% Sazba obrázků +\usepackage{graphicx} +\graphicspath{{Images/}} % Při vkládání obrázků se bude prefixovat tato relativní cesta. + +% \usepackage{inconsolata} + +% Při použití tohoto balíku začnou fungovat odkazy v textu. +% Zkuste třeba kliknout na odkazy v textu (např. "1.1" na straně 2) nebo v seznamu obrázků/tabulek. +% `hidelinks` skryje ošklivé výchozí rámečky kolem odkazů. +\usepackage[hidelinks]{hyperref} + +% Začátek dokumentu +\begin{document} + +% Titulní strana (prostředí minimálně odstraní číslo strany) +\begin{titlepage} + \centering % Odtud do konce prostředí bude vše na středu, + \Large % velkými písmeny + \sffamily % a bezpatkovým písmem. + + %Vložení obrázku (ze složky `Images`) + \includegraphics[width=.7\textwidth]{fav} + + Semestrální práce z předmětu + + % Prázdná mezera mezi řádky znamená nový odstavec. + Programování v jazyce C + + % Vertikální mezera 18 mm. + \vspace{18mm} + {\Huge\bfseries Vizualizace grafu matematické funkce}\\ + + \vspace{18mm} + \today % Čas je získán ze systému. + + + \vfill % Vyplní prostor + \raggedright % Vše bude zarováno do leva. + \textsl{Autor:}\\ % Vtípek z přednášky + ukázka tvorby makra a přidání sémantiky do stylu textu. + Zbyněk Vajchart\\ % Příkaz \\ provede násilný zlom řádky. + A23B0144P\\ + \texttt{zbyv@students.zcu.cz} +\end{titlepage} + +\tableofcontents +\newpage + +% Ukázka odstranění čísla stránky -- první stránka obsahu ale má být číslovaná! +%\thispagestyle{empty} + +% Sazba nové kapitoly (ve vašem případě zde bude zřejmě zkrácená verze "Zadání") +\section{Zadání} +Naprogramujte v jazyce ANSI C přenositelnou konzolovou aplikaci, která jako vstup načte +z~parametru na příkazové řádce matematickou funkci ve tvaru $y = f(x); x, y \in \mathbb{R}$, +provede její analýzu a~vytvoří soubor ve formátu PostScript s~grafem této funkce na +zvoleném definičním oboru. + +Celé zadání je k~dispozici na \url{https://www.kiv.zcu.cz/studies/predmety/pc/data/works/sw2024-02.pdf}. + +\section{Analýza úlohy} +Úloha se skládá ze dvou hlavních problémů: matematickou funkci je nejprve třeba analyzovat a~poté +použít výstup této analýzy ke zjištění jejích hodnot v~jednotlivých bodech a~vykreslení grafu. + +\subsection{Analýza funkce} +Analýzu zadané matematické funkce je vhodné rozdělit do dvou částí --- analýzu lexikální a~syntaktickou. +Výhoda tohoto rozdělení je popsána níže. + +\subsubsection{Lexikální analýza} +Během lexikální analýzy je funkce rozdělena na jednotlivé, dále nedělitelné \textit{tokeny} (např. konstanty, operátory, proměnné). +Některé typy tokenů pak mají hodnotu, typicky třeba konstanty --- jejich hodnotou je číslo, které reprezentují. +Výhodou lexikální analýzy je, že zjednodušuje další zpracování funkce, protože z~pohledu syntaxe je jedno, zda +se v~zápisu funkce vyskytne např.~\texttt{2}, \texttt{1e10} nebo \texttt{pi} --- všechny tyto sekvence znaků +se při lexikální analýze převedou na token \textit{konstanta} s~odpovídající hodnotou. To samozřejmě platí i~pro +jiné typy tokenů. Během lexikální analýzy jsou také odstraněny bílé znaky, které nemají v~zápisu funkce žádný význam. +Typy tokenů využité v~této práci jsou uvedeny v~tabulce~\ref{tab:tokens}. + +\begin{table}[] + \centering + \begin{tabular}{|l|l|} + \hline + označení & popis \\ \hline + \texttt{NUMBER} & konstanta \\ \hline + \texttt{PLUS} & operátor sčítání \texttt{+} \\ \hline + \texttt{MINUS} & operátor odečítání nebo negace \texttt{-} \\ \hline + \texttt{MULTIPLY} & operátor násobení \texttt{*} \\ \hline + \texttt{DIVIDE} & operátor dělení \texttt{*} \\ \hline + \texttt{POWER} & operátor umocnění \verb|^| \\ \hline + \texttt{VARIABLE} & proměnná \texttt{x} \\ \hline + \texttt{FUNCTION} & název funkce \\ \hline + \texttt{LEFT\_PAREN} & levá závorka \verb|(| \\ \hline + \texttt{RIGHT\_PAREN} & pravá závorka \verb|)| \\ \hline + \texttt{COMMA} & oddělovač argumentů \texttt{,} \\ \hline + \texttt{EOF} & konec vstupu \\ \hline + \texttt{ERROR} & chyba (nerozpoznatelná sekvence) \\ \hline + \end{tabular} + \caption{Použité typy tokenů} + \label{tab:tokens} +\end{table} + +\subsubsection{Syntaktická analýza} +Následuje analýza syntaktická, během které je zadaná funkce zpracována do stromové struktury, kterou je pak možné +využít pro vyhodnocování funkce v~jednotlivých bodech. +Existuje mnoho způsobů, jak tuto analýzu provést, mezi základní patří např.~rekurzivní sestup nebo algoritmus shunting-yard. +V~této práci je použita metoda rekurzivního sestupu, která je relativně jednoduchá a~přehledná --- program je možné +mechanicky vytvořit z~gramatiky zpracovávaného jazyka. Mezi její další výhody patří, že se oproti +algoritmu shunting-yard dokáže lépe vypořádat s~unárními operátory. + +Analyzátor rekurzivním sestupem lze obecně vytvořit z~gramatiky popisující zpracovávaný jazyk +pomocí sady funkcí, které odpovídají jednotlivým pravidlům gramatiky. To je v~tomto případě +snadné, protože pro zpracování matematického výrazu lze sestavit gramatiku + +\begin{verbatim} + = { ( PLUS | MINUS ) } + = { ( MULTIPLY | DIVIDE ) } + = [ PLUS | MINUS ] + = [ POWER ] + = NUMBER | VARIABLE | | + = LEFT_PAREN RIGHT_PAREN + = FUNCTION + LEFT_PAREN + { [ COMMA ] } + RIGHT_PAREN +\end{verbatim} + +kde \verb|{}| značí iteraci, \verb|[]| volitelnost a~\texttt{|} jednu z~možností. +Výrazy v~\verb|<>| jsou neterminály, zatímco ostatní symboly jsou terminály odpovídající +tokenům z~lexikální analýzy. + +\end{document}