AFF Education Construa seu Futuro

Aula 43 - Desafio

Desafio: Aplicando Estruturas de Controle

Nesta aula, vamos colocar em prática os conhecimentos adquiridos sobre estruturas de controle (if-else, for, while, do-while) através de desafios de programação. Estes exercícios ajudarão a consolidar os conceitos aprendidos e desenvolver sua lógica de programação.

Desafio 1: Soma dos Valores

Enunciado:

Crie um programa que solicite ao usuário para inserir valores entre 0 e 10. O programa deve continuar solicitando valores até que o usuário digite um valor fora desse intervalo. Ao final, o programa deve exibir:

  1. A soma de todos os valores

Utilize a estrutura do-while para continuar solicitando valores enquanto forem válidas.

Crie

Dentro do loop, verifique se o valor inserido está entre 0 e 10. Se estiver, adicione-o à soma; caso contrário, encerre o loop.

import java.util.Scanner;
public class validacaoValor {
    public static void main(String[] args) {
        Scanner  entrada = new Scanner(System.in);
        int soma = 0;
        int valor;
        System.out.println("Soma de valores entre 0 e 10. Para encerrar, digite um valor fora desse intervalo.");
        do{
            System.out.print("\nDigite valor entre 0 e 10: ");
            valor = entrada.nextInt();
            if(valor < 0 || valor > 10)
                break;
            soma = soma + valor;
        } while (true);

        System.out.println("A soma é: " + soma);
        entrada.close();
    }
}

Soma de valores entre 0 e 10. Para encerrar, digite um valor fora desse intervalo.

Digite valor entre 0 e 10: 1

Digite a nota: 2

Digite a nota: 3

Digite a nota: 4

Digite a nota: 5

Digite a nota: 11

A soma é: 10

Desafio 2: Média das notas

Enunciado:

Crie um programa que solicite ao usuário para inserir notas (tipo double, separadas por vírgulas) entre 0 e 10. O programa deve continuar solicitando notas até que o usuário digite um valor fora desse intervalo. Ao final, o programa deve exibir:

  1. A média de todas as notas

Utilize a estrutura do-while para continuar solicitando valores enquanto forem válidas.

As notas devem ser separadas por vírgulas.

Crie

Ao final do loop, calcule a média dividindo a soma pelo contador de notas válidas.

import java.util.Scanner;
public class mediaNotas {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        double soma = 0;
        int contador = 0;
        double valor;
        double media;
        System.out.println("Cálculo da Média de Notas entre 0 e 10 (para sair digite um valor fora desse intervalo)");
        System.out.println("Digite as notas separadas por vírgula (e não por ponto):");
        do {
            System.out.print("Digite uma nota entre 0 e 10: ");
            valor = entrada.nextDouble();
            if (valor < 0 || valor > 10)
                break;
            soma += valor;
            contador++;
        } while (true);

        if (contador > 0) {
            media = (double) soma / contador;
            System.out.println("A média é: " + media);
        } else {
            System.out.println("Nenhum valor válido foi inserido.");
        }
        entrada.close();
    }
}

Cálculo da Média de Notas entre 0 e 10 (para sair digite um valor fora desse intervalo).

Digite as notas separadas por vírgula (e não por ponto):

Digite uma nota entre 0 e 10: 4,5

Digite uma nota entre 0 e 10: 6,5

Digite uma nota entre 0 e 10: 11

A média é: 5.5

Desafio 3: Verificação de Número Primo

Enunciado:

Um número primo é aquele que é divisível apenas por 1 e por ele mesmo. Crie um programa que verifique se um número fornecido pelo usuário é primo.

Em seguida, modifique o programa para exibir todos os números primos no intervalo de 1 a N, onde N é informado pelo usuário.

Para verificar se um número é primo, você pode criar um método que recebe um número inteiro como parâmetro e retorna um booleano indicando se o número é primo ou não. Para encontrar os números primos em um intervalo, você pode usar um loop para iterar de 1 até N e chamar o método de verificação de primalidade para cada número.

Use o seguinte método personalizado:

                // Método para verificar se um número é primo
    public static boolean ehPrimo(int numero) {
        if (numero <= 1) return false;
        if (numero <= 3) return true;
        if (numero % 2 == 0) return false;
        
        int raiz = (int) Math.sqrt(numero);
        for (int i = 3; i <= raiz; i += 2) {
            if (numero % i == 0) return false;
        }
        
        return true;
    }
            
import java.util.Scanner;

public class NumerosPrimos {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Verificando se um número específico é primo
        System.out.print("Digite um número para verificar se é primo: ");
        int numero = scanner.nextInt();
        
        if (ehPrimo(numero)) {
            System.out.println(numero + " é um número primo.");
        } else {
            System.out.println(numero + " não é um número primo.");
        }
        
        // Encontrando números primos em um intervalo
        System.out.print("\nDigite um número N para encontrar todos os primos de 1 a N: ");
        int n = scanner.nextInt();
        
        System.out.println("\nNúmeros primos de 1 a " + n + ":");
        
