Médio C++

Contador de vogais com const&

Enunciado

Escreva uma função int contar_vogais(const std::string& texto) que retorna o número de vogais (a, e, i, o, u, maiúsculas ou minúsculas) na string passada. Use const& para evitar cópia. No main, leia uma string do usuário e imprima o resultado.

Requisitos

  • A função deve receber const std::string& para evitar cópia e não modificar a string.
  • A função deve contar vogais maiúsculas e minúsculas.
  • O main deve ler uma linha inteira com std::getline e chamar a função.
  • A saída deve mostrar a string e o número de vogais.

Código inicial

#include <iostream>
#include <string>

// TODO: implemente contar_vogais

int main() {
    std::string linha;
    std::cout << "Digite uma frase: ";
    std::getline(std::cin, linha);
    // TODO: chame contar_vogais e imprima
    return 0;
}

Saída esperada

Digite uma frase: Olá, mundo!
A frase "Olá, mundo!" tem 4 vogais.
Ver dica

Use std::tolower de <cctype> para tratar maiúsculas e minúsculas, ou verifique ambas as formas.

Mostrar solução
#include <iostream>
#include <string>
#include <cctype>

// Conta vogais sem copiar a string e sem modificá-la
int contar_vogais(const std::string& texto) {
    int contador = 0;
    for (char c : texto) {
        char lower = std::tolower(static_cast<unsigned char>(c));
        if (lower == 'a' || lower == 'e' || lower == 'i' ||
            lower == 'o' || lower == 'u') {
            ++contador;
        }
    }
    return contador;
}

int main() {
    std::string linha;
    std::cout << "Digite uma frase: ";
    std::getline(std::cin, linha);
    int vogais = contar_vogais(linha);
    std::cout << "A frase \"" << linha << "\" tem " << vogais << " vogais.\n";
    return 0;
}

Passo a passo

  1. A função contar_vogais recebe const std::string& texto, uma referência constante que evita cópia e impede modificações.
  2. Inicializamos contador com zero.
  3. Usamos um loop for (char c : texto) para percorrer cada caractere da string.
  4. Convertemos c para minúsculo com std::tolower, tomando cuidado com o cast para unsigned char para evitar comportamento indefinido com caracteres negativos.
  5. Verificamos se o caractere é uma vogal; se for, incrementamos contador.
  6. Retornamos o contador.
  7. No main, lemos uma linha inteira com std::getline e chamamos a função, imprimindo o resultado.

Por que funciona

O uso de const& permite passar a string sem copiá-la, o que é eficiente para strings longas. Além disso, const garante que a função não modificará a string original, evitando efeitos colaterais indesejados. A função opera diretamente sobre o objeto original, mas apenas para leitura.

Erros comuns

  • Passar por valor: int contar_vogais(std::string texto) copia a string, desperdiçando memória e tempo. Para strings grandes, isso é ineficiente.
  • Esquecer const: int contar_vogais(std::string& texto) permite modificações acidentais e não aceita argumentos constantes.
  • Não tratar maiúsculas: comparar apenas com minúsculas faz com que 'A' não seja contada. Use std::tolower ou verifique ambas as formas.
  • Usar std::tolower sem cast: std::tolower(c) com char negativo é comportamento indefinido. O correto é std::tolower(static_cast<unsigned char>(c)).

Outra forma de resolver

Usar std::count_if com uma lambda:

#include <algorithm>
int contar_vogais(const std::string& texto) {
    return std::count_if(texto.begin(), texto.end(), [](char c) {
        char l = std::tolower(static_cast<unsigned char>(c));
        return l == 'a' || l == 'e' || l == 'i' || l == 'o' || l == 'u';
    });
}

Essa abordagem é mais concisa e idiomática em C++ moderno.

Saída esperada

Digite uma frase: Olá, mundo!
A frase "Olá, mundo!" tem 4 vogais.