Trabalho de Computação 2
Forfatter
Egmon Pereira
Sidst opdateret
8 år siden
Licens
Creative Commons CC BY 4.0
Resumé
Trabalho apresentado ao currículo da Disciplina de Programação de Computadores 2
Trabalho apresentado ao currículo da Disciplina de Programação de Computadores 2
\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}