%-----------------------------------------------------------------------

\documentclass[serif, professionalfont, usenames, dvipsnames]{beamer}
\usepackage[T1]{fontenc}

% ATTENTION: preamble.tex contains all style definitions.
\input{config/preamble.tex}
\bibliography{./config/refs}

<<include = FALSE>>=
source("config/setup.R")
@

%-----------------------------------------------------------------------

\title{Representação de algorítmos}
\subtitle{Fluxogramas e pseudo-código}
\date{\small{ \Sexpr{sprintf('Atualizado em %s', Sys.Date())}}}

%-----------------------------------------------------------------------

\begin{document}

{\setbeamertemplate{footline}{}
  \frame{\titlepage} %--------------------------------------------------
}

\begin{frame}{}

  {\large Justificativas}

  \begin{itemize}
    \item Documentar rotinas de forma independente de linguagem é
      importante para comunicação entre programadores.
    \item Também é funciona como uma ``planta-baixa'' para a
      implementação, reduzindo muitos erros de programação.
  \end{itemize}

  \begin{flushright}
    \textit{``If the map and the terrain disagree, trust the terrain.''}
    \vspace{1ex}

    -- Swiss Army Aphorism
  \end{flushright}

  {\large Objetivos}

  \begin{itemize}
  \item Conhecer a simbologia de fluxogramas para representação de
    rotinas.
  \item Conhecer o vocabulário de pseudo código ou portugol.
  \item Exercitar a escrita e leitura com estas formas de representação.
  \end{itemize}
\end{frame}

%-----------------------------------------------------------------------
\begin{frame}{Simbologia de fluxogramas}

  \begin{center}
    \includegraphics[height=8cm]{../img/fluxograms.pdf}
  \end{center}

\end{frame}

