Lista de Exercícios

Propaganda
1. Por que não utilizar a notação de composição da UML para mostrar que um cachorro é composto
de altura, peso, cor e data de nascimento?
2. Esboce um diagrama de classes para um capítulo de livro com a seguinte estrutura: um capítulo
compreende diversas seções, cada uma das quais compreende diversos parágrafos e figuras. Um
parágrafo compreende diversas sentenças, cada uma das quais compreende diversas palavras.
(Você pode ignorar a pontuação e não precisa ir mais adiante em busca da estrutura de uma
figura). Obs.: não esqueça de atribuir as multiplicidades.
3. Um município decide efetuar o recadastramento biométrico de seus eleitores. O sistema deve
armazenar para cada eleitor o seu nome, identidade, cpf, endereço residencial e uma foto. Além
disso, para cada eleitor é armazenada a impressão digital de cada um de seus dedos, todas obtidas
eletronicamente. Cada eleitor é agrupado em seções que por sua vez pertencem a uma zona
eleitoral. O sistema deve ser capaz de reconhecer um eleitor por sua impressão digital durante o
processo eleitoral. A participação de cada eleitor em um turno de uma eleição, que ocorre em uma
data específica, deve ser registrada no sistema que também computa o total de votos por seção e
por zona de cada candidato da eleição. Escreva um diagrama de classes que descreve o sistema
eleitoral.
4. Um usuário tem acesso a múltiplos arquivos, cada um acessível por um tipo de permissão de
acesso. Descreva em UML o relacionamento entre as classes correspondentes.
5. Defina o conceito de "Sistema de Tipos".
6. Defina o conceito de "Polimorfismo".
7. Java é uma linguagem fracamente tipada ou fortemente tipada? justifique.
8. Considere o seguinte trecho de código em Java:
class Util {
public static void imprime(String dado) {
System.out.println("Imprimindo uma String: " + dado);
}
public static void imprime(Integer dado) {
System.out.println("Imprimindo um Integer: " + dado);
}
}
Especificamente em relação à capacidade de criar dois métodos com o mesmo nome e assinaturas
diferentes, pode-se dizer que este é um exemplo de polimorfismo ad hoc ou universal? Justifique.
9. Considere o seguinte trecho de código em Java:
class Util {
public static void imprime(Object dado) {
System.out.println(Object);
}
public static void main(String[] args) {
String a = new String();
Integer b = new Integer();
imprime(a);
imprime(b);
}
}
Este é um exemplo de polimorfismo ad hoc ou Universal? Justifique.
10. Considere os tipos e métodos genéricos na linguagem Java (Java Generics). Esta capacidade da
linguagem pode ser definida como polimorfismo de subtipo ou polimorfismo paramétrico?
Justifique.
11. Em relação aos tipos genéricos em Java, qual é a diferença entre um parâmetro de tipo e um
argumento de tipo?
12. Considere uma interface Appendable que inclui um método append. Além disso considere duas
classes MyString e MyList, as quais implementam Appendable. Deseja-se que o sistema permita
que um objeto de MyString seja concatenado com um objeto MyString e um objeto de MyList
possa ser concatenado com outro objeto de MyList, mas que não seja admitido a concatenação de
objetos de tipos diferentes. Observando a declaração abaixo diga se a interface proposta satisfaz
os requisitos especificados quanto a tipagem. Em caso contrário, ofereça uma solução que corrija
o problema.
interface Appendable{
Appendable append(Appendable a);
}
13. Escreva uma classe genérica em Java que implemente uma pilha. A pilha deve permitir as
operações push (adiciona um elemento no topo da pilha), pop (remove um elemento do topo da
pilha) e isEmpty (que retorna true caso a pilha esteja vazia e false caso contrário).
14. Considere o seguinte trecho de código em Java:
public class Algorithm {
public static void swap(List<?> a, int i, int j) {
Object temp = a.get(i);
a.set(i, a.get(j));
a.set(j, temp);
}
}
a. O código não compila. Descreva em qual ou quais linhas erros de compilação ocorrem e explique
o motivo.
b. Reescreva o método de forma que ele compile. Lembre-se que método deve receber uma lista de
um tipo qualquer.
15. Considere o seguinte método genérico em Java:
public static void printList(List<Object> l) {
for (Object o : l)
System.out.println(o);
}
Considere ainda o seguinte trecho de código que utiliza o método acima:
List<String> ls = new ArrayList<String>();
…
printList(ls);
Este código compila? Em caso negativo, justifique e crie duas versões alternativas do método printList
que permitam que a chamada seja bem sucedida.
16. Considere as seguintes três versões de um método genérico que objetiva adicionar todos os
elementos de uma lista l2 em uma outra lista l1:
public static void addAll(List<?> l1, List<?> l2) {
for (Object o : l2)
l1.add(o);
}
public static <T> void addAll(List<T> l1, List<T> l2) {
for (T o : l2)
l1.add(o);
}
public static <T> void addAll(List<T> l1, List<? extends T> l2) {
for (T o : l2)
l1.add(o);
}
Discuta quais (se alguma) versões deste método compilam. Se mais de uma versão, de fato, compila,
discuta as diferenças entre elas (i.e., se são equivalentes, ou se há alguma vantagem em relação a alguma
delas).
17. Considere as seguintes duas versões de uma classe que tem por objetivo implementar um "vetor
de elementos de tipo genérico":
class Vetor {
Object[] elementos = new Object[100];
public void set(Object elem, int pos) {
elementos[pos] = elem;
}
public Object get(int pos) {
return(elementos[pos]);
}
}
class Vetor<T> {
Object[] elementos = new Object[100];
public void set(T elem, int pos) {
elementos[pos] = elem;
}
public T get(int pos) {
return(elementos[pos]);
}
}
Aponte vantagens da segunda versão sobre a primeira. Além disso, discuta se existe alguma situação na
qual a primeira versão seria desejável (sugestão: pense se há algum uso legítimo que seja possível com a
primeira versão e não com a segunda).
18. Na questão anterior, na segunda versão proposta, foi usado o tipo Object para a declaração do
atributo elementos. Poderíamos usar o parâmetro de tipo T?
19. Em Java, se utilizamos um parâmetro de tipo em um método genérico estático é obrigatória a
declaração do mesmo antes do tipo de retorno. Explique o motivo para isso.
20. O que é uma classe abstrata?
21. O que é uma interface?
22. O que é um método estático?
23. O que é um atributo estático?
24. Discuta as diferenças entre uma classe abstrata e uma interface.
25. Considere as implementações de coleções vistas em sala. Faça a implementação de uma pilha
genérica na forma de extensão (i.e., herança) de uma destas implementações.
26. Uma empresa de brinquedos armazena registros de todos os seus empregados contendo nome,
CPF, data de ingresso e cargo. Como política da empresa, é comum a doação de certos benefícios
aos empregados e uso dos nomes de alguns dos empregados nos seus produtos. Considere as
quatro interfaces principais da API Collections do Java, Set, List, Queue, and Map. Especifique
quais das quatro interfaces é mais apropriada para armazenar os dados necessários para a
execução de cada uma das atividades que deve ser realizada pelo sistema da empresa e explique a
razão de sua escolha. As atividades são:
a. Mensalmente um empregado deve ser escolhido aleatoriamente para receber um brinquedo grátis.
b. Cada novo produto lançado pela fábrica deve ser nomeado a partir do primeiro nome de um
empregado. Na escolha, não devem ser consideradas duplicatas de nomes.
c. Os brinquedos especiais devem ser batizados com os nomes mais populares da empresa.
d. A empresa adquiriu ingressos para partidas de futebol que serão distribuídos aos empregados. A
empresa mantem uma ordem de espera para distribuição dos ingressos aos empregados, ordem
que depende do momento da solicitação do ingresso por cada empregado.
27. Escreva um método genérico que ordene listas genéricas, que implementam a interface List do
Java, de acordo com um critério de ordenação arbitrário. Obs.: Não utilize o método sort da classe
utilitária Collections. Utilize apenas as operações da interface.
Download