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

%\begin{document}

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

\chapter{Programas com Vários Objetos}

\begin{center}
\shabox{
  \begin{Bitemize}
    \item[]\textbf{Quais novidades veremos nesta aula?}
    \item Programas com vários objetos
    \end{Bitemize}
} % \shabox
\end{center}
\bigskip

\section{Programas com Vários Objetos}

Até agora, todos os programas que vimos lidavam com apenas um objeto. No
entanto, podemos ter vários programas que lidam com vários objetos. Estes
objetos podem todos pertencer à mesma classe, ou podem pertencer a classes
diferentes.  Exemplo:

\begin{enumerate}

\item Vários objetos do mesmo tipo

\begin{lstlisting}
Flor rosa = new Flor();
Flor margarida = new Flor();
Flor laranjeira = new Flor();

rosa.cor("vermelha");
rosa.aroma("muito agradável");
margarida.aroma("sutil");
laranjeira.aroma("delicioso");
\end{lstlisting}

\item Vários objetos de tipos (classes) diferentes:

\begin{lstlisting}
Cachorro floquinho = new Cachorro();
Gato mingau = new Gato();
Rato topoGiggio = new Rato();
Vaca mimosa = new Vaca();

floquinho.lata();
mingau.mie();
topoGiggio.comaQueijo();
mingau.persiga(topoGiggio)
floquinho.persiga(mingau);
mimosa.passePorCima(floquinho, mingau, topoGiggio);
\end{lstlisting}

Vejamos agora um exemplo de utilizaçao de objetos de 3 tipos diferentes em conjunto:

\begin{lstlisting}
class Prisma
{
  double altura;
  double areaDaBase;

  void carregaAltura(double a)
  {
    altura = a;
  }

  void carregaAreaDaBase(double a)
  {
    areaDaBase = a;
  }

  double volume()
  {
    return areaDaBase * altura;
  }
}

class Quadrado
{
  double lado;

  void carregaLado(double l)
  {
    lado = l;
  }

  double area()
  {
    return lado * lado;
  }
}

class TrianguloRetangulo
{
  double cateto1;
  double cateto2;

  // note a indentação super-compacta!
  void carregaCateto1(double c) { cateto1 = c; }
  void carregaCateto2(double c) { cateto2 = c; }

  double area()
  {
    return cateto1 * cateto2 / 2.0;
  }
}
\end{lstlisting}

Agora, utilizando o interpretador, podemos criar objetos destes vários tipos e
utilizá-los em conjunto:

\begin{lstlisting}
Quadrado q = new Quadrado();
TrianguloRetangulo tr = new TrianguloRetangulo();
Prisma prismaBaseQuadrada = new Prisma();
Prisma prismaBaseTriangular = new Prisma();

q.lado(10);
tr.cateto1(20);
tr.cateto2(30);

prismaBaseQuadrada.carregaAltura(3);
prismaBaseTriangular.carregaAltura(1);

prismaBaseQuadrada.carregaAreaDaBase(q.area());
prismaBaseTriangular.carregaAreaDaBase(tr.area());

if(prismaBaseQuadrada.volume() > prismaBaseTriangular.volume())
    System.out.println("O prisma de base quadrada tem maior volume");
else if(prismaBaseTriangular.volume() > prismaBaseQuadrada.volume())
    System.out.println("O prisma de base triangular tem maior volume");
else
    System.out.println("Ambos os prismas tem o mesmo volume");
\end{lstlisting}

\textbf{Nota sobre o interpretador do DrJava:} para conseguir digitar todos os
\texttt{if}s encaixados no interpretador do DrJava sem que ele tente
interpretar cada linha em separado, é preciso utilizar \textsf{Shift+Enter} ao invés de
apenas \textsf{Enter} no final de cada linha dos \texttt{if}s encaixados. Apenas no
final da última linha (a que contém o \texttt{println} final) é que se deve
digitar apenas \textsf{Enter} para que o DrJava então interprete todas as linhas de uma
vez.

\end{enumerate}

\section{Exercício}

\begin{enumerate}

\item Escreva uma classe \texttt{Rendimentos} que contenha os seguintes métodos a fim de contabilizar o total de rendimentos de uma certa pessoa em um certo ano:

\begin{itemize}
\item \texttt{rendimentosDePessoaFisica(double);}
\item \texttt{rendimentosDePessoaJuridica(double);}
\item \texttt{rendimentosDeAplicacoesFinanceiras(double);}
\item \texttt{rendimentosNaoTributaveis(double);}
\item \texttt{double totalDeRendimentosTributaveis();}
\end{itemize}

Em seguida, escreva uma classe \texttt{TabelaDeAliquotas} que possui:

\begin{itemize}
\item um método \texttt{aliquota()} que, recebe como parâmetro o total de rendimentos tributáveis de uma pessoa e devolve um número entre 0 e 1.0 correspondente à aliquota de imposto que a pessoa deverá pagar e
\item um método \texttt{valorADeduzir()} que recebe como parâmetro o total de rendimentos tributáveis de uma pessoa e devolve o valor a deduzir no cálculo do imposto.
\end{itemize}

Agora escreva uma classe \texttt{CalculadoraDeImposto} que possui um único método que recebe como parâmetro o valor dos rendimentos tributáveis de uma pessoa e devolve o valor do imposto a ser pago.

Finalmente, escreva um trecho de código (para ser digitado no interpretador) que define os vários rendimentos de uma pessoa e calcula o imposto a pagar.

Eis a tabela do IR 2004:

\smallskip
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
Rendimentos Tributáveis & Alíquota & Parcela a deduzir \\
\hline \hline
Até R\$ 12.696 & & \\
\hline
De R\$ 12.696,01 a R\$ 25.380 & 0.15 &R\$ 1.904,40  \\
\hline
acima de R\$ 25.380 & 0.275 & R\$ 5.076,90  \\
\hline
\end{tabular}
\end{center}

\item Suponha que você tenha as seguintes classes:

\begin{lstlisting}
class A {
  double a (int meses, double taxa) {
    return ( Math.pow((taxa + 100) / 100, meses) - 1 );
  }
}

class B {
  final double TAXA = 1.2;

  void b (double valorEmprestado, int meses) {
    A a = new A();
    double valorDaDivida = valorEmprestado + (a.a(meses, TAXA)*valorEmprestado);
    System.out.println("Dívida de " + valorDaDivida + " real(is), " +
                       "calculada com taxa de " + TAXA + "% ao mês.");
  }
}
\end{lstlisting}

\begin{enumerate}
\item O que fazem os métodos \texttt{a} (da classe \texttt{A}) e \texttt{b} (da classe \texttt{B})? Não precisa entrar em detalhes. DICA: consulte a página http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Math.html
\item Os nomes \texttt{a} e \texttt{b} (dos métodos) e \texttt{A} e \texttt{B} (das classes) são péssimos. Por quê? Que nomes você daria? Sugira, também, outro nome para a variável objeto (criada no interpretador).
\item Acrescente alguns comentários no código do método \texttt{b}.
\item Seria mais fácil digitar o valor 1.2 quando necessário, em vez de criar uma constante \texttt{TAXA} e utilizá-la. Então, por que isso foi feito? Cite, pelo menos, dois motivos. Se você não sabe o que é uma constante, imagine que é um atributo cujo valor não pode ser alterado.
\end{enumerate}


\end{enumerate}
%\end{document}
