%cabeçalho para todos os capítulos
%\input{cabecalho}

%\begin{document}

%Opções para o pacote listings
%\input{listingOptions}

\chapter{Conversor de Temperaturas}

\begin{center}
\shabox{
  \begin{Bitemize}
    \item[]\textbf{Quais novidades veremos nesta aula?}
    \item primeiro programa em Java
    \end{Bitemize}
} % \shabox
\end{center}
\bigskip

\section{Analogia entre dramatização da disputa de pênaltis e Programação
Orientada a Objetos}

\begin{center}
\begin{tabular}{|c|c|}
\hline
\textbf{Terminologia Teatral}&
\textbf{Terminologia de Programação Orientada a Objetos}\tabularnewline
\hline
\hline
personagem (papel)&
classe (tipo)\tabularnewline
\hline
ator&
objeto\tabularnewline
\hline
envio de mensagem&
envio de mensagem, chamada de método ou chamada de função\tabularnewline
\hline
\end{tabular}
\end{center}

~\\
Na dramatização, podíamos enviar uma mensagem (dizer alguma coisa)
para um ator. Na programação orientada a objetos, podemos enviar uma
mensagem para (ou chamar um método de) um objeto.

Os cartões de identificação definem os papéis dos atores e os scripts
especificavam o comportamento dos atores no decorrer da peça. A linguagem
Java permite que nós especifiquemos a mesma coisa. Um cartão de identificação
tem 3 partes, essas mesmas 3 partes aparecem na definição de uma classe
em Java. Por exemplo, o bandeirinha em Java seria mais ou menos assim:

\begin{lstlisting}
class Bandeirinha
{
  CobrançaAutorizada
  {
    // aqui vem a descrição do que o bandeirinha faz quando recebe esta mensagem
  }
  VenceuOTime (NomeDoTime)
  {
    // aqui vem a descrição do que o bandeirinha faz quando recebe esta  mensagem
  }
}
\end{lstlisting}

\section{Um exemplo real em Java: um conversor de Celsius para Fahrenheit}

Sempre o primeiro passo antes de programar é analisar o problema.

\[\frac{F-32}{9}=\frac{C}{5}\Rightarrow F-32=\frac{9}{5}C\Rightarrow F=\frac{9}{5}C+32\]

traduzindo isso para Java temos \texttt{F=9*C/5+32}. A seguir iremos criar diversas classes
para realizar a conversão entre Celsius e Fahrenheit.

\begin{enumerate}
\item \textbf{Primeira tentativa:} programa em Java para converter 40C para
Fahrenheit.

\begin{lstlisting}
class Conversor
{
  int celsiusParaFahrenheit ()
  {
    return 9 * 40 / 5 + 32;
  }
}
\end{lstlisting}

\begin{itemize}
\item para executar este conversor dentro do DrJava, podemos digitar o seguinte
na janela do interpretador (chamada de \emph{interactions}):

\begin{lstlisting}
Conversor gabriel = new Conversor ();
gabriel.celsiusParaFahrenheit ()
\end{lstlisting}

o DrJava imprimirá o valor devolvido pelo método \texttt{celsiusParaFahrenheit}
do objeto \texttt{gabriel}.
\end{itemize}

\begin{itemize}
\item limitação: sempre converte a mesma temperatura.
\end{itemize}

\item \textbf{Segunda tentativa:} conversor genérico de temperaturas Celsius
-> Fahrenheit. É capaz de converter qualquer temperatura de Fahrenheit
para Celsius.

\begin{lstlisting}
class Conversor2
{
  int celsiusParaFahrenheit (int c)
  {
    return 9 * c / 5 + 32;
  }
}
\end{lstlisting}


\begin{itemize}
\item para executar este conversor dentro do DrJava, podemos digitar o seguinte
na janela do interpretador:

\begin{lstlisting}
Conversor2 daniel = new Conversor2 ();
daniel.celsiusParaFahrenheit (100)
\end{lstlisting}

o DrJava imprimirá o valor devolvido pelo método \texttt{celsiusParaFahrenheit}
do objeto \texttt{daniel}.

\item limitação: essa classe manipula apenas números inteiros. Mas, em geral,
temperaturas são números reais, fracionários, então números inteiros
não são suficientes. Quando o computador opera com números inteiros,
os números são truncados, ou seja 30.3 se torna 30 e 30.9 também se
torna 30.
\item Note que devido à limitação acima, se tivéssemos escrito a fórmula
como \(\frac{9}{5} * C + 32\) o cálculo seria errado pois \(\frac{9}{5} = 1 \) se considerarmos
apenas a parte inteira da divisão. Assim, o programa calcularia apenas
\(1 * C + 32\) o que seria errado.
\end{itemize}

Para corrigir isso, usamos números de ponto flutuante (\emph{floating point
  numbers}). Esse nome se deriva do fato de que internamente os números são
representados de forma parecida a potências de 10 onde, variando o expoente da
potência, movemos (flutuamos) o ponto decimal para a esquerda ou para a
direita. De \emph{floating point} vem o tipo \texttt{float} da linguagem Java.
Números do tipo \texttt{float} são armazenados em 4 bytes e tem uma precisão
23 bits (o que equivale a aproximadamente ? casas decimais). No entanto, quase
sempre são utilizados números de ponto flutuante com precisão dupla que são
chamados de \texttt{double}.  Em Java, um \texttt{double} ocupa 8 bytes e tem
precisão de 52 bits o que equivale a aproximadamente ? casas decimais.
Por comodidade, daqui para frente sempre que precisarmos de números
  fracionários, vamos utilizar o tipo \texttt{double}.

\item \textbf{Terceira tentativa:} conversor genérico usando \texttt{double}


\begin{lstlisting}
class Conversor3
{
  double celsiusParaFahrenheit (double c)
  {
    return 9.0 * c / 5.0 + 32.0;
  }
}
\end{lstlisting}

limitação: só faz conversão em um dos sentidos

\item \textbf{Quarta e última versão:} conversão de mão dupla

\begin{lstlisting}
class Conversor4
{
  double celsiusParaFahrenheit (double c)
  {
    return 9.0 * c / 5.0 + 32.0;
  }
  double fahrenheitParaCelsius(double f)
  {
    return 5.0 * (f - 32.0) / 9.0;
  }
}
\end{lstlisting}

\begin{itemize}
\item para executar este conversor dentro do DrJava, podemos digitar o seguinte
na janela do interpretador:

\begin{lstlisting}
Conversor4 anders = new Conversor4 ();
anders.celsiusParaFahrenheit (37.8);
anders.FahrenheitParaCelsius (-20.3);
\end{lstlisting}
\end{itemize}

Note que, para que o seu programa fique bem legível e elegante, é
muito importante o alinhamento dos abre chaves \texttt{\{} com os fecha chaves
\texttt{\}} correspondentes. Em programas mais complexos, esse correto
alinhamento (indentação) ajuda muito a tornar o programa mais claro para seres
humanos.
\end{enumerate}

\section{Exercícios:}

\begin{enumerate}
\item Crie uma classe \texttt{Conversor5} que inclua também a escala Kelvin (K).
Esta classe deve conter conversores entre as três escalas de temperatura (Celsius, Fahrenheit
e Kelvin), totalizando seis funções. A relação entre as três escalas é dada por:

\[\frac{F-32}{9}=\frac{C}{5}=\frac{K-273}{5}\]

\end{enumerate}

%\end{document}
