You are on page 1of 3

INSTITUTO DE MATEMTICA - UFRJ MAB240- COMPUTAO II - CINCIA DA COMPUTAO 2011/2 PROVA FINAL - 16/12/2011 GABARITO DE SOLUO

1.

Uma aplicao precisa associar datas s pessoas que aniversariam em cada data. Nessa aplicao j esto definidas as classes Data e Pessoa. a) Crie uma classe Agenda, onde cada instncia de Agenda contm um mapa para isso. Cuidado para no permitir chaves repetidas no mapa. b) Escreva um mtodo de instncia para essa classe que recebe uma data e imprime o nome das pessoas que aniversariam nessa data. Voc pode assumir que a classe Pessoa tem o mtodo public String getNome() para obter o nome de uma pessoa, e que a classe Data redefine os mtodos boolean equals(Object obj) e int hashCode().
Resp: A ideia associar cada data a uma lista das pessoas que aniversariam nessa data: import java.util.*; public class Agenda { private Map<Data, ArrayList<Pessoa>> aniversarios; public Agenda(){ aniversarios = new HashMap<Data, ArrayList<Pessoa>>(); } public void aniversariantes(Data d){ ArrayList<Pessoa> pessoas = aniversarios.get(d); if (pessoas==null){ System.out.println("No h pessoas que aniversariam nesta data"); } else{ for (Pessoa p:pessoas){ System.out.print(p.getNome()+ " "); } System.out.println(); } }

2. Uma aplicao que usa o padro MVC tem uma classe Controle. Essa classe tem um mtodo public void criarCliente(String nome, String cpf). Esse mtodo deve criar um novo cliente, mas antes verifica se o cpf passado como parmetro vlido. Caso o mtodo decida que o cpf invlido, deve abortar a criao do novo cliente, e lanar uma exceo de nome CPFInvalidoException. Caso seja vlido deve checar em seguida se j existe um cliente com esse cpf em um mapa que associa cpfs a clientes. Se o cpf j constar das chaves do mapa, deve lanar uma exceo de nome CPFDuplicadoException. Caso nenhuma dessas situaes ocorra, deve criar um novo cliente, e inserir esse cliente no mapa. Escreva esse mtodo. Voc pode assumir que a classe Controle tem j um mtodo boolean checarCPF(String cpf) que retorna false se o cpf for invlido, um mapa de nome clientes que associa cada cpf ao respectivo cliente, e um construtor public Cliente(String nome, String cpf). Dica: para inserir um para chave-valor em um mapa, use o mtodo put(chave, valor).
Resp: public void criarCliente(String nome, String cpf) throws CPFInvalidoException, CPFDuplicadoException{ if(!checarCPF(cpf)) throw new CPFInvalidoException(); if(clientes.containsKey(cpf)) throw new CPFDuplicadoException(); Cliente c = new Cliente (nome, cpf); clientes.put(cpf, c); }

3. Voc escreve uma classe C que implementa a interface Runnable. Na classe C voc escreve o mtodo public void run() com os comandos que voc gostaria que rodassem em uma thread separada. Aps isso voc escreve em C o mtodo abaixo, para criar duas threads com esse mtodo:
public static void main(String[] args) { C c1 = new C(); C c2 = new C(); c1.run(); c2.run(); }

Para sua surpresa, essas threads no so criadas. Explique o que aconteceu, e o que deveria ter sido feito.
Resp: O que aconteceu foi que o mtodo run() rodou duas vezes na mesma thread da main(). O mtodo run() no deve ser chamado diretamente, o mtodo start() que cria a thread e chama run(). O correto seria fazer: public static void main(String[] args) { C c = new C(); new Thread(c).start(); new Thread(c).start(); }

4. Um projeto tem uma classe Pessoa e sua subclasse Aluno. Na classe Pessoa h os mtodos public String getNome() e public String getEndereco(). Na classe Aluno o mtodo getEndereco() redefinido para acrescentar mais informaes, e includo o mtodo public String getDre(). Um programa escreve a seguinte linha:
Pessoa p = new Aluno ("Jorge", "Rua A n 25", "123456"); E em seguida: System.out.println (p.getEndereco()); System.out.println (p.getDre());

a) H erro em chamar p.getEndereco()? De compilao ou de execuo? Explique o que vai acontecer. b) H erro em chamar p.getDre()? De compilao ou de execuo? Explique o que vai acontecer.
Resp: a) No vai dar erro porque existe na classe Pessoa um mtodo com essa assinatura. Mas a mensagem p.getEndereco() vai ativar o mtodo da classe Aluno, porque foi um aluno que recebeu a mensagem. b) Vai dar erro porque a referncia do tipo Pessoa, mas no existe na classe Pessoa ou acima dela nenhum mtodo com essa assinatura.

5. Sabemos que as colees e mapas em Java no aceitam tipos simples, apenas referncias. Sabemos tambm que Java j inclui uma classe correspondente para cada tipo simples. Escreva voc mesmo(a) uma classe de nome Inteiro que simula a classe Integer. Essa classe deve ter apenas um mtodo, public int valueOf(), que retorna o int correspondente.
Resp: public class Inteiro { private int valor; public Inteiro(int valor){ this.valor = valor; } public int valueOf(){ return valor; } }

6. Escreva um mtodo void removePassados(Set<Aluno> turma) que recebe como parmetro uma referncia para um conjunto de alunos e remove desse conjunto aqueles com media maior ou igual a 7.0. Voc pode supor que a classe Aluno possui um mtodo de instncia public double getMedia() que retorna a mdia do aluno.

Resp: public static void removePassados(Set<Aluno> turma) { Aluno a; Iterator<Aluno> it = turma.iterator(); while (it.hasNext()) { a = it.next(); if (a.getMedia()>= 7.0) it.remove(); } }

7. Escreva uma classe C em Java de tal forma que s seja possvel criar no mximo uma instncia dela, atravs de um mtodo de classe public static C getUnico(). Dica: o construtor deve ser private.
Resp: public class C { public static C instanciaUnica = null; private C() {} public C getUnico(){ if (instanciaUnica == null) instanciaUnica = new C(); return instanciaUnica; }

8. Voc cria um ArrayList<String> com:


ArrayList<String> lista = new ArrayList<String>();

E em seguida escreve:
lista.add("xyz"); lista.add("abc"); lista.add("mnk"); // a lista fica com ["xyz", "abc", "mnk"] lista.set(1, "abcd"); // a lista fica com ["xyz", "abcd", "mnk"] lista.add(1, "pqr"); // a lista fica com ["xyz", "pqr", "abcd", "mnk"]

Mas, quando tenta fazer: lista.set(4,"jjj"); ocorre um erro de execuo. Tente explicar porque ocorreu o erro.
Resp: A lista nesse ponto no possui o ndice 4 (s 0,1, 2 e 3). Ao tentar alterar o contedo da posio 4, estamos tentando alterar algo que no existe. S se pode usar o mtodo set(indice, valor) em uma lista para as posies que j contenham algum elemento.