Difference between revisions of "Programação com Objectos/Teste 1 de 2013/02/04"

From Wiki**3

< Programação com Objectos
(Created page with "{{TOCright}} == Parte 1 == '''1.1.''' (3.0 val.) Considere o seguinte domínio: Uma transportadora tem vários camiões e comboios capazes de transportar vários tipos de e...")
 
Line 3: Line 3:
 
== Parte 1  ==
 
== Parte 1  ==
  
'''1.1.''' (3.0 val.) Considere o seguinte domínio:
+
'''1.1.''' (3.0 val.) [[Introdução à Modelação com UML/Transportadora|Transportadora]]
 
 
Uma transportadora tem vários camiões e comboios capazes de transportar vários tipos de equipamento industrial (inicialmente, tractores, escavadoras e perfuradoras, embora seja de prever que venham a ser considerados outros). Os camiões e comboios têm identificadores únicos e uma dada capacidade de transporte, determinada pelo peso e comprimento máximos que podem transportar. Desta forma, é possível acrescentar uma peça de equipamento a transportar a um dado camião ou comboio se a capacidade de transporte não tiver sido ultrapassada. Dado um meio de transporte, é possível saber a capacidade de transporte ainda disponível.
 
 
 
Os equipamentos têm um identificador único, registo do peso e capacidade de combustível, e têm o registo de quem é o seu proprietário. Cada tipo de equipamento tem funcionalidades adicionais distintas: os tractores puxam, as escavadoras escavam e as perfuradoras perfuram. Os proprietários são identificados pelo nome. Por vezes, os proprietários transportam lotes de vários equipamentos (i.e., um lote no mesmo meio de transporte). Os lotes têm um identificador único e apresentam as mesmas funcionalidades que os equipamentos individuais.
 
 
 
Um comboio é constituído por carruagens e cada carruagem tem uma capacidade máxima de transporte. A capacidade máxima de transporte de um comboio é igual à soma das capacidades das suas carruagens. É possível adicionar carruagens a um comboio. Quando se adiciona uma dada carga a transportar a um comboio, o comboio utiliza a primeira carruagem com capacidade disponível para transportar essa carga.
 
 
 
Desenhe o diagrama de classes UML correspondente ao domínio apresentado. Represente as classes (seus nomes, métodos e atributos). Indique também as relações de herança, associação e agregação.
 
 
 
<div style="padding: 8px; border-style: dashed; border-width: 1px; border-color: #2f6fab; background: #f9f9f9; ">
 
Esboço do diagrama de classes para o problema apresentado.
 
 
 
[[Image:PO-20130204t1-class.png|PO-20130204t1-class.png|850px]]  
 
</div>
 
  
 
'''1.2.''' (1.0 val.) Escreva em Java a classe Stack que usa vectores de dimensão fixa (definida no momento da criação) para guardar inteiros e tem 3 métodos: insert(Integer e) (insere o elemento e na pilha), remove() (remove o último elemento inserido na pilha) e exists(Integer e) (devolve true se o elemento e existe na pilha e false em caso contrário). Também deve ser definida outra classe que difere da anterior por não permitir a existência de elementos duplicados na pilha, ou seja, o método insert(Integer e) não insere o elemento e se já existir na pilha. Quando a pilha está vazia e se tenta remover um elemento e quando está cheia e se insere um novo elemento, devem ser lançadas excepções.
 
'''1.2.''' (1.0 val.) Escreva em Java a classe Stack que usa vectores de dimensão fixa (definida no momento da criação) para guardar inteiros e tem 3 métodos: insert(Integer e) (insere o elemento e na pilha), remove() (remove o último elemento inserido na pilha) e exists(Integer e) (devolve true se o elemento e existe na pilha e false em caso contrário). Também deve ser definida outra classe que difere da anterior por não permitir a existência de elementos duplicados na pilha, ou seja, o método insert(Integer e) não insere o elemento e se já existir na pilha. Quando a pilha está vazia e se tenta remover um elemento e quando está cheia e se insere um novo elemento, devem ser lançadas excepções.

Revision as of 11:39, 18 November 2013

Parte 1

1.1. (3.0 val.) Transportadora

