Lista 04#

Instruções#

  • Observe com atenção os requisitos e como os pacotes para cada questão devem ser organizados.
  • Todos os exercícios devem ser feitos em um único projeto do IntelliJ.
  • A correção será feita presencialmente, com o professor executando os casos de teste na sua máquina.
  • Baixe os casos de teste aqui
  • Respeite a estrutura de pacotes também no diretório de testes, mas mova para o diretório de testes do seu projeto apenas os casos de testes em que estiver trabalhando. Caso contrário, seu projeto apresentará erro de compilação enquanto não implementar todas as classes e métodos usados nos casos de testes.

Exercícios#

Questão 01. Implemente a classe Receita que representa uma receita culinária cadastrada em um aplicativo.

Atributos:

AtributoTipoDescrição
nomeStringNome da receita
tempoPreparointTempo de preparo em minutos
rendimentoPorcoesintQuantidade de porções geradas
ingredientesList<String>Lista interna de ingredientes

Requisitos:

  1. As classes devem estar dentro do pacote lista04.receita.
  2. O construtor deve lançar IllegalArgumentException se nome for nulo ou vazio, ou se tempoPreparo ou rendimentoPorcoes forem menores ou iguais a zero.
  3. Os setters de tempoPreparo e rendimentoPorcoes devem lançar IllegalArgumentException para valores inválidos, com mensagem descritiva.
  4. O método getIngredientes() deve retornar uma cópia da lista interna, nunca a referência direta.
  5. O método adicionarIngrediente(String ingrediente) deve ignorar silenciosamente entradas nulas ou vazias (sem lançar exceção — são situações esperadas em tempo de execução).
  6. O método removerIngrediente(String ingrediente) deve remover o ingrediente se ele existir na lista, ignorando silenciosamente caso não exista.

Questão 02. Implemente a classe Drone que representa o estado operacional de um drone de monitoramento.

Atributos:

AtributoTipoDescrição
identificadorStringCódigo único do drone (imutável após criação)
bateriaintNível de bateria em % (0 a 100)
altitudeintAltitude atual em metros (0 a 120)
emVoobooleanIndica se o drone está em voo

Requisitos:

As classes devem estar dentro do pacote lista04.drone.

  1. O construtor deve lançar IllegalArgumentException se identificador for nulo ou vazio.
  2. identificador não possui setter — é definido apenas no construtor.
  3. setBateria(int valor) deve lançar IllegalArgumentException se o valor estiver fora do intervalo 0–100, com mensagem indicando o valor recebido e o intervalo esperado.
  4. setAltitude(int metros) deve lançar IllegalArgumentException se o valor for negativo ou acima de 120. Deve ignorar a operação (sem lançar exceção) caso o drone não esteja em voo.
  5. O método decolar() não deve alterar o estado emVoo caso a bateria seja menor ou igual a 20%. Não lança exceção, pois bateria baixa é uma condição operacional normal.
  6. O método pousar() define emVoo = false e altitude = 0.

Questão 03. Implemente a classe Episodio que representa um episódio de um podcast.

Atributos:

AtributoTipoDescrição
tituloStringTítulo do episódio
numerointNúmero do episódio (imutável após criação)
duracaoMinutosintDuração em minutos
statusStringStatus: "RASCUNHO", "PUBLICADO" ou "ARQUIVADO"

Requisitos:

As classes devem estar dentro do pacote lista04.podcast.

  1. O construtor deve lançar IllegalArgumentException nos seguintes casos, com mensagens descritivas:
    • titulo nulo ou vazio.
    • numero menor ou igual a zero.
    • duracaoMinutos menor ou igual a zero.
  2. O setter de duracaoMinutos deve lançar IllegalArgumentException para valores inválidos.
  3. numero não possui setter.
  4. status não possui setter direto. As transições são feitas por três métodos, que ignoram a operação (sem lançar exceção) quando a transição não é permitida:
    • publicar(): muda de "RASCUNHO" para "PUBLICADO". Inválido em qualquer outro estado.
    • arquivar(): muda de "PUBLICADO" para "ARQUIVADO". Inválido em qualquer outro estado.
    • restaurar(): muda de "ARQUIVADO" para "RASCUNHO". Inválido em qualquer outro estado.

