doku 1
This commit is contained in:
parent
aa5b8ac41c
commit
3774c3a9d2
152
dokumentace/PC_graph.tex
Normal file
152
dokumentace/PC_graph.tex
Normal file
@ -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}
|
||||
<expression> = <term> { ( PLUS | MINUS ) <term> }
|
||||
<term> = <unary> { ( MULTIPLY | DIVIDE ) <unary> }
|
||||
<unary> = [ PLUS | MINUS ] <power>
|
||||
<power> = <factor> [ POWER <unary> ]
|
||||
<factor> = NUMBER | VARIABLE | <function> | <bracketed>
|
||||
<bracketed> = LEFT_PAREN <expression> RIGHT_PAREN
|
||||
<function> = FUNCTION
|
||||
LEFT_PAREN
|
||||
<expression> { [ COMMA ] <expression> }
|
||||
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}
|
||||
Loading…
x
Reference in New Issue
Block a user