        // Caso especial para o número 1
        if (n >= 1) {
            System.out.println("1 não é considerado primo.");
        }
        
        // Verificando cada número no intervalo
        int contador = 0;
        for (int i = 2; i <= n; i++) {
            if (ehPrimo(i)) {
                System.out.print(i + " ");
                contador++;
                
                // Quebra de linha a cada 10 números para melhor visualização
                if (contador % 10 == 0) {
                    System.out.println();
                }
            }
        }
        
        System.out.println("\n\nTotal de números primos encontrados: " + contador);
        
        scanner.close();
    }
    
    // Método para verificar se um número é primo
    public static boolean ehPrimo(int numero) {
        // Casos especiais
        if (numero <= 1) {
            return false;  // 0 e 1 não são primos
        }
        
        if (numero <= 3) {
            return true;  // 2 e 3 são primos
        }
        
        // Verificando divisibilidade por 2
        if (numero % 2 == 0) {
            return false;  // Números pares maiores que 2 não são primos
        }
        
        // Verificando divisibilidade por ímpares até a raiz quadrada
        // Otimização: só precisamos verificar até a raiz quadrada do número
        int raiz = (int) Math.sqrt(numero);
        
        for (int i = 3; i <= raiz; i += 2) {
            if (numero % i == 0) {
                return false;  // Encontrou um divisor
            }
        }
        
        return true;  // Nenhum divisor encontrado
    }
}

Digite um número para verificar se é primo: 17

17 é um número primo.

Digite um número N para encontrar todos os primos de 1 a N: 50

Números primos de 1 a 50:

1 não é considerado primo.

2 3 5 7 11 13 17 19 23 29

31 37 41 43 47

Total de números primos encontrados: 15

Observação sobre otimização: Para verificar se um número é primo, só precisamos dividir até a raiz quadrada do número. Se não houver divisores até esse ponto, não haverá divisores maiores que a raiz quadrada.

Desafio 4: Contador de Palavras

Enunciado:

Crie um programa que leia uma frase do usuário e conte:

  1. O número total de caracteres (excluindo espaços)
  2. O número de palavras na frase
  3. O número de vogais
  4. O número de consoantes

Você pode usar o método split() da classe String para dividir a frase em palavras. Para contar vogais e consoantes, percorra cada caractere da frase e verifique se é uma letra, e se é uma vogal ou consoante.

import java.util.Scanner;

public class ContadorPalavras {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("Digite uma frase:");
        String frase = scanner.nextLine();
        
        // Contando o número de caracteres (excluindo espaços)
        int totalCaracteres = 0;
        for (int i = 0; i < frase.length(); i++) {
            if (frase.charAt(i) != ' ') {
                totalCaracteres++;
            }
        }
        
        // Contando o número de palavras
        String[] palavras = frase.split("\\s+");  // Divide a frase por um ou mais espaços
        int totalPalavras = palavras.length;
        
        // Se a frase estiver vazia, não há palavras
        if (frase.trim().isEmpty()) {
            totalPalavras = 0;
        }
        
        // Contando vogais e consoantes
        int vogais = 0;
        int consoantes = 0;
        
        for (int i = 0; i < frase.length(); i++) {
            char c = Character.toLowerCase(frase.charAt(i));
            
            if (c >= 'a' && c <= 'z') {  // Verifica se é uma letra
                if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
                    vogais++;
                } else {
                    consoantes++;
                }
            }
        }
        
        // Exibindo os resultados
        System.out.println("\nAnálise da frase:");
        System.out.println("Total de caracteres (excluindo espaços): " + totalCaracteres);
        System.out.println("Total de palavras: " + totalPalavras);
        System.out.println("Total de vogais: " + vogais);
        System.out.println("Total de consoantes: " + consoantes);
        
        scanner.close();
    }
}

Digite uma frase:

Java é uma linguagem de programação incrível!

Análise da frase:

Total de caracteres (excluindo espaços): 38

Total de palavras: 7

Total de vogais: 17

Total de consoantes: 17

Observação: Este programa considera apenas as letras básicas do alfabeto inglês. Para um programa mais completo, seria necessário considerar letras acentuadas, caracteres especiais e outros alfabetos.

Exercícios

Teste seus conhecimentos sobre os desafios apresentados:

1. No Desafio 1 (Soma dos Valores), por que utilizamos a estrutura do-while em vez de while?

2. No Desafio 2 (Média das Notas), por que precisamos usar o comando entrada.nextDouble() em vez de entrada.nextInt()?

3. No Desafio 3 (Verificação de Número Primo), por que verificamos apenas até a raiz quadrada do número?

4. No Desafio 3, qual o resultado de ehPrimo(1)?

5. No Desafio 4 (Contador de Palavras), qual método da classe String é usado para dividir a frase em palavras?

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Para somar apenas os números pares de 1 a 10 em um for, qual teste usar dentro do laço?

2. Para contar quantos números de 1 a 100 são múltiplos de 5, incrementa-se um contador quando: