Lista 4

Recomendações Importantes

    • A lista deve ser entregue até às 23:59:59 do dia 27/06.
    • Deixe seus programas entendíveis. Imprima mensagens para auxiliar o usuário a utilizar o seu programa.
    • Seja criativo. As mensagens do seu programa não necessitam estar iguais aos exemplos, a menos que seja especificado.
    • A lista é individual, portanto não compartilhe seus códigos com outros alunos ou os coloque em locais públicos (Pastebin, Github).
    • Não copie. Se for detectado cópia da internet ou de um colega, as LISTAS envolvidas serão completamente zeradas.
    • Alguns exemplos aqui definidos podem apresentar comentários. Note que são apenas ilustrativos.
    • A correção da Questão Desafio é booleana. Ou seja: você receberá o ponto extra do desafio caso a resposta esteja 100% correta. Qualquer erro, mesmo que seja em apenas um caso, invalidará a questão.
    • Não é permitido o uso da API de Java ou bibliotecas externas, exceto quando permitido explicitamente na questão, na lista, ou autorizado por um monitor através da lista de email (Google Groups) da disciplina. Questões submetidas que violarem essa regra serão consideradas como não entregues.
    • Questões enviadas fora do formato de submissão serão consideradas NÃO ENTREGUES.
    • São permitidas nessa lista, para todas as questões:
    • String

Questão 1 - "A band is blowing Dixie double four time"

Uma certa jazzband estava aperriada querendo organizar seus dados e resolveu chamar você, aluno do CIn, mão de obra barata e com tempo livre, pra desenvolver em Java um pequeno sistema de gerenciamento de instrumentos musicais, membros da banda e shows. Você dispõe das seguintes informações:

  • Um músico possui id, nome e preferência (uma descrição sobre o que ele toca melhor e como toca).
  • Um instrumento musical possui id, modelo, ano de fabricação e id do músico que é dono dele. Os instrumentos são divididos nas categorias:
    • Instrumento de Cordas: possui um tipo (ex.: baixo, guitarra...) e quantidade de cordas.
    • Instrumento de Sopro: possui um tipo (ex.: saxofone, trompete etc.), a nota musical mais grave que ele produz (ex.: C#2) e a nota musical mais aguda (ex.: F5).
    • Bateria: possui um array de componentes. Cada componente tem um nome (ex.: prato, surdo etc.) e uma quantidade.
    • Teclado: possui quantidade de teclas e quantidade de oitavas. Considere a quantidade de oitavas como (quantidade de teclas)/12 desprezando a parte decimal.
  • Um show tem id, data, renda, local, um array com os ids dos músicos que tocaram e um array com os ids dos instrumentos que foram utilizados. Um id igual a -1 significa que o músico ou instrumento não existe mais no repositório. Todo show tem um método getLucro que retorna quanto a banda ganhou com a realização do show. Um show deve ser comum ou beneficente.
  • Num show comum, o lucro é 70% da renda (os outros 30% vão pro ganancioso empresário da banda).
  • Um show beneficente possui uma instituição, a qual foi ajudada com a renda do show. Como a renda é totalmente revertida para a instituição, o lucro é 0.

Para todas as entidades, você deve implementar um método toString() que retorna uma string descrevendo todas as características do objeto. Utilize da forma mais apropriada os conceitos de herança e classe abstrata.

Questão 2 - "Comin' in out of the rain you hear the jazz go down"

A banda também pediu para você definir repositórios para as três classes básicas com as funções de adicionar um objeto, remover, buscar e verificar se certo elemento existe. Implemente-os com uso de array. O array deve iniciar com capacidade 20 e cada vez que for necessário ultrapassar a capacidade na hora de inserir, deve aumentar sua capacidade em 10. Obs.: é obrigatório o uso de interface para definir os repositórios.

Questão 3 - "Yes, and an old guitar is all he can afford"

Faça classes de negócio que vão se comunicar com os repositórios. Nestas classes serão lançadas exceções. Você deve lançar exceção para os seguintes casos especiais:

  • Adicionar um objeto que já existe
  • Remover um objeto que não existe
  • Buscar um objeto e não encontrá-lo.

Ainda assim, os integrantes acharam melhor evitar a inserção de alguns dados absurdos e de instrumentos com características que eles praticamente nunca vão tocar em shows. Após algum tumulto e polêmicas, acabaram entrando em consenso para os seguintes critérios de validação dos atributos:

  • O id de qualquer entidade, o ano de fabricação de um instrumento, a quantidade de qualquer componente de uma bateria e a renda de um show devem ser positivos
  • Um instrumento de cordas deve ter no mínimo 3 e no máximo 24 cordas
  • Um teclado deve ter no mínimo 54 teclas e no máximo 88
  • A data de um show deve estar exatamente no formato dd/mm/aaaa e deve ser uma data válida, incluindo a verificação dos anos bissextos.
  • Um mesmo instrumento não pode aparecer duas vezes num mesmo show
  • Um mesmo músico não pode aparecer duas vezes num mesmo show. Isto é, não pode haver ids válidos duplicados.

Questão 4 - "Good night, now it's time to go home"

Faça uma classe de fachada pro seu sistema! A fachada se comunica com as classes de negócio, independe da interface com que o usuário vai interagir (console, GUI etc.) e também lança exceções. Mantenha a consistência dos dados considerando as relações entre as entidades:

  • O dono de um instrumento deve existir no repositório de músicos
  • Os músicos e instrumentos que vão a um show devem existir nos repositórios de músicos e de instrumentos, respectivamente.
  • Os músicos são muito ciumentos. Um instrumento só pode ser levado para um show se o dono dele for também
  • Ao remover um instrumento, o id dele nos shows em que estava presente deve ser modificado para -1.
  • Ao remover um músico, o id dele nos shows em que estava presente deve ser modificado para -1 e todos os seus instrumentos também devem ser removidos.

Você pode acrescentar métodos às classes das questões anteriores (tirando as exceções) desde que cada uma continue se comunicando somente com a questão anterior.

Questão 5 - "And he makes it fast with one more thing"

Por último e mais importante, faça uma classe de teste, para interagir com o usuário e se comunicar com a fachada, onde através do console seja possível realizar todas as seguintes operações:

  • Criar e excluir objetos
  • Buscar nos repositórios usando o id, e visualizar os dados do objeto encontrado
  • Modificar a preferência de um músico

Trate todas as exceções da fachada utilizando blocos try/catch de forma que o programa não encerre quando qualquer uma dessas exceções for lançada e que fique claro para os usuários qual erro ocorreu. Obs.: nesta questão é permitido o uso de Scanner.

Questão Desafio - " 'We are the 'Sultans', we are the 'Sultans of Swing' "

Será concedido o token de desafio à quem conseguir nota maior ou igual a 8,5 nessa lista.