Exercícios ⚒️
Os exercícios abaixo ajudarão a fixar os conceitos abordados. Elabore-os individualmente.
Bloco 1: Fundamentos e Estruturas de Controle (Parte I)
-
Calculadora de Média: Escreva um programa que utiliza a classe
Scannerpara ler 3 notas de um aluno. Calcule e exiba a média aritmética das notas. Em seguida, usando uma estruturaif-else, informe se o aluno foi “Aprovado” (média >= 7), “Recuperação” (média >= 5 e < 7) ou “Reprovado” (média < 5). -
Tabuada com
for: Peça ao usuário um número inteiro. Use um laçofortradicional para calcular e exibir a tabuada de multiplicação desse número, do 1 ao 10. (Ex: “5 x 1 = 5”, “5 x 2 = 10”, …). -
Adivinhe o Número: Gere um número aleatório entre 1 e 100. Peça ao usuário para adivinhar o número. Use um laço
whilepara continuar pedindo um número até que o usuário acerte. A cada tentativa, dê uma dica se o palpite foi “muito alto” ou “muito baixo”. No final, informe o número de tentativas. -
Soma de Ímpares em um Array: Crie um array de inteiros com números pré-definidos. Utilize um laço
for-eachpara percorrer o array e somar todos os números que forem ímpares. Exiba o resultado final.
Bloco 2: Programação Orientada a Objetos (Parte II)
-
Classe
Carro: Crie uma classeCarrocom os seguintes atributos privados:marca(String),modelo(String) eano(int). Implemente um construtor para inicializar esses atributos e métodos públicosgetterspara cada um deles. Adicione um métodoexibirInfo()que imprime os detalhes do carro. -
Classe
Circulocom Encapsulamento: Crie uma classeCirculocom um atributo privadoraio(double). Crie um construtor e os métodosgetRaioesetRaio. NosetRaio, adicione uma validação para garantir que o raio nunca seja um valor negativo ou zero (lance umaIllegalArgumentExceptionse a condição não for atendida). Crie também um métodocalcularArea()que retorna a área do círculo ($\pi \times raio^2$). -
Herança de
Veiculo: Crie uma classeVeiculocom atributosmarcaemodelo. Em seguida, crie duas subclasses:Carro(que adicionanumeroDePortas) eMoto(que adicionacilindradas). Sobrescreva o métodotoString()em todas as classes para exibir suas informações de forma completa. -
Exceção Personalizada
SaldoInsuficienteException: Reutilizando a ideia daContaBancariada aula, crie sua própria exceção checadaSaldoInsuficienteException. Modifique o métodosacarpara que, em vez de retornarfalse, ele lance essa exceção quando o saldo for insuficiente. Crie uma classe de teste para tratar essa exceção com um blocotry-catch.
Bloco 3: API de Collections - List (Parte IV)
-
Lista de Tarefas (
ArrayList): Crie um programa que gerencia uma lista de tarefas (Strings). Permita ao usuário: adicionar uma tarefa, remover uma tarefa pelo seu índice e listar todas as tarefas. Use umArrayList. -
Ordenando Números: Crie um
ArrayListdeInteger. Adicione 10 números inteiros aleatórios ou definidos por você. Utilize a classeCollectionse seu métodosort()para ordenar a lista em ordem crescente e, em seguida, exiba o resultado. -
Manipulando o Início e o Fim (
LinkedList): Crie umaLinkedListpara simular uma fila de atendimento. Adicione 5 nomes de clientes no final da fila. Em seguida, “atenda” os 2 primeiros clientes (removendo-os do início da lista). Por fim, adicione 2 novos clientes “prioritários” no início da fila. Exiba a ordem final da fila. -
Busca por Elemento: Crie um
ArrayListde Strings com nomes de cidades. Peça ao usuário para digitar o nome de uma cidade. Verifique se a cidade está presente na lista usando o métodocontains(). Se estiver, informe o índice da sua primeira ocorrência usando o métodoindexOf().
Bloco 4: API de Collections - Set (Parte IV)
-
Removendo Duplicatas: Crie um
ArrayListdeIntegerque contenha números duplicados. Escreva um código que receba esta lista e retorne uma nova coleção sem os elementos duplicados. (Dica: a forma mais fácil é usar umHashSet). -
Unicidade de E-mails (
HashSet): Crie umHashSetpara armazenar endereços de e-mail (Strings). Tente adicionar alguns e-mails, incluindo um que seja duplicado. Imprima o tamanho doSetpara confirmar que o e-mail duplicado não foi adicionado. -
Ordem de Inserção (
LinkedHashSet): Crie umLinkedHashSete adicione os nomes dos dias da semana fora de ordem (ex: “Quarta”, “Segunda”, “Sexta”). Itere sobre oSete imprima os elementos para verificar que eles são exibidos na ordem exata em que foram inseridos. -
Nomes em Ordem Alfabética (
TreeSet): Crie umTreeSetde Strings e adicione 5 nomes de pessoas fora da ordem alfabética. Itere sobre oSete observe que os nomes são impressos em ordem alfabética natural. -
Objetos Personalizados em um
TreeSet: Crie uma classeProdutocomnome(String) epreco(double). Faça com que a classeProdutoimplemente a interfaceComparablepara que os produtos sejam ordenados pelo preço (do menor para o maior). Crie umTreeSet<Produto>e adicione alguns produtos para testar a ordenação.
Bloco 5: API de Collections - Map (Parte IV)
-
Dicionário Simples (
HashMap): Crie umHashMappara funcionar como um dicionário de tradução simples (Português -> Inglês). Adicione 5 palavras e suas traduções. Peça ao usuário uma palavra em português e, se ela existir no mapa, exiba sua tradução. -
Contador de Frequência de Palavras: Crie uma String contendo um parágrafo de texto. Use um
HashMap<String, Integer>para contar a frequência de cada palavra no texto. Ao final, itere sobre o mapa e exiba cada palavra e sua contagem. -
Agenda de Contatos: Use um
HashMappara criar uma agenda onde a chave é o nome do contato (String) e o valor é o número de telefone (String). Permita ao usuário: adicionar um novo contato, buscar um telefone pelo nome e listar todos os contatos (nome e telefone). -
Mantendo a Ordem de Cadastro (
LinkedHashMap): Crie umLinkedHashMappara armazenar produtos e seus respectivos códigos (ex:Integercomo chave,Stringcomo valor). Adicione 5 produtos. Itere sobre o mapa e mostre que a ordem de exibição é a mesma da ordem de inserção. -
Listagem Ordenada (
TreeMap): Crie umTreeMappara armazenar as notas de alunos em uma prova, onde a chave é o nome do aluno (String) e o valor é a nota (Double). Adicione 5 alunos fora de ordem alfabética. Ao listar os alunos e suas notas, observe que oTreeMapos exibe em ordem alfabética pelo nome. -
Verificando a Existência de Chave e Valor: Usando o
HashMapdo exercício da agenda, escreva um código que verifique se um determinado nome (containsKey) e se um determinado telefone (containsValue) já existem na agenda.
Bloco 6: API de Collections - Queue e Deque (Parte IV)
-
Fila de Impressão (
Queue): Simule uma fila de impressão. Crie umaQueue(usandoLinkedListcomo implementação) e adicione 5 documentos (Strings com nomes como “Documento1.pdf”, “Foto.png”, etc.). Em seguida, processe a fila, “imprimindo” (removendo) cada documento e exibindo seu nome na ordem em que entraram. -
Pilha de Livros (
Dequecomo Stack): Use umArrayDequepara simular uma pilha de livros. Permita ao usuário “empilhar” 3 livros (push). Depois, “desempilhe” um livro (pop) e veja qual foi removido (o último que entrou). Por fim, usepeekpara “espiar” o livro que está no topo da pilha sem removê-lo.
Bloco 7: Exercícios Integrados
-
Catálogo de Produtos por Categoria: Crie uma estrutura de dados para um catálogo de produtos. Use um
Map<String, List<Produto>>, onde a chave é o nome da categoria (ex: “Eletrônicos”) e o valor é uma lista de objetos da classeProdutopertencentes àquela categoria. Popule a estrutura com alguns dados e depois escreva um código para listar todos os produtos de uma categoria específica. -
Sorteio de Ganhadores Únicos: Crie uma lista (
ArrayList) com nomes de participantes, permitindo que alguns nomes se repitam. Escreva um método que realize um sorteio: ele deve primeiro garantir que cada participante seja considerado apenas uma vez (mesmo que seu nome apareça várias vezes) e depois sortear aleatoriamente 3 nomes únicos para serem os ganhadores. -
Invertendo uma Frase: Peça ao usuário uma frase. Use um
Deque(como uma pilha) para armazenar cada palavra da frase. Em seguida, desempilhe as palavras uma a uma para formar e exibir a frase na ordem inversa. -
Histórico de Navegação: Use uma
LinkedListpara simular o histórico de um navegador. Crie métodosvisitar(String url),voltar()eavancar(). O métodovoltardeve navegar para a URL anterior no histórico, e oavancarpara a próxima, gerenciando um “ponteiro” ou índice da página atual. -
Agrupando Alunos por Nota: Tendo uma
List<Aluno>(ondeAlunotemnomeenota), crie umMap<String, List<Aluno>>que agrupe os alunos por faixa de nota: “Aprovados” (nota >= 7), “Recuperação” (nota >= 5 e < 7) e “Reprovados” (nota < 5).
Bloco 8: Desafios - Reflection
Os exercícios a seguir têm como objetivo praticar o uso da API de Reflexão do Java para inspecionar e manipular objetos dinamicamente.
- Inspetor de Classe com Reflection
O primeiro exemplo da aula mostra como listar os métodos de uma classe. Vamos expandir essa ideia para criar um inspetor universal.
-
Objetivo: Crie uma classe
AnalisadorDeClassecom um método estáticopublic static void inspecionar(Object obj). Este método deve receber qualquer objeto Java e imprimir no console:- O nome completo da classe do objeto.
- O nome de todos os seus atributos (campos), incluindo os privados.
- O nome de todos os seus métodos, incluindo os privados.
-
Dicas:
- Use
obj.getClass()para obter o objetoClass. - Use
getDeclaredFields()para obter os atributos. - Use
getDeclaredMethods()para obter os métodos.
- Use
-
Classe para Teste:
class Produto { private int codigo; public String nome; protected double preco; public Produto(int codigo, String nome, double preco) { this.codigo = codigo; this.nome = nome; this.preco = preco; } private double calcularImposto() { return preco * 0.1; } } // No seu método main: // Produto p = new Produto(101, "Notebook Gamer", 8500.0); // AnalisadorDeClasse.inspecionar(p);
- Modificador de Atributos Privados
A aula demonstra como a reflexão pode quebrar o encapsulamento para modificar atributos privados, uma técnica essencial para frameworks de injeção de dependência e ORM.
-
Objetivo: Crie uma classe
Configuracaocom um atributoprivate String urlConexao = "localhost:5432";. Em outra classe, crie um métodomainque, sem usar getters ou setters, utilize reflection para alterar o valor deste atributo privado para"db.producao.com:5432". Ao final, imprima o valor para confirmar a alteração. -
Dicas:
- Crie uma instância de
Configuracao. - Obtenha o
Field(campo) correspondente aurlConexaousandogetDeclaredField("urlConexao"). - Torne o campo acessível com
field.setAccessible(true). - Altere seu valor usando
field.set(objetoInstanciado, "novoValor"). - Para verificar, use
field.get(objetoInstanciado)para ler o novo valor e imprimi-lo.
- Crie uma instância de
- Framework de Testes Simulado com Anotações
Este exercício simula como frameworks (JUnit, TestNG) usam reflection para encontrar e executar métodos de teste automaticamente.
-
Objetivo: Desenvolver um pequeno executor de testes que executa métodos marcados com uma anotação personalizada.
-
Passos:
- Crie uma anotação:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.annotation.ElementType; @Retention(RetentionPolicy.RUNTIME) // Essencial para que a anotação esteja disponível via reflection @Target(ElementType.METHOD) // A anotação só pode ser aplicada a métodos public @interface Teste { } - Crie uma classe com métodos de “teste”:
public class MinhaClasseDeTeste { @Teste public void testeSoma() { System.out.println("Executando testeSoma: SUCESSO"); } public void metodoComum() { System.out.println("Este não é um teste."); } @Teste public void testeLogin() { System.out.println("Executando testeLogin: SUCESSO"); } } - Crie a classe
ExecutorDeTestes:- Ela deve ter um método
public static void executarTestes(Object obj). - Dentro deste método, use reflection para obter todos os métodos da classe do objeto recebido.
- Itere sobre os métodos e verifique, para cada um, se ele possui a anotação
@Testeusandomethod.isAnnotationPresent(Teste.class). - Se um método tiver a anotação, invoque-o dinamicamente usando
method.invoke(obj).
- Ela deve ter um método
- Crie uma anotação:
Bloco 9: VcRiquinho e Lanchonete Quase Três Lanches
- Os exercícios VcRiquinho e Lanchonete Quase Três Lanches estão disponíveis no Moodle. Leia o enunciado e elabore as tarefas pedidas.