\documentclass[12pt, a4paper, oneside, portuguese, brazil, english]{article}
%\usepackage[ansinew]{inputenc} 
%\usepackage[utf8]{inputenc}                        
\usepackage[T1]{fontenc} 
\usepackage[portuguese]{babel}
\PassOptionsToPackage{pdftex}{graphicx}
\usepackage{graphicx}
\usepackage{epstopdf}
\usepackage{subfig}
%%%%%%%%%%%%%%
\usepackage{listings}
\usepackage{color}
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}
\definecolor{bg}{rgb}{0.95,0.95,0.95}
\lstset{ 
  language=Octave,                % the language of the code
  basicstyle=\footnotesize,       % the size of the fonts that are used for the code
  numbers=left,                   % where to put the line-numbers
  numberstyle=\tiny\color{gray},  % the style that is used for the line-numbers
  stepnumber=1,                   % the step between two line-numbers. If it's 1, each line 
                                  % will be numbered
  numbersep=5pt,                  % how far the line-numbers are from the code
  %backgroundcolor=\color{bg},     % choose the background color. You must add \usepackage{color}
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  frame=single,                   % adds a frame around the code
  rulecolor=\color{black},        % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here))
  tabsize=4,                      % sets default tabsize to 2 spaces
  captionpos=b,                   % sets the caption-position to bottom
  breaklines=true,                % sets automatic line breaking
  breakatwhitespace=false,        % sets if automatic breaks should only happen at whitespace
  title=\lstname,                 % show the filename of files included with \lstinputlisting;
                                  % also try caption instead of title
  keywordstyle=\color{blue}, %blue     % keyword style
  commentstyle=\color{dkgreen}, %dkgreen   % comment style
  stringstyle=\color{mauve}, %mauve      % string literal style
  escapeinside={\%*}{*)},         % if you want to add a comment within your code
  morekeywords={*,...}            % if you want to add more keywords to the set
}
%%%%%%%%%%%%%%
\begin{document}
\pagestyle{empty}
\sffamily
\noindent
\begin{center}
    \includegraphics[scale=.7]{LogoCEFET} 
\vfill
    \Large
    %CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS\\
    Centro Federal de Educação Tecnológica de Minas Gerais\\
    %CAMPUS VII - UNIDADE TIMÓTEO - Engenharia da Computação\\
    Campus VII - Unidade Timóteo - Engenharia da Computação\\
\end{center}
\vfill
\begin{center}
    \huge\bfseries
    Lista 01 - Programação de Computadores II
    \vfill
    \LARGE\bfseries
    Aluno: Egmon Pereira    
\end{center}
\begin{center}
    \Large
    Orientador: Prof. Douglas Nunes de Oliveira\\
	\vfill\vfill
	\large
	
	
	
    Timóteo, Maio de 2016