Questão 04. Implemente as classes Musica e Playlist.

Classe Musica:

AtributoTipoDescrição
tituloStringTítulo da música
artistaStringNome do artista
duracaoSegundosintDuração em segundos
prioridadeString"NORMAL" ou "URGENTE"

Requisitos gerais:

As classes devem estar dentro do pacote lista04.musica.

Requisitos de Musica:

  1. O construtor deve lançar IllegalArgumentException se titulo ou artista forem nulos ou vazios, ou se duracaoSegundos for menor ou igual a zero.
  2. O setter de prioridade deve lançar IllegalArgumentException se o valor não for "NORMAL" ou "URGENTE".

Classe Playlist:

AtributoTipoDescrição
nomeStringNome da playlist
filaList<Musica>Lista interna de músicas (não exposta diretamente)

Requisitos de Playlist:

  1. O construtor deve lançar IllegalArgumentException se nome for nulo ou vazio.
  2. Não forneça getter para fila.
  3. O método adicionar(Musica m) deve lançar IllegalArgumentException se m for nulo. Músicas "URGENTE" são inseridas antes das "NORMAL"; músicas "NORMAL" vão para o final.
  4. Implemente também os métodos:
    • remover(String titulo): remove a primeira música com o título informado, ignorando silenciosamente caso não exista.
    • proximaMusica(): retorna (sem remover) a primeira música da fila, ou null se vazia.
    • reproduzirProxima(): remove e retorna a primeira música da fila, ou null se vazia.
    • tamanho(): retorna o número de músicas na fila.
    • listar(): exibe título, artista e prioridade de cada música na ordem atual.

Questão 05. Implemente as classes ItemLaboratorio e EstoqueLaboratorio.

Classe ItemLaboratorio:

AtributoTipoDescrição
codigoStringCódigo do item (imutável)
nomeStringNome do item
quantidadeDisponivelintQuantidade atual em estoque (≥ 0)
quantidadeMinimaintQuantidade mínima de segurança (> 0)
statusString"NORMAL", "ALERTA" ou "ESGOTADO" — calculado automaticamente

Regras de status:

  • "ESGOTADO": quantidade disponível igual a zero.
  • "ALERTA": quantidade disponível maior que zero e menor ou igual à quantidade mínima.
  • "NORMAL": quantidade disponível maior que a quantidade mínima.

Requisitos gerais:

As classes devem estar dentro do pacote lista04.laboratorio.

Requisitos de ItemLaboratorio:

  1. O construtor deve lançar IllegalArgumentException se codigo ou nome forem nulos ou vazios, se quantidadeDisponivel for negativa, ou se quantidadeMinima for menor ou igual a zero.
  2. codigo não possui setter.
  3. status não possui setter — é recalculado automaticamente sempre que quantidadeDisponivel for alterada.
  4. quantidadeDisponivel só é alterada pelos métodos:
    • entrada(int quantidade): deve lançar IllegalArgumentException se quantidade for menor ou igual a zero.
    • saida(int quantidade): deve lançar IllegalArgumentException se quantidade for menor ou igual a zero. Deve ignorar a operação (sem lançar exceção) se o resultado deixar o estoque negativo, uma vez que falta de estoque é uma situação operacional esperada.

Classe EstoqueLaboratorio:

AtributoTipoDescrição
itensList<ItemLaboratorio>Lista interna de itens

Implemente os métodos:

  • cadastrar(ItemLaboratorio item): deve lançar IllegalArgumentException se item for nulo.
  • buscarPorCodigo(String codigo): retorna o item correspondente ou null.
  • listarEmAlerta(): retorna uma cópia da lista contendo apenas itens com status "ALERTA" ou "ESGOTADO".

