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¶ evitar cópia e não modificar a string. - A função deve contar vogais maiúsculas e minúsculas.
- O
maindeve ler uma linha inteira comstd::getlinee 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
- A função
contar_vogaisrecebeconst std::string& texto, uma referência constante que evita cópia e impede modificações. - Inicializamos
contadorcom zero. - Usamos um loop
for (char c : texto)para percorrer cada caractere da string. - Convertemos
cpara minúsculo comstd::tolower, tomando cuidado com o cast paraunsigned charpara evitar comportamento indefinido com caracteres negativos. - Verificamos se o caractere é uma vogal; se for, incrementamos
contador. - Retornamos o contador.
- No
main, lemos uma linha inteira comstd::getlinee 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::tolowerou verifique ambas as formas. - Usar
std::tolowersem cast:std::tolower(c)comcharnegativo é 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.