Fundamentos de Programação em Java
Parte 2: Aplicações Práticas
Implementando os conceitos básicos em exemplos concretos
1
Programa para verificar se um número é primo:
public static boolean isPrimo(int numero) {
if (numero <= 1) {
return false;
}
if (numero == 2) {
return true;
}
if (numero % 2 == 0) {
return false;
}
for (int i = 3; i <= Math.sqrt(numero); i += 2) {
if (numero % i == 0) {
return false;
}
}
return true;
}
Usando o método:
public static void main(String[] args) {
System.out.println("Números primos de 1 a 20:");
for (int i = 1; i <= 20; i++) {
if (isPrimo(i)) {
System.out.print(i + " ");
}
}
// Saída: 2 3 5 7 11 13 17 19
}
2
Análise do Algoritmo de Números Primos
Otimizações implementadas:
- Verificação rápida para 1 e 2: Casos especiais tratados imediatamente
- Exclusão de números pares: Apenas 2 é primo entre os pares
- Limite de busca otimizado: Verificar apenas até a raiz quadrada do número
- Incremento de 2: Verificar apenas divisores ímpares (exceto o 2)
Este algoritmo é eficiente para verificar números de tamanho moderado, mas pode ser ainda mais otimizado para números muito grandes com o teste de Miller-Rabin ou outros algoritmos probabilísticos.
3
Esta implementação demonstra o uso de loops, estruturas condicionais e interação com o usuário.
import java.util.Scanner;
public class Calculadora {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double num1, num2, resultado = 0;
char operacao;
boolean continuar = true;
while (continuar) {
System.out.println("\n==== CALCULADORA SIMPLES ====");
System.out.print("Digite o primeiro número: ");
num1 = scanner.nextDouble();
System.out.print("Digite a operação (+, -, *, /): ");
operacao = scanner.next().charAt(0);
System.out.print("Digite o segundo número: ");
num2 = scanner.nextDouble();
switch (operacao) {
case '+':
resultado = num1 + num2;
break;
case '-':
resultado = num1 - num2;
break;
case '*':
resultado = num1 * num2;
break;
case '/':
if (num2 != 0) {
resultado = num1 / num2;
} else {
System.out.println("Erro: Divisão por zero!");
continue;
}
break;
default:
System.out.println("Operação inválida!");
continue;
}
System.out.println("Resultado: " + num1 + " " + operacao + " " + num2 + " = " + resultado);
System.out.print("Deseja continuar? (S/N): ");
char escolha = scanner.next().toUpperCase().charAt(0);
continuar = (escolha == 'S');
}
System.out.println("Calculadora encerrada. Obrigado!");
scanner.close();
}
}
4
Análise da Calculadora
Conceitos demonstrados:
- Entrada de dados: Uso da classe Scanner para ler do teclado
- Estrutura de repetição: Loop while para manter o programa em execução
- Estrutura de decisão: Switch-case para processar diferentes operações
- Tratamento de erro: Verificação de divisão por zero
- Interação com usuário: Solicitação de entrada e exibição de resultados
- Fluxo de controle: Uso da instrução continue para pular iterações inválidas
Possíveis melhorias:
- Adicionar tratamento de exceções para entradas inválidas
- Implementar operações mais avançadas (potência, raiz quadrada, etc.)
- Organizar o código em métodos separados para melhor manutenção
5
Programa para calcular médias e situação de alunos:
import java.util.Scanner;
public class SistemaNotas {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Quantos alunos deseja cadastrar? ");
int numAlunos = scanner.nextInt();
scanner.nextLine(); // Limpar buffer
String[] nomes = new String[numAlunos];
double[] medias = new double[numAlunos];
String[] situacoes = new String[numAlunos];
// Coleta de dados
for (int i = 0; i < numAlunos; i++) {
System.out.println("\nAluno " + (i+1) + ":");
System.out.print("Nome: ");
nomes[i] = scanner.nextLine();
double somaNotas = 0;
for (int j = 1; j <= 3; j++) {
System.out.print("Nota " + j + ": ");
double nota = scanner.nextDouble();
somaNotas += nota;
}
scanner.nextLine(); // Limpar buffer
// Calcula média
medias[i] = somaNotas / 3;
// Determina situação
if (medias[i] >= 7) {
situacoes[i] = "Aprovado";
} else if (medias[i] >= 5) {
situacoes[i] = "Recuperação";
} else {
situacoes[i] = "Reprovado";
}
}
// Exibição dos resultados
System.out.println("\n==== RELATÓRIO DE NOTAS ====");
System.out.println("Nome\t\tMédia\t\tSituação");
System.out.println("----------------------------------------");
for (int i = a < numAlunos; i++) {
System.out.printf("%-15s%.2f\t\t%s%n",
nomes[i], medias[i], situacoes[i]);
}
// Estatísticas
int aprovados = 0, recuperacao = 0, reprovados = 0;
double somaMedias = 0;
for (int i = 0; i < numAlunos; i++) {
somaMedias += medias[i];
if (situacoes[i].equals("Aprovado")) {
aprovados++;
} else if (situacoes[i].equals("Recuperação")) {
recuperacao++;
} else {
reprovados++;
}
}
double mediaGeral = somaMedias / numAlunos;
System.out.println("\n==== ESTATÍSTICAS ====");
System.out.printf("Média geral da turma: %.2f%n", mediaGeral);
System.out.println("Aprovados: " + aprovados +
" (" + (aprovados * 100 / numAlunos) + "%)");
System.out.println("Em Recuperação: " + recuperacao +
" (" + (recuperacao * 100 / numAlunos) + "%)");
System.out.println("Reprovados: " + reprovados +
" (" + (reprovados * 100 / numAlunos) + "%)");
scanner.close();
}
}
6
Análise do Sistema de Notas
Conceitos demonstrados:
- Arrays: Armazenamento de dados relacionados (nomes, médias, situações)
- Loops aninhados: Loop externo para alunos e interno para notas
- Condicionais: Determinação da situação do aluno com base na média
- Formatação de saída: Uso do método printf para formatar a tabela
- Cálculos estatísticos: Contagens e percentuais
O que você aprendeu com este exemplo:
- Como organizar dados relacionados usando arrays paralelos
- Como processar e analisar conjuntos de dados
- Como criar relatórios formatados no console
- Como calcular estatísticas básicas
8