Local: Laboratório LEP 1 (às 4as) e sala F2-010 (às 2as e 6as).
Horário: das 8h às 10h.
Início: 6 de agosto de 2018.
Provas:
- P1: segunda-feira, 17/09
- P2: segunda-feira, 22/10
- P3: quarta-feira, 14/11
Repositório do código criado em sala de aula:
https://github.com/vigusmao/Comp2_2018_2
Material de apoio:
Apostila da Caelum
Conteúdo das aulas
06/08
Introdução ao curso. Explicações breves sobre Java, linguagens compiladas/interpretadas.
Sintaxe parecida com C.
I/O básico com a classe System: lendo do standard in (teclado) via Scanner e escrevendo no standard out (terminal).
Código feito em sala de aula no GitHub.
08/08
Laboratório 1.
Familiarização com o ambiente. Primeiras noções de complexidade de algoritmos.
Primeiro programa escrito --- descrição e código no
GitHub.
13/08
Seguindo com noções de complexidade de algoritmos. Unit tests vs testes de performance.
Medindo tempo com System.currentTimeMillis(). Sorteando um inteiro com o método nextInt() de um objeto Random.
Comparação de algoritmos O(n^2), O(n log n) e O(n) para o mesmo problema do Laboratório 1.
Código feito em sala de aula no
GitHub.
15/08
Laboratório 2.
Primeiros conceitos de orientação a objeto. Classe. Objeto. Atributos e métodos. Atributos e métodos static.
Modificadores public e private. Modificador final. Construtor.
Código feito em sala de aula no
GitHub.
17/08
Polimorfismo. Override. Overload (sobrecarga). Usando sobrecarga para a passagem de valores default para parâmetros.
Usando this e super.
Construtores default.
Packages. A hierarquia completa dos modificadores de visibilidade.
20/08
Método equals() versus operador ==. Override no equals(). Getters e setters. Lazy instantiation.
Código feito em sala de aula, dando seguimento à classe Fracao feita no laboratório passado, no
GitHub.
22/08
Laboratório 3.
Exercícios sobre herança, visibilidade de métodos, unit tests.
Classes privadas.
Código feito em sala de aula no
GitHub.
24/08
StringBuffer. Facilitando a vida do Garbage Collector.
Executando código em modo debug.
Unit tests com setUp()/@Before.
Unit tests como documentação viva das regras de negócio.
GitHub.
03/09
Modelando um sistema um pouco mais amplo. Exemplo que nos servirá de base para muitos conceitos vindouros.
Código feito em sala de aula no
GitHub.
05/09
Laboratório 4. Prosseguindo com a classe Album.
Gerador de números aleatórios e sua inicialização.
Código feito em sala de aula no
GitHub.
10/09
Interfaces. Definido o comportamento esperado de classes com o implements.
Código feito em sala de aula no
GitHub.
12/09
Laboratório 5. Interfaces.
Agregação versus Composição.
Código feito em sala de aula no
GitHub.
A descrição dos exercícios se encontra no arquivo LAB5.txt.
14/09
Revisão para a P1.
Polimorfismo. O instanceof e o uso parcimonioso de type casts.
Código feito em sala de aula no
GitHub.
17/09
P1.
19/09
Resolução da P1 em sala de aula.
21/09
Classes abstratas.
Classes abstratas versus interfaces.
A regra (rule of thumb) de sempre se declarar uma variável usando o tipo mais acima possível na genealogia de classes
(i.e., o mais geral possível) que faça sentido. Ou seja: se não há razão para se exigir que algo seja uma
LojaViaCartao, como no exemplo linkado abaixo, então declare-o apenas como Loja. Isso vale para atributos de classes,
parâmetros de funções e mesmo para variáveis locais.
O design pattern da Fábrica (Factory).
Código feito em sala de aula no
GitHub.
24/09
Tipos genéricos.
Código feito em sala de aula no
GitHub.
26/09
Laboratório 6. Exercitando classes abstratas e tipos genéricos.
Código feito em sala de aula no
GitHub.
A descrição dos exercícios se encontra no arquivo LAB6.txt.
28/09
Resolvendo juntos os exercícios do LAB6.
A criação de uma lista em alocação sequencial com crescimento automático (semelhante ao que faz a ArrayList,
do package javal.util, que estudaremos em breve).
A complexidade de tempo e espaço de se utilizar arrays subjacentes com crescimento em P.A. ou P.G.
Vimos que o crescimento em P.G. (por exemplo, dobrando-se o tamanho do array a cada vez que se tiver necessidade
de mais espaço) leva a tempo O(n) para se inserir n elementos; por outro lado, o crescimento
em P.A. leva tempo quadrático O(n2).
Código feito em sala de aula no
GitHub.
Note que houve mais de um commit no dia de hoje. Talvez você se interesse pelas duas versões.
PS.: As contas para o tempo linear do array com crescimento em progressão geométrica se encontra no final
do arquivo LAB6.txt.
01/10
O package java.util. Interfaces List e Map. A classe ArrayList.
Boxing/unboxing de tipos primitivos: int/Integer, long/Long, boolean/Boolean, etc.
As mudanças feitas na classe Album em sala de aula, trocando array de Colecionavel por ArrayList, encontram-se no
GitHub, assim como
mudanças no projetinho Pessoa,
incluindo uma classe ReceitaFederal com método para encontrar o nome de um contribuinte pelo cpf. Implementação com List e com Map.
26/09
Laboratório 7. Exercitando listas e mapas. Classe Banco e outras correlatas.
Código feito em sala de aula no
GitHub.
Para casa: Modificar o main() da classe Banco para conseguir responder de forma eficiente (e não como está lá!)
se o magnata tem duas contas com exatamente o mesmo saldo. Dica: use um HashMap, inicialmente vazio,
onde a chave de cada registro será o saldo de uma conta, e o valor será a própria conta (o objeto Conta).
Isto é: para cada conta, pegue o saldo dela e veja se seu mapa já contém uma conta com
aquele saldo. Se sim, então você terá acabado de encontrar uma segunda conta com aquele saldo -- basta imprimir
e finalizar! Caso contrário, coloque a conta no mapa (a chave será justamente o saldo dela).
05/10
A magia dos HashMaps. O que está por baixo dos panos? Fazendo override em equals() e hashCode(), e por que isso
é necessário.
Código feito em sala de aula no
GitHub.
Note que já havia outros commits nesse projetinho. No commit de hoje, transformamos o algoritmo quadrático que encontrava
duas contas com o mesmo saldo em um algoritmo linear que faz a mesma coisa.
08/10
Maps vs Sets. Endereçamento direto.
Código feito em sala de aula no GitHub.
10/10
Laboratório 8. Mais listas, mapas e sets. Tipos genéricos diretamente em funções.
Como atualizar o valor associado a uma chave de um mapa? (1) Se você quiser apenas alterar o conteúdo do objeto (sendo um objeto mutável),
então basta alterá-lo normalmente. Dê um mapa.get(), pegue o objeto e o altere. Não precisa dar outro put no mapa.
(2) Se o conteúdo do objeto não puder ser modificado (objeto imutável), ou se você quiser realmente colocar outro objeto
associado àquela chave, você precisará fazer um outro put, isto é, um mapa.put(chave, novoObjeto), sobrescrevendo o valor anterior.
Como iterar por um mapa? Três maneiras: (1) pelas chaves; (2) pelos valores; (3) pelos pares (chave, valor).
Map mapa = new HashMap<>();
mapa.put(12, 120_000);
mapa.put(34, 340_000);
mapa.put(55, 550_000);
mapa.put(18, 180_000);
for(Integer chave : mapa.keySet()) {
System.out.println(chave);
}
for(Integer valor : mapa.values()) {
System.out.println(valor);
}
for(Map.Entry registro :
mapa.entrySet()) {
Integer chave = registro.getKey();
Integer valor = registro.getValue();
System.out.printf("chave: %d; valor: %d\n",
chave, valor);
}
Exercício: descubra qual o elemento mais frequente numa lista dada.
Enunciado no GitHub.
Código feito em sala de aula no GitHub.
22/10
P2.
24/10
Resolução da P2 em sala de aula.
26/10
Tratamento de exceções com try...catch. A classe Exception. Lançando via throw,
indicando possível lançamento com throws.
29/10
Checked e unched exceptions. A classe RuntimeException.
Adicionando finally ao tratamento de exceções.
Como unit-testar lançamentos de exceções.
Mocks em testes.
Código feito em sala de aula no GitHub.
05/11
Adicionando comportamento a subclasses de Exception.
Código feito em sala de aula no GitHub.
07/11
Laboratório 9. Descrição do exercício.
Lendo de arquivo com Scanner(new File(filename));
09/11
Resolução do problema do Laboratório 9.
12/11
Tipos enumeráveis: o enum do Java. Código feito em sala de aula no GitHub.
Veja os commits feito para os projetinhos Banco e Loja. Os enums foram, respectivamente, Dinheiro e TipoDeAluno.
14/11
P3.
Atenção: a aula de quarta-feira, 21/11, será na sala F2-010, e não no laboratório.