Questão 06. Implemente as classes Consulta e AgendaMedica.

Classe Consulta:

AtributoTipoDescrição
idintIdentificador único (imutável)
nomePacienteStringNome do paciente
nomeMedicoStringNome do médico
dataHoraStringData e hora no formato "DD/MM/AAAA HH:MM"
statusString"AGENDADA", "CONFIRMADA", "CANCELADA" ou "REALIZADA"
observacoesStringObservações adicionais (pode ser vazio)

Regras de transição de status:

De → ParaPermitido?
AGENDADACONFIRMADASim
AGENDADACANCELADASim
CONFIRMADAREALIZADASim
CONFIRMADACANCELADASim
CANCELADA → qualquerNão
REALIZADA → qualquerNão

Requisitos gerais:

As classes devem estar dentro do pacote lista04.agendaMedica.

Requisitos de Consulta:

  1. O construtor deve lançar IllegalArgumentException se nomePaciente, nomeMedico ou dataHora forem nulos ou vazios, ou se id for menor ou igual a zero.
  2. id não possui setter.
  3. status não possui setter direto. As transições são feitas pelos métodos confirmar(), cancelar() e realizar(), que ignoram a operação (sem lançar exceção) quando a transição não é permitida.
  4. observacoes possui getter e setter sem restrições.
  5. Os demais atributos possuem apenas getter.

Classe AgendaMedica:

AtributoTipoDescrição
consultasList<Consulta>Lista interna de consultas

Implemente os métodos:

  • agendar(Consulta c): deve lançar IllegalArgumentException se c for nulo.
  • buscarPorId(int id): retorna a consulta ou null.
  • listarPorMedico(String nomeMedico): retorna uma cópia da lista filtrada pelo médico.
  • listarAtivas(): retorna consultas com status "AGENDADA" ou "CONFIRMADA".

Questão 07. Implemente as classes Documento e FilaDeImpressao.

Classe Documento:

AtributoTipoDescrição
nomeStringNome do arquivo
numeroPaginasintNúmero de páginas (> 0)
prioridadeString"NORMAL" ou "URGENTE"
statusString"AGUARDANDO", "IMPRIMINDO" ou "CONCLUIDO"

Requisitos gerais:

As classes devem estar dentro do pacote lista04.impressao.

Requisitos de Documento:

  1. O construtor deve lançar IllegalArgumentException se nome for nulo ou vazio, se numeroPaginas for menor ou igual a zero, ou se prioridade não for "NORMAL" ou "URGENTE".
  2. O status inicia como "AGUARDANDO" e não possui setter direto. As transições seguem a ordem AGUARDANDO → IMPRIMINDO → CONCLUIDO e são feitas pelos métodos iniciarImpressao() e concluir(), que ignoram a operação (sem lançar exceção) quando chamados fora de ordem.

Classe FilaDeImpressao:

AtributoTipoDescrição
nomeStringNome da impressora
filaList<Documento>Lista interna — não exposta diretamente

Requisitos de FilaDeImpressao:

  1. O construtor deve lançar IllegalArgumentException se nome for nulo ou vazio.
  2. Não forneça getter para fila.
  3. Implemente os métodos:
    • adicionar(Documento d): deve lançar IllegalArgumentException se d for nulo. Documentos "URGENTE" são inseridos ao final do bloco de urgentes já existente (antes dos normais); documentos "NORMAL" vão para o final da fila.
    • cancelar(String nome): remove da fila o documento com aquele nome somente se seu status for "AGUARDANDO". Ignora (sem lançar exceção) se o documento não for encontrado ou não puder ser cancelado.
    • imprimirProximo(): pega o primeiro documento da fila, chama iniciarImpressao() e depois concluir(), exibindo nome e número de páginas. Remove-o da fila ao concluir. Exibe mensagem se a fila estiver vazia.
    • exibirFila(): mostra nome, prioridade e status de cada documento na ordem atual.
    • totalPaginasNaFila(): retorna a soma das páginas de todos os documentos ainda na fila.