1.2. (1.0 val.) Escreva em Java a classe Stack que usa vectores de dimensão fixa (definida no momento da criação) para guardar inteiros e tem 3 métodos: insert(Integer e) (insere o elemento e na pilha), remove() (remove o último elemento inserido na pilha) e exists(Integer e) (devolve true se o elemento e existe na pilha e false em caso contrário). Também deve ser definida outra classe que difere da anterior por não permitir a existência de elementos duplicados na pilha, ou seja, o método insert(Integer e) não insere o elemento e se já existir na pilha. Quando a pilha está vazia e se tenta remover um elemento e quando está cheia e se insere um novo elemento, devem ser lançadas excepções.

A solução contém quatro classes (2 stacks e 2 excepções). Note-se que a solução é mínima e que algumas opções não são ideais em casos gerais (o uso de vectores fixos, por exemplo).

Ficheiro Stack.java: <java5> public class Stack {

 private int[] _contents;
 private int _last = 0;
 public Stack(int size) {
   _contents = new int[size];
 }
 public void insert(Integer e) throws StackOverflowException {
   if (_last == _contents.length) throw new StackOverflowException();
   _contents[_last++] = e;
 }
 public void remove() throws StackUnderflowException {
   if (_last == 0) throw new StackUnderflowException();
   _last--;  // in fact, it does not change the stack
 }
 public boolean exists(Integer e) {
   for (int i: _contents)
     if (i == (int)e) return true;
   return false;
 }

} </java5>

Ficheiro UStack.java (stack sem repetições): <java5> public class UStack extends Stack {

 public UStack(int size) { super(size); }
 @Override
 public void insert(Integer e) throws StackOverflowException {
   if (!exists(e)) super.insert(e);
 }

} </java5>

Ficheiros StackOverflowException.java e StackUnderflowException.java (excepções):

<java5> public class StackOverflowException extends Exception {} </java5>

<java5> public class StackUnderflowException extends Exception {} </java5>

1.3. (1.5 val.) Qual a distinção entre sobrecarregar (overloading) e redefinir (overriding). Ilustre as diferenças através de um exemplo.

  • Overloading: definição de métodos com o mesmo nome, mas com diferenças nos argumentos (tipo, número ou ambos) na mesma ou em classes relacionadas;
  • Overriding: redefinição de um método definido anteriormente por uma das superclasses da hierarquia de uma classe.
  • Overloading: Gato(int age) {...} e Gato(String name) {...}
  • Overriding: redefinição por parte de Gato.respirar() de Animal.respirar() (sendo Gato uma subclasse de Animal)

1.4. (1.5 val.) Dê um exemplo prático de polimorfismo. Quais são as vantagens e inconvenientes do polimorfismo?

  • Polimorfismo: possibilidade de referenciar um objecto através de um tipo genérico ou de um tipo mais abstracto que o seu (numa hierarquia de classes, por exemplo)
  • Consequências: possibilidade de utilizar tipos concretos (ou mais específicos) em código escrito para tipos menos específicos; redução e reutilização de código; desenvolvimento incremental.
  • Exemplo: Animal <-- Gato

Parte 2 (resposta múltipla)

2.1. Os objectos partilham duas características: estado e comportamento. Como é definido o estado?

  1. o estado é o identificador do objecto
  2. o estado corresponde ao que um objecto pode fazer
  3. o estado é representado pelos atributos
  4. o estado depende fundamentalmente do número de subclasses
  5. o estado pode ser consultado acedendo à classe Object (no caso do Java)

2.2. Que nome se dá ao processo de esconder informação respeitante a alguns objectos

  1. polimorfismo
  2. herança
  3. encapsulamento
  4. inclusão
  5. instanciação

2.3. Qual destas frases é uma possível definição de “objecto”?

  1. Um objecto é uma realização de uma classe
  2. Um objecto é uma template de uma classe
  3. Um objecto é uma instância de uma classe
  4. Um objecto pode estender uma classe
  5. Um objecto pode ser estendido por uma classe

2.4. Que característica das linguagens OO permite que objectos de diferentes tipos sejam tratados de forma indiferenciada?

  1. abstracção
  2. herança
  3. polimorfismo
  4. instanciação
  5. nenhum dos anteriores

2.5. Qual e o resultado da execução do seguinte programa em Java?

<java5> public class Hello {

 public static void main(String[] args) { 
   Integer a = new Integer(2);
   Integer b = new Integer(2);
   System.out.println(b == a);
 } 

} </java5>

  1. o programa lança de uma excepção
  2. o programa escreve true
  3. o programa escreve false
  4. o programa termina sem produzir erros/excepções e sem escrever nada
  5. nenhum dos anteriores