Actividade

Esta aula tem os seguintes objectivos:
  1. Concepção de classes em Java que integram alguns conceitos fundamentais da Programação com Objectos, como a herança, substituição de métodos e polimorfismo;
  2. Utilização do diagrama de classes da linguagem UML para modelar um problema;
  3. Resolução do enunciado da aula;
  4. Resolução do exercício EP2  para avaliação.

Enunciado da Aula


1º Exercício


Considere a seguinte classe Numero. Cada instância de Número representa um determinado número inteiro o qual pode ser alterado durante o tempo de vida de cada instância. 
Pretende-se agora construir uma nova entidade, NumeroComMemoria, que tem um comportamento semelhante à classe Numero (deve suportar pelo menos as mesmas funcionalidade) mas que tem a seguinte funcionalidade extra:
  • É possível desfazer a última alteração realizada. Por exemplo, suponha que criou um NumeroComMemoria a representar o número 5 e de seguida se altera o seu valor para 10. A nova funcionalidade de desfazer a última alteração deverá permitir alterar o valor de 10 para 5.
  • Realizar a funcionalidade de desfazer duas vezes seguidas deve deixar o número inalterado. Considerando o exemplo anterior, ao realizar o desfazer pela segunda vez, o valor do número deverá passar de 5 para 10.
  • É possível obter o valor anterior. Caso não haja valor anterior (ainda não foi feita qualquer alteração ao número em causa), então devolve o próprio valor do número.

Realize as seguintes actividades:
  1. Modelize este domínio utilizando o diagrama de classes UML.
  2. Concretize a classe NumeroComMemoria.

2 º Exercício

Modelize o seguinte domínio utilizando o diagrama de classes UML.

Uma estação de serviço armazena combustível, tem uma determinada capacidade de armazenamento e tem 10 bombas de combustível. Cada bomba é identificada por um número que pode variar entre 0 e 9. Os veículos podem abastecer-se numa das 10 bombas disponíveis. A estação de serviço contabiliza o combustível consumido em cada uma das bombas. Quando uma estação de serviço é criada é indicada a sua capacidade de armazenamento e a estação de serviço criada está cheia de combustível. Considere que o combustível é armazenado centralmente e que é partilhado por todas as bombas. Adicionalmente, a estação de serviço deve ainda suportar as seguintes funcionalidades:

  • abastecer uma determinada quantidade de combustível numa dada bomba de combustível. Deve devolver a quantidade de combustível efectivamente abastecido;
  • obter a a quantidade de combustível disponível para abastecimento;
  • obter a quantidade de combustível abastecido através de uma dada bomba;
  • Adicionar combustível à estação de serviço.
Note que na concretização de algumas destas funcionalidades poderá ser necessário ter em conta o estado actual da estação de serviço. Por exemplo, a funcionalidade de abastecer ma dada quantidade de combustível  deverá verificar se existe combustível suficiente para satisfazer o pedido. Caso contrário, deverá apenas retirar o restante e devolver a quantidade de combustível efectivamente retirada.

Um veículo tem uma marca, que corresponde a uma cadeia de caracteres arbitrária. Na criação de um veículo é necessário especificar a marca do veículo. Cada veículo pode estar associado a uma dada estação de serviço. Esta associação pode ser alterada em qualquer instante. Adicionalmente, um veículo pode acelerar, travar, buzinar e abastecer:
  • acelera deverá simplesmente imprimir para o ecrã a seguinte cadeia de caracteres: "VRUM VRUM";
  • trava deverá imprimir "GRRR GRRR";
  • buzina imprime "PII PII";
  • abastece recebe a quantidade de combustível a abastecer e a bomba de combustível a utilizar e deverá realizar o abastecimento na estação de serviço associado ao veículo. Deve escrever a quantidade de combustível realmente abastecida;
  • devolve a marca do veículo;

Um veículo pesado é, para todos os efeitos, um veículo, no entanto existem duas diferenças importantes. Em primeiro lugar, quando um veículo pesado buzina dever-se-á imprimir no ecrã a cadeia de caracteres "POO POO", ao invés do que ocorre num veículo genérico. Por último, devido à necessidade de controlar a actividade deste tipo de veículos, deverá haver forma de contabilizar o número de acelerações e travagens. Assim, esta classe deverá ainda disponibilizar os métodos obtemNumeroAceleracoes e obtemNumeroTravagens que devolvem as contagens respectivas.

3º Exercício


Leia cuidadosamente o seguinte enunciado, correspondente a uma aplicação que representa um editor gráfico (com uma interface via linha de comandos).

Considere um editor gráfico que é responsável por gerir as várias formas que podem ser criadas pelo utilizador. Cada forma tem um identificador único (um número inteiro) que deve ser determinado no momento da criação da forma. Todas as formas tem um ponto, designado como ponto de origem. Uma forma pode estar associada ou não a um editor. Uma forma suporta fundamentalmente duas funcionalidades:

  • mover - recebe dois inteiros como argumento e realiza o deslocamento, nos eixos x e y  na forma;
  • desenhar - desenha a forma, que neste caso corresponde a devolver uma cadeia de caracteres com os dados específicos da forma: identificador Tipo[origem restantes características]

A aplicação deve suportar vários tipos de forma, cada um deles com os seus dados específicos e comportamentos potencialmente diferentes:

  • Quadrado - é caratcterizado por um ponto (canto inferior esquerdo) e pelo tamanho do lado. Este ponto corresponde ao ponto de origem para este tipo de forma. Desenhar um quadrado corresponde a escrever o valor do canto e o tamanho do lado. Mover um quadrado corresponde a deslocar o canto;
  • Linha  -  é caracterizada por dois pontos (as extremidades da linha). O ponto de origem corresponde ao primeiro extremo da linha. Desenhar uma linha corresponde a escrever os pontos. Mover uma linha corresponde a deslocar os dois pontos;
  • Círculo -  é caracterizado por um ponto (centro do círculo) e pelo raio. Desenhar um círculo corresponde a escrever os valores do centro e do raio. Mover um círculo corresponde a deslocar o centro. O centro de um círculo corresponde ao ponto de origem.
Nota: O tipo de cada forma (a apresentar no método desenhar) corresponde ao nome da classe da forma.
Modele este domínio utilizando o diagrama de classes UML.

4º Exercício


Concretize as entidades QuadradoLinha e Círculo do exercício nº 3 deste enunciado;