Teste de Programação com Objectos Licenciat. em Eng. Informática e de Computadores Prof. responsável: Nuno Mamede Teste Tipo 1º Semestre Bom dia! Escreva já o seu número em todas as folhas da prova. O teste está dividido em duas partes. A primeira parte tem a cotação máxima de 7,5 valores e contém 15 perguntas de resposta múltipla (cinco respostas possíveis), devendo assinalar na tabela da segunda folha deste teste a resposta correcta (só há uma resposta correcta) para cada pergunta. Para efeitos classificativos só se considerarão as respostas assinaladas nesta tabela. Se se enganar, risque a resposta dada e escreva à frente a nova resposta. Se deixar duas respostas, mesmo que uma delas seja a correcta considerar-se-á uma pergunta não respondida (ausência de resposta). A segunda parte tem a cotação máxima de 12,5 valores e contém 5 perguntas abertas, sendo aconselhável limitar o tamanho das respostas ao espaço disponível. O teste tem a duração de 2 horas. Durante esta prova não há esclarecimento de dúvidas. Se detectar algum erro, que tenha influência na resolução de um exercício, assinale-o. Se tiver razão ser-lhe-á atribuída a totalidade da cotação dessa pergunta. Boa sorte! Respostas certas: Aluno Número: Respostas erradas: Nome: __________________________________ Perguntas não respondidas: Licenciatura: _____________________________ Perguntas. Abertas: Classificação final: PÁGINA 2 ALUNO NÚMERO: 1ª PARTE (cada resposta certa=+0,5; cada resposta errada=-0,125; ausência de resposta=0,0) RESPOSTAS: Resposta escolhida PERGUNTA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 PERGUNTAS: (cada resposta certa=+0,2; cada resposta errada=-0,05; ausência de resposta=0,0) 1. Qual das seguintes afirmações está correcta, tendo em consideração o diagrama UML: B A A A e B são classes derivadas D A é a classe derivada B nem A nem B são classes derivadas E nenhum dos anteriores C B é a classe derivada PÁGINA 3 ALUNO NÚMERO: 2. Uma das vantagens da utilização de polimorfismo é: A a execução do código ser mais rápida D eliminar classes desnecessárias B facilitar a adição de novos tipos E nenhum dos anteriores C melhorar a verificação de tipos na compilação D não ter membros privados 3. Uma classe “abstracta” tem como característica? A corresponder à realização de interfaces B estar sempre na raiz da árvore hierárquica E C não ter instâncias nenhum dos anteriores 4. Em JAVA, de quem é a responsabilidade pela destruição dos objectos no monte? A programador (sempre) D programador (só para constantes) B colector de lixo (sempre) E nenhum dos anteriores C colector de lixo (só para referências) 5. Em JAVA, a dimensão de um objecto do tipo vector: A tem de ser conhecida na compilação D B tem de ser conhecida na criação do vector E C pode ser alterada durante a execução os dois anteriores nenhum dos anteriores 6. Em JAVA, durante a iniciação de um objecto é recursivamente evocado o construtor de omissão da classe de base. O programador tem a opção de chamar outros construtores (não os de omissão) desde que use a palavra reservada: A “upper” D “super” B “this” E nenhum dos anteriores C “base” 7. Em JAVA, uma interface pode ser estendida: A por agregação D as duas anteriores B por herança de uma interface E todas as anteriores C por herança de várias interfaces 8. Em JAVA, quando se pretende criar uma classe para ajudar à solução de um problema, mas não se quer que esteja disponível para qualquer outro uso, pode-se usar uma: A interface D classe abstracta B classe protected E nenhum dos anteriores C classe constante PÁGINA 4 ALUNO NÚMERO: 9. A associação de uma posição de memória (código de um método) a um identificador (nome do método) denomina-se: A ligação D sobrecarregar B evocação C polimorfismo E nenhum dos anteriores 10. Quais são as linhas do seguinte programa que contêm instruções ilegais: Ficheiro Beta.java Ficheiro Gamma.java 1. package Greek; 15. package Greek; 2. class Alpha { 16. class Gamma { 3. protected int x1; 17. void accessMethod() { 4. private int y1; 18. Beta b = new Beta(); 5. public int z1; 19. b.x1 = 10; 6. int k1; 20. b.y1 = 10; 7. } 21. b.z1 = 10; 8. 22. b.k1 = 10; 9. public class Beta extends Alpha{ 23. b.x2 = 10; 10. protected int x2; 24. b.y2 = 10; 11. private int y2; 25. b.z2 = 10; 12. public int z2; 26. b.k2 = 10; 13. int k2; 27. } 14. } 28. } A linha 20 e linha 24 D linha 23, linha 24, linha 25 e linha 26 B linha 19, linha 20, linha 23 e linha 24 E nenhuma das anteriores C linha 19, linha 20, linha 21 e linha 22 11. Qual é o padrão de desenho que tem o objectivo de: a) compor objectos em estruturas (árvores); b) tratar objectos individuais e composições uniformemente. A Command D Visitor B Strategy E TemplateMethod C Composite 12. Qual é o padrão de desenho que tem a seguinte estrutura: A Composite D Iterator B Command E nenhum dos anteriores C Visitor 13. Qual é o padrão de desenho que tem o objectivo de: a) Transformar um pedido num objecto PÁGINA 5 ALUNO NÚMERO: b) Parametrizar clientes com diferentes pedidos, filas de espera, lista de pedidos, … c) Anular o efeito de operações previamente executadas A Command D Visitor B Bridge E Flyweight C Strategy 14. Qual é o padrão de desenho que tem como participantes “Client”, “Invoker”, “ Receiver” e outros dois participantes com o nome do próprio padrão de desenho: A Visitor D Iterator B Command E nenhum dos anteriores C Strategy 15. Qual é o padrão de desenho que tem a seguinte estrutura: A Composite D Iterator B Visitor E nenhum dos anteriores C Command PÁGINA 6 ALUNO NÚMERO: 2ª PARTE (5 perguntas com a cotação máxima de 12,5 valores a cotação de cada pergunta está indicada entre parêntesis) 1. (2,0 valores) Relacione os conceitos de “desenvolvimento incremental” com o de “herança”. (Só se avaliam as ideias expressas na resposta e não a quantidade de palavras usadas) ______________________________________________________________________________________ ______________________________________________________________________________________ ______________________________________________________________________________________ ______________________________________________________________________________________ 2. (1,5 valor) Considere o seguinte contexto. Uma loja de produtos informáticos vende produtos simples como memórias, placas gráficas, discos e ratos, por exemplo. A loja também vende outro tipo de produtos designados como produtos agregados. Um produto agregado resulta da combinação de outros produtos, simples ou agregados, disponíveis na loja. Por exemplo, a loja vende configurações de computadores, em que cada configuração é representada por uma dada placa gráfica, disco, quantidade de memória, leitor de DVD ou CDROM, etc ... . Se tivesse que fazer uma aplicação que faça a gestão de todos os produtos à venda na loja, qual o padrão de desenho que aplicaria para representar os dois tipos de produtos que existem por forma a que a aplicação não tenha que tratar cada tipo de produto de forma distinta? Descreva sucintamente como aplicaria o padrão escolhido neste contexto. ______________________________________________________________________________________ ______________________________________________________________________________________ ______________________________________________________________________________________ ______________________________________________________________________________________ ______________________________________________________________________________________ 3. (1,5 valor) Suponha o seguinte contexto. Uma folha de cálculo é constituída por células e fórmulas. O valor de uma célula pode ser dado por uma constante ou pelo resultado da aplicação de uma fórmula. Uma fórmula é definida como uma função matemática aplicada a um dado conjunto de células e está associada a uma dada célula. Por exemplo, uma fórmula pode ser definida como o somatório dos valores das células A2, B2 e C3. Sempre que uma célula muda de valor, pretende-se que haja uma actualização automática de todas as fórmulas onde esta célula aparece. Qual o padrão ou padrões de desenho que acha conveniente utilizar neste caso para concretizar esta interacção entre células e fórmulas? Descreva sucintamente como aplicaria o ou os padrões escolhidos neste contexto. ______________________________________________________________________________________ ______________________________________________________________________________________ ______________________________________________________________________________________ ______________________________________________________________________________________ ______________________________________________________________________________________ PÁGINA 7 ALUNO NÚMERO: 4. (2,5 valores) Desenhe o “diagrama de classes” UML do seguinte programa JAVA. Represente unicamente as classes pelos seus nomes e métodos (não refira atributos), e as relações de herança e de agregação. import java.util.*; interface Xyz { Xyz cloan(); } class Tom implements Xyz { public Xyz cloan() { return new Tom(); } public String toString() { return "ttt"; } } class Dick implements Xyz { public Xyz cloan() { return new Dick(); } public String toString() { return "ddd"; } } class KKK { private Map _prototypes = new HashMap(); public KKK add(Object obj) { _prototypes.put(obj.getClass().getName(), obj); return this; } public Xyz makeObject( String s ) { return ((Xyz)_prototypes.get(s)).cloan(); } } public class KKKProto { public static void main( String[] args ) { class Harry implements Xyz { public Xyz cloan() { return new Harry(); } public String toString() { return "hhh"; } } KKK k = new KKK(); k.add(new Tom()).add(new Dick()).add(new Harry()); for (int i=0; i < args.length; i++) System.out.println(k.makeObject(args[i])); } } PÁGINA 8 ALUNO NÚMERO: 5. (2,0 valores) Desenhe o “diagrama de sequência” UML correspondente à execução do seguinte programa JAVA. O diagrama de sequência deve conter os nomes das mensagens trocadas, mas não é necessário representar os argumentos dessas mensagens nem as correspondentes ao retorno. class Fabrica{ public void produz(Peca p1, Fornecedor f1) { Maquina m1 = escolhe(p1); p1.faz(f1.obtem(p1),m1); } public Maquina escolhe(Peca p1) {...} } class Peca{ public void faz(String s1, Maquina m1) { m1.executa(s1); } } class Maquina{ public void executa(String s1) {...} } class Fornecedor { public String obtem(Peca p1) {...} } public class Executa { static Peca pe= new Peca(); static Fornecedor fo = new Fornecedor(); static Fabrica fa = new Fabrica(); public static void main( String[] args) { fa.produz(pe, fo); } } PÁGINA 9 ALUNO NÚMERO: 6. (3,0 valores) Defina em Java a classe FilaDeClientes cujos objectos são filas de clientes que estão em lista de espera para comprar um telefone. Esta classe deve ter três operações: (i) para inserir um cliente no final da fila; (ii) remover o primeiro elemento da fila e, em seguida, devolvê-lo; (iii) remover da fila um cliente com um dado número. Ignore os casos de erro (por exemplo, remoção de um cliente inexistente). Use um vector para guardar os clientes, em cada instante existem no máximo 100 clientes. Os clientes são representados pela classe Cliente e são identificados por um número de cliente. A classe cliente tem um método, obtemNumero, que devolve o número de cliente.