\end{center}
\pagebreak
\begin{enumerate}
 \item Qual é o padrão de nomeação de variáveis utilizado em praticamente todo o mundo?
  \begin{itemize}
   \item[a)] Esta pergunta deseja que você esteja apto a responder se o nome de uma variável é todo maiúsculo ou minúsculo.
   \item[R:] \textit{Primeiro define se a variável é padrão, private, protecte ou public, em seguida se retorno, ou seja, se inteira, String, char, etc., e o nome deve começar com letra minúscula e caso seja nome composto, a primeira letra do segundo nome deve ser maiúscula, ex: private int variavelComposta;}
  \end{itemize}
 \item Criar uma classe Conta com os atributos: número da agencia, número da conta e saldo.
 \item[]  \lstinputlisting[language=Java]{Lista01/ContaEx2.java}
 \item Criar um objeto de Conta e alterar os valores de seus atributos.
 \item[]  \lstinputlisting[language=Java]{Lista01/ContaEx3.java}\pagebreak
 \item Uso do operador \textit{new.Conta c = new Conta();}
  \begin{itemize}
   \item[I.] Qual a função/relação do new com a criação de um objeto?
   \item[R:] \textit{Quando declaramos uma variável para associar a um objeto, na verdade, essa variável não guarda o objeto, e sim uma maneira de acessá-lo, chamada de referência. A palavra $new$ instancia uma Classe. \\ O $new$ , depois de alocar a memória para esse objeto, devolve uma "$flecha$", isto é, um valor de referência. Quando você atribui isso a
uma variável, essa variável passa a se referir para esse mesmo objeto.}
   \item[II.] O que ocorre na memória?
   \item[R:] \textit{Na memória é separado um espaço, uma posição, para que Java possa acessá-lo quando necessário.}
   \item[III.] Onde está o objeto?
   \item[R:] \textit{Na memória.}
   \item[IV.] A variável c não é o objeto, o que ela é então?
   \item[R:] \textit{$c$ é uma variável referência, apesar de, depois de um tempo, os programadores Java falarem "Tenho um objeto $c$ do tipo Conta", mas apenas para encurtar a frase "Tenho uma referência $c$ a um objeto do tipo Conta".}
   \item[V.] Como então eu altero o atributo saldo, do objeto criado, usando o código: $c.saldo = 40$?
   \item[R:] \textit{Ao utilizarmos o "." para navegar, o Java vai acessar a Conta que se encontra naquela posição de memória, e não uma outra.}
\end{itemize}
  \item Tente escrever com suas palavras o que é uma classe e o que é um objeto no paradigma de desenvolvimento orientado a objetos.
  \item[R:] \textbf{Classe} - É um conjunto de objetos com características comuns. \\\textbf{Objeto} - É um elemento da uma classe. \pagebreak
  \item Quantos objetos e variáveis são criadas nos códigos abaixo; desenhe uma