%-----------------------------------------------------------------------
\begin{frame}
  \begin{minipage}[c]{0.25\linewidth}
    \includegraphics[width=\linewidth]{../img/teofilo-fluxogramas.png}
  \end{minipage}
  \hspace{1ex}
  \begin{minipage}[c]{0.7\linewidth}
    \begin{flushleft}
    SOUZA, T. M. \textbf{Fluxogramas, linguagem de programação basic e
      aplicações}. 1 ed. Ligthouse
    Editora. 2015.\\
    \href{http://www.editoraufv.com.br/produto/1853470/fluxogramas-linguagem-de-programacao-basic-e-aplicacoes}{\btn{Comprar}}
    \end{flushleft}
  \end{minipage}
\end{frame}

%-----------------------------------------------------------------------
\begin{frame}{Como entender fluxogramas}
  \begin{center}
    \includegraphics[height=7.5cm]{../img/understand-flowchart.png}
  \end{center}
\end{frame}

%-----------------------------------------------------------------------
\begin{frame}{Exemplos da aplicação de fluxogramas}

  \begin{itemize}
  \item
    \url{http://www.inf.puc-rio.br/~inf1005/material/slides/backup/2010_2/tema02_algoritmos.pdf}
  \item
    \url{https://uomustansiriyah.edu.iq/media/lectures/5/5_2016_03_22!07_06_46_PM.pdf}
  \item
    \url{http://www2.ic.uff.br/~otton/graduacao/programacao/exemplos_pseudo_codigo.pdf}
  \item
    \url{http://producao.virtual.ufpb.br/books/edusantana/pseudocodigo-livro/livro/livro.chunked/ch02s04.html}
  \end{itemize}

\end{frame}

%-----------------------------------------------------------------------
\begin{frame}{Recursos para confecção de fluxogramas}

  \mytwocolumns{0.49}{0.49}{

    \begin{itemize}
    \item \url{https://www.draw.io/}.
    \item \url{https://cloud.smartdraw.com/}.
    \item \url{https://www.lucidchart.com/}.
    \item
      \href{http://www.ioncannon.net/utilities/123/10-tips-for-creating-good-looking-diagrams-using-inkscape/}{Inkscape}.
    \item
      \href{http://www.texample.net/tikz/examples/tag/flowcharts/}{Tikz}.
    \item
      \href{http://dia-installer.de/shapes/Flowchart/index.html.en}{Dia}.
    \item \href{https://www.graphviz.org/gallery/}{Graphviz}.
    \item \href{http://www.flowgorithm.org/}{Flowgorithm}.
    \end{itemize}

  }{

    \begin{itemize}
    \item \url{https://code2flow.com/}.
    \item \href{https://sourceforge.net/projects/edpcs/}{Edpcs}.
    \item \href{https://pt.sharelatex.com/learn/algorithms}{\LaTeX}.
    \end{itemize}

  }

\end{frame}

%-----------------------------------------------------------------------
\begin{frame}{Vantagens e desvantagens dos fluxogramas}

  \begin{block}{Vantagens}
    \begin{itemize}
    \item Representação visual fácil de entender.
    \item Útil para comunicação com pessoas sem experiência em
      programação.
    \item Útil para prototipar e reduzir tempo de escrita de código.
    \end{itemize}
  \end{block}

  \begin{block}{Desvantagens}
    \begin{itemize}
    \item Não existe uma correspondência lógicas rígida com comandos de
      linguagens.
    \item Portanto não serve como meio de documentação precisa para
      arquivamento (é complementar).
    \end{itemize}
  \end{block}

\end{frame}

%-----------------------------------------------------------------------
\begin{frame}{Recordando sobre escrita de funções R}

  \begin{itemize}
  \item Dicas para nomes de função: ação $\rightarrow$ verbo.
  \item Argumentos de função: parâmetro $\neq$ argumento.
  \item Retorno da função: posição, conteúdo e impressão.
  \item Comunicação com usuário (\href{http://adv-r.had.co.nz/Exceptions-Debugging.html}{\btn{Advanced R}}).
    \begin{itemize}
    \item Erros (\emph{erros}).
    \item Avisos (\emph{warnings}).
    \item Mensagens (\emph{messages}).
    \end{itemize}
  \item Tratamento de exceções.
  \item Formas de chamar funções.
  \item O uso de \texttt{...} em funções.
  \end{itemize}

\end{frame}

%-----------------------------------------------------------------------
\begin{frame}{Benchmarking, profiling e debbuging}

  \begin{description}
  \item[Benchmarking] é o processo de avaliar a performance de operações
    específicas repetidamente.
  \item[Profiling] é o processo de fazer o benchmark para cada instrução
    de uma função/rotina.
  \item[Debugging] é o processo de buscar e resolver erros. Técnicas de
    debugging permitem avaliar a função passo a passo quando chamada.
  \end{description}

  \vfill
  \myurl{https://bookdown.org/csgillespie/efficientR/}.

\end{frame}

%-----------------------------------------------------------------------
\begin{frame}[t, fragile, allowframebreaks]{Exemplo de aplicação}

  {\large Benchmark}

<<>>=
library("microbenchmark")

df <- data.frame(v = 1:4, name = letters[1:4])
microbenchmark(df[3, 2], df[3, "name"], df$name[3])
@

  \framebreak
  {\large Profiling}

<<eval = FALSE>>=
library("profvis")

profvis({
    x <- runif(10000000)
    z <- rpois(10000000, lambda = 5)
    x <- sort(x)
    z <- sort(z)
    mean(x)
    mean(z)
    median(x)
    median(z)
})
@

  \framebreak
  {\large Debugging}

<<eval = FALSE>>=
baskara <- function(a, b, c) {
    stopifnot(a != 0)
    delta <- b^2 - 4 * a * c
    if (delta >= 0) {
        den <- 2 * a
        sqrt_delta <- sqrt(delta)
        x <- (-b + c(-1, 1) * sqrt_delta)/den
    } else { x <- NULL }
    return(x)
}
# Entra no modo de debug.
debug(fun = baskara)
# Chama a função.
baskara(a = -3, b = 1, c = 2)
# Sai do modo de debug.
undebug(fun = baskara)
@

\end{frame}

%-----------------------------------------------------------------------
{
  \usebackgroundtemplate{\includegraphics[height=\paperheight, width=\paperwidth]{../img/looking-ahead.jpg}}
  % \setbeamersize{text margin left=30mm}

  \begin{frame}[b]{}

    \hspace*{0.5\linewidth}
    \begin{minipage}[t]{0.5\linewidth}

      \hi{Próximo assunto}
      \begin{itemize}
      \item Programação funcional.
      \item Família \texttt{*apply}.
      \item Pacote \texttt{purrr}.
      \end{itemize}

      \hi{Semana que vem}
      \begin{itemize}
      \item Sabatina no Moodle.
      \item Aula com outro professor (talvez).
      \end{itemize}

    \end{minipage}

\end{frame}
}


%-----------------------------------------------------------------------
\end{document}