Médio Java

Contar vogais e consoantes

Enunciado

Leia uma frase e conte quantas vogais e quantas consoantes ela possui, ignorando espaços e caracteres não alfabéticos. Considere apenas letras de A a Z (maiúsculas ou minúsculas).

Requisitos

  • Ler uma linha com Scanner.
  • Contar vogais (a, e, i, o, u) e consoantes separadamente.
  • Ignorar espaços, números e pontuação.
  • Imprimir os dois totais.

Código inicial

import java.util.Scanner;

public class ContaVogaisConsoantes {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String frase = sc.nextLine();
        // Seu código aqui
    }
}

Saída esperada

Vogais: 6
Consoantes: 8
Ver dica

Converta a frase para minúsculas e verifique se cada caractere está entre 'a' e 'z'. Use charAt() em um laço.

Mostrar solução
import java.util.Scanner;

public class ContaVogaisConsoantes {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String frase = sc.nextLine().toLowerCase(); // facilita a comparação

        int vogais = 0;
        int consoantes = 0;

        for (int i = 0; i < frase.length(); i++) {
            char c = frase.charAt(i);
            // Verifica se é letra
            if (c >= 'a' && c <= 'z') {
                if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
                    vogais++;
                } else {
                    consoantes++;
                }
            }
        }

        System.out.println("Vogais: " + vogais);
        System.out.println("Consoantes: " + consoantes);
    }
}

Passo a passo

  1. Lemos a frase e aplicamos toLowerCase() para tratar maiúsculas e minúsculas igualmente.
  2. Inicializamos dois contadores: vogais e consoantes.
  3. Percorremos cada índice da string com um for.
  4. charAt(i) obtém o caractere na posição i.
  5. Verificamos se o caractere está entre 'a' e 'z'; se não estiver, ignoramos (espaços, pontuação, números).
  6. Se for letra, checamos se é vogal; caso contrário, incrementamos consoantes.
  7. Imprimimos os totais.

Por que funciona

String é imutável, então toLowerCase() retorna uma nova string sem alterar a original. Usando charAt() e comparações de char, evitamos criar objetos desnecessários. O teste c >= 'a' && c <= 'z' filtra apenas letras.

Erros comuns

  • Esquecer de converter para minúsculas: maiúsculas não seriam contadas. Solução: toLowerCase().
  • Usar == para comparar char: para char primitivo, == funciona, mas para String não. Aqui usamos char, então == é correto.
  • Contar espaços como consoantes: é preciso verificar se é letra antes de classificar.
  • Usar substring em vez de charAt: mais custoso e desnecessário.

Outra forma de resolver

Usar for (char c : frase.toCharArray()), que evita chamadas repetidas a charAt:

for (char c : frase.toCharArray()) {
    if (c >= 'a' && c <= 'z') { ... }
}

Essa forma é mais legível, mas cria um array extra.

Saída esperada

Vogais: 6
Consoantes: 8