representação de cada variável e cada objeto na memória; especifique um endereço
qualquer para cada objeto:
  \begin{itemize}
   \item[I.] $\lbrace $\\ \textit{Conta c1 = new Conta(); \\Conta c2 = new Conta();}\\ $\rbrace$ 
   \item[R:] \textit{2 objetos e 1 variável \\ c1 = Conta@1540e19d e c2 = Conta@677327b6} \\ \includegraphics[scale=1]{Lista01/fg1}
   \item[II.] $\lbrace $\\ \textit{Conta c1 = new Conta(); \\Conta c2 = c1;\\} $\rbrace$
   \item[R:] \textit{1 objetos e 2 variáveis \\ c1 = c2 = Conta@677327b6} \\ \includegraphics[scale=1]{Lista01/fg2}
  \end{itemize}\pagebreak
  \item[] \textbf{Pense em comportamentos que uma conta bancária deve ter: sacar passando um valor,
depositar passando algum valor, obter saldo. É desta forma que se define os métodos.} 
\item Crie os métodos da classe Conta definida no exercício anterior.
\item[] \lstinputlisting[language=Java]{Lista01/ContaEx7.java} \pagebreak
\item Crie um código para testar esta classe. Crie um objeto, imprima o seu saldo, faça um deposito, imprima o seu saldo, faça um saque e imprima o seu saldo.
\item[] \lstinputlisting[language=Java]{Lista01/ContaEx8.java}
\item[] \lstinputlisting[language=Java]{Lista01/ContaEx9.java} 
\item[] \lstinputlisting[language=Java]{Lista01/ContaEx10.java}
\item Afirmando que uma boa prática é criar uma método de leitura e escrita para cada um dos atributos. E que os métodos de leitura de atributos começam com a palavra get e os métodos de escrita começam com a palavra set. Exemplo: getNome() e setNome(String nome). Crie um método de leitura e escrita para cada atributo da classe Conta. Faça isto sem usar o gerador de código da IDE de desenvolvimento.
\item[] \lstinputlisting[language=Java]{Lista01/ContaEx11.java}
\item Toda vez que crio um método e declaro uma variável com o mesmo nome do
atributo da classe ocorre o sombreamento: \\ \textit{public class Aluno$\lbrace$\\ String nome = "Douglas";\\ public void setNome(String nome) $\lbrace$\\ nome = nome;$\rbrace$\\$\rbrace$}\\ Caso uma classe Aluno possua o atributo "nome" e o código abaixo seja executado: \\ \textit{public class TesteMain$\lbrace$\\ public static void main(String [] args) $\lbrace$ \\Aluno a = new Aluno();\\ a.setNome("Nunes"); \\System.out.println(a.nome); $\rbrace$ \\$\rbrace$}\\ O que será impresso em tela? 
\item[R:] \textit{Será impresso apenas o nome: Douglas} \\A impressão indica que não houve alteração no atributo nome, porque?
\item[R:] \textit{Porque o apontamento da memória é diferente, pois o nome Nunes foi colocado em outro endereço de memória instanciado pelo set} \\Como resolver o problema encontrado?\pagebreak
\item[R:] No código: \\public void setNome(String nome) $\lbrace$ \\  nome = nome;\ $\rbrace$ \\deve ser acrescentado o "this", ficando: \\ public void setNome(String nome) $\lbrace$ \\  this.nome = nome;\\ $\rbrace$ \\e também o deve ser acrescentado o código: \\public String getNome()$\lbrace$ \\ return nome; $\rbrace$\\
\item[] \textbf{Na apostila da Caelum, nos exercícios do capítulo 4, fazer os exercícios 1 ao 9.}
\item Modele um funcionário. Ele deve ter o nome do funcionário, o departamento onde trabalha, seu salário ( double ), a data de entrada no banco ( String ) e seu RG ( String ). \\Você deve criar alguns métodos de acordo com sua necessidade. Além deles, crie um método recebeAumento que aumenta o salario do funcionário de acordo com o parâmetro passado como argumento. Crie também um método calculaGanhoAnual , que não recebe parâmetro algum, devolvendo o valor do salário multiplicado por 12. \\A ideia aqui é apenas modelar, isto é, só identifique que informações são importantes e o que um funcionário faz. Desenhe no papel tudo o que um Funcionario tem e tudo que ele faz.
\item[R:] \textbf{Funcionário}\\
- nome do funcionário String;\\
- departamento String;\\
- salário double;\\
- entrada String\\
- RG String\\
-----------------------------------------------\\
+ recebeAumento(); void\\
+ calculaGanhoAnual(); double\\ \pagebreak
\item Transforme o modelo acima em uma classe Java. Teste-a, usando uma outra classe que tenha o main . \\Você deve criar a classe do funcionário com o nome Funcionario , mas pode nomear como quiser a classe de testes, contudo, ela deve possuir o método main.
\item[]
\lstinputlisting[language=Java]{Lista01/Funcionario.java}
\pagebreak
\lstinputlisting[language=java]{Lista01/Ex02.java}
\textbf{TELA:}\\
run:\\
Salário Inicial: R\$1.234,66\\
Salário Com Aumento: R\$2.469,32\\
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)\\
\item Crie um método mostra(), que não recebe nem devolve parâmetro algum e simplesmente imprime todos os atributos do nosso funcionário. Dessa maneira, você não precisa ficar copiando e colando um monte de $System.out.println()$ para cada mudança e teste que fizer com cada um de seus funcionários, você
simplesmente vai fazer:
\item[R:] \textit{A Saída foi diferente, pois não foram comparados os atributos, mas sim os objetos, que são diferentes, pois possuem diferentes endereços de memória.}\\
\item Construa dois funcionários com o new e compare-os com o $==$. E se eles tiverem os mesmos atributos? Para isso você vai precisar criar outra referência:
\item[R:] \textit{A Saída foi igual, pois não foi criado um objeto diferente, mas usado o mesmo para f1 e f2.}
\item Crie duas referências para o mesmo funcionário, compare-os com o == . Tire suas conclusões. Para criar duas referências pro mesmo funcionário; \\O que acontece com o if do exercício anterior? 
\item[R:] \textit{Por que na 3 criamos dois objetos diferentes. E na 4 ao invés da variável receber um novo endereço, recebeu um endereço que já existia.}\\
\item Modele e implemente uma classe chamada ParDeDados, composta por dois dados de seis lados e um método rolar. Crie uma classe TestaParDeDados com um método main que irá "lançar" (rolar) um objeto ParDeDados múltiplas vezes contando o número de vezes que aparece o número 6 em ambos os dados.
\item[] \lstinputlisting[language=Java]{Lista01/ContaEx16.java} 
\item Através da manipulação genética, biólogos criaram uma bactéria que come lixo. Esta consome o dobro de seu peso em lixo por hora. O peso da bactéria é constante (\textit{cerca de 10 picogramas}), o lixo é totalmente metabolizado. De 3 em 3 horas cada bactéria se dividem em duas. Uma bactéria vive apenas 25 horas e depois morre. \\Modele a classe Bacteria. Ela deve representar adequadamente o estado de uma bactéria (\textit{tempo de vida, lixo metabolizado, etc}). Deve ter métodos para retornar quanto lixo ela comeu, simular a passagem de uma hora (reduzindo o seu tempo de vida) e retornar o
tempo de vida restante.\\ Crie uma classe Colonia que representa uma colônia de bactérias (vetor). A classe Colonia deve ter métodos que: simula a passagem de horas (das bactérias), retorna a quantidade de bactérias existentes e o total de lixo consumido. Faça um programa de teste que simula a passagem de N horas.
\item[] \lstinputlisting[language=Java]{Lista01/Bacterias.java} 
\item[] \lstinputlisting[language=Java]{Lista01/Colonia.java}\pagebreak
\item[] \textbf{Exercícios para entender herança, reescrita e polimorfismo.}
\item Criar as classes "Pessoa", "Funcionario", e "Cliente".
\item[] \lstinputlisting[language=Java]{Lista01/Pessoa2.java}
\item[] \lstinputlisting[language=Java]{Lista01/Funcionario2.java}
\item[] \lstinputlisting[language=Java]{Lista01/Cliente2.java}
\item Funcionário tem os atributos nome, cpf e rg, que são comuns com a
classe Cliente.
\item[] \lstinputlisting[language=Java]{Lista01/Funcionario2b.java}
\item Criar 3 variáveis do tipo Pessoa. \\ \textit{Pessoa p1 = new Pessoa();\\ Pessoa p2 = new Funcionario(); \\Pessoa p3 = new Cliente();}
\item[] \lstinputlisting[language=Java]{Lista01/Empresa2.java}
\item Verificar se houve erro em umas das linhas da atividade 4. Se houve ou
não erros, porque?
\item[] \lstinputlisting[language=Java]{Lista01/Empresa2b.java}\pagebreak
\item Criar duas variáveis dos tipos: Funcionario e Cliente:\\ \textbf{Funcionario f = new Pessoa();\\ Cliente c = new Pessoa();}
\item[] \lstinputlisting[language=Java]{Lista01/Empresa2c.java}
\item As linha da atividade 6 ocorreram erros? Porque?
\item[] \lstinputlisting[language=Java]{Lista01/Empresa2d.java}
\item Porque as linhas abaixo não apresentam erros se o método toString()
não existe em nenhuma das classes. \\ \textit{Pessoa p = new Pessoa();\\ Funcionario f = new Funcionario();\\ Cliente c = new Cliente();\\ Sout(f.toString());\\ Sout(c.toString());\\ Sout(p.toString());}
\item[R:] Não há erro, pois o "\textit{toString}" é um método herdado do "\textit{Object}".
\item Todas as classes herdam de Object?
\item[R:] Sim
\item Se uma classe Endereco for declarada abaixo:\\ \textit{public class Endereco$\lbrace$ \\//Atributos \\//Métodos $\rbrace$} \\
Esta classe está herdando de alguma outra classe? Porquê?
\item[R:] Não, pois para herdar de outra classe seria necessário o código ser reescrito da seguinte forma:\\ \textit{public class Endereco extends NomeDaClasseHerdada$\lbrace$ \\//Atributos \\//Métodos $\rbrace$}
\item Declarar um vetor de 3 posições do tipo Pessoa. Instanciar 2 objetos de
Funcionario e 1 de Cliente. Colocar suas referencias no vetor. Percorrer o
vetor imprimindo o atributo nome de cada um dos objetos.
\item[] \lstinputlisting[language=Java]{Lista01/Empresa2e.java}
\item[] \lstinputlisting[language=Java]{Lista01/Pessoa2e.java}
\item[] \lstinputlisting[language=Java]{Lista01/Funcionario2e.java}
\item[] \lstinputlisting[language=Java]{Lista01/Cliente2e.java}
\pagebreak
\textbf{Exercícios para entender herança e construtores.}
\item Alterar a classe Pessoa da atividade anterior. Criar um construtor que receba como
parâmetro: nome, cpf e rg. Desta forma ignorando o construtor padrão.
\item[] \lstinputlisting[language=Java]{Lista02/Pessoa.java}
\item Ocorreu algum erro nas classes filhas? Porque?
\item[R:] Sim. Porque nas classes filhas não estão sendo chamdados os parâmetros do \textit{Construtor}.
\item Corrigir o problema, alterando as classes filhas de Pessoa. Visto que o construtor
padrão (fornecido pelo Java) das filhas não atendem.
\item[] \lstinputlisting[language=Java]{Lista02/Cliente.java}
\item[] \lstinputlisting[language=Java]{Lista02/Funcionarios.java}
\item A classe Funcionário possui codFuncionario, criar dois construtores: um recebendo
nome, CPF e RG; outro recebendo codfuncionario, nome, CPF e RG.
\item[] \lstinputlisting[language=Java]{Lista02/Funcionarios1.java}
\item Idem à atividade 4 porém envolvendo a classe Cliente.
\item[] \lstinputlisting[language=Java]{Lista02/Cliente1.java}
\item Conceitualmente, Pessoa ou Cliente ou Funcionário pode herdar de Endereço? Ou
Endereço pode herdar de Pessoa ou Cliente ou Funcionário? Porque?
\item[R:] Não. Porque \textbf{Endereco} não é uma \textbf{Pessoa}, nem um \textbf{Cliente} e nem um \textbf{Funcionarios}. Analogamente, \textbf{Pessoa}, \textbf{Cliente} e \textbf{Funcionários} não são \textbf{Endereco}.
\item Se a relação da classe Endereco com Pessoa, Cliente ou Funcionario não é de herança,
então qual é a relação?
\item[R:] Relação de Composição.
\item Como resolver em Orientação a Objetos para Cliente e Funcionário possuir endereço.
Codifique.
\item[R:] Basta instanciar as Classes \textbf{Funcionarios} e \textbf{Cliente}:
\item[] \lstinputlisting[language=Java]{Lista02/Funcionarios2.java}
\item[] \lstinputlisting[language=Java]{Lista02/Cliente2.java}
\pagebreak
\textbf{Classes Abstratas, Interfaces e tratamento de exceções.}
\item Crie	uma	hierarquia	de	animais	cujo 	ancestral	em	comum	é	a	classe	abstrata 	\textbf{Animal}.	Algumas	subclasses	da	classe	animal	implementarão	a	interface	chamada	\textbf{AnimalDeEstimacao}. Treinaremos	com	variações	destes	animais,	seus	 métodos	e	polimorfismo.	
\item[36.1] Crie	a	classe	Animal,	que	é	a	superclasse	abstrata	de	todos	os	animais;
\item[a.] Declare	um	atributo	inteiro	protected	com	o	nome	numeroDePernas,	que	armazena	o	
número	de	pernas	do	animal;
\item[b.] Declare	um	atributo	protected	do	tipo	String	representando	o	nome	do	animal;
\item[c.] Defina	um	construtor	protected	que	inicia	o	atributo	numeroDePernas;
\item[d.] Declare	o	método	abstrato	comer;
\item[e.] Declare	o	método	concreto	caminhar	que	exibe	uma	mensagem	do	tipo	 "\textbf{Anda	com	
<numero>	pernas.}"; 
\item[36.2] Crie	métodos	\textbf{get/set}	conforme 	diagrama. Crie	a	classe	Aranha.	
\item[a.] A	classe	Aranha	herda	da	classe	Animal;
\item[b.] Defina	um	construtor	que	chama	o	construtor	da	superclasse	para	especificar	que	todas	
aranhas	possuem	8	pernas;
\item[c.] Implemente	o	método	comer. Crie	a	interface	\textbf{AnimalDeEstimacao}	especificada 	no	diagrama 	\textbf{UML}. 
\item[36.3] Crie 	\textbf{classe	Gato}	que	herda	de	\textbf{Animal}	e	implementa	\textbf{AnimalDeEstimacao}.	
\item[a.] Defina	um	construtor	que	recebe	um	parâmetro	do	tipo	String	que	especifica	o	nome	do	
gato.	Este	construtor	deve	chamar	o	construtor	de	sua	superclasse	para	especificar	que	
todos	gatos	possuem	4	pernas.	
\item[b.]  Defina	outro	construtor	que	não	recebe	parâmetros.	Dentro	deste	construtor	chame	o	
construtor	anterior	(utilizando	a	palavra	reservada	this)	e	passe	uma	string	vazia	como	
argumento.	
\item[c.] Implemente	o	método	da	interface	\textbf{AnimalDeEstimacao}.	
\item[d.] Implemente	o	método	\textbf{comer}.
\item[36.4] Crie	a	classe	\textbf{Peixe}	que	herda	de	\textbf{Animal}.	Reescreva	os	métodos	de	\textbf{Animal}	para	 especificar	 que 	\textbf{Peixe}	não	anda 	e	não	possui	\textbf{pernas}
\item[36.5] Crie	um	programa	chamado	\textbf{TestaAnimais}.	Dentro	do	método	\textit{main},	crie	e	manipule	instâncias	das	classes	criadas	acima.	Inicie	com:	
\item[] Peixe	p	=	new	Peixe();	
\item[] Gato	g	=	new	Gato(?Tom?);	
\item[] Animal	a	=	new	Peixe();	
\item[] Animal	ab	=	new	Aranha();	
\item[] AnimalDeEstimacao	ae	=	new	Gato();	
Experimente	utilizar:
\item[a.] Chamando	métodos	em	cada	objeto,	
\item[b.] Fazendo	"\textbf{casting}"	de	objetos	(conversões),	
\item[c.] utilizando	polimorfismo,	e	
\item[d.] utilizando	super	para	chamar	métodos	da	superclasse.
\item[] \lstinputlisting[language=Java]{Lista02/Animal.java}
\item[] \lstinputlisting[language=Java]{Lista02/AnimalDeEstimacao.java}
\item[] \lstinputlisting[language=Java]{Lista02/Aranha.java}
\item[] \lstinputlisting[language=Java]{Lista02/Gato.java}
\item[] \lstinputlisting[language=Java]{Lista02/Peixe.java}
\item[] \lstinputlisting[language=Java]{Lista02/TesteAnimais.java}
\pagebreak
\item Crie um programa que receba 2 números inteiros e imprima o resultado da divisão do
primeiro pelo segundo. O programa deverá tratar algumas exceções (não deixando o
programa finaliza com erro) como : o usuário entrar com valores não inteiros e ocorrência de
divisão por zero.
\item[] \lstinputlisting[language=Java]{Lista02/Divisao.java}
\end{enumerate}
\begin{center}
\Large
\textit{"Nenhum homem diz "}Deus não existe\textit{", a não ser aquele que tem interesse em que ele não exista" (Agostinho)}
\end{center}
\end{document}