Exercícios de C/C++ para iniciantes

Contar vogais em uma string com C e C++

Nesta lição, você vai contar as vogais de uma linha de texto, ignorando a diferença entre maiúsculas e minúsculas.

Introdução

Contar vogais junta três habilidades: percorrer cada caractere da string, normalizar os caracteres para minúsculas e verificar se um caractere pertence a um conjunto. As vogais em inglês são a, e, i, o e u.

Pontos importantes

  • Ative os avisos do compilador (compiler warnings) e corrija todos eles.
  • Entenda o tipo de dado e o tempo de vida (lifetime) de cada valor.
  • Sempre valide os dados de entrada e os limites dos índices de arrays.

Exemplos de código C e C++

C
Executar →
main.c
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main(void) {
    const char *text = "Code Utility"; int count = 0;
    // strchr performs a compact membership check.
    for (; *text; ++text) if (strchr("aeiou", tolower((unsigned char)*text))) ++count;
    printf("vowels=%d\n", count);
}
Resultado da execução
vowels=5
C++
Executar →
main.cpp
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
int main() {
    std::string text = "Code Utility";
    // count_if counts characters accepted by the predicate.
    auto vowels = std::count_if(text.begin(), text.end(), [](unsigned char c) {
        return std::string("aeiou").find(std::tolower(c)) != std::string::npos;
    });
    std::cout << "vowels=" << vowels << '\n';
}
Resultado da execução
vowels=5

Comparação entre C e C++

A função tolower converte cada caractere para minúscula, para que maiúsculas e minúsculas sejam tratadas igual. O caractere é convertido para unsigned char antes de ir para tolower, evitando problemas com caracteres especiais. A função strchr("aeiou", ...) retorna um ponteiro diferente de NULL se o caractere estiver na string de vogais, e então o contador aumenta. A string "Code Utility" tem 5 vogais.

C

C usa funções procedurais pequenas e deixa à vista como os dados ficam na memória.

C++

C++ continua permitindo trabalhar em baixo nível, mas acrescenta tipos da biblioteca e abstrações mais seguras.

Exercícios práticos

Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.

  • Teste entradas inválidas e valores nos limites.
  • Compile com as flags -Wall -Wextra -Wpedantic para ativar mais avisos.
  • Separe as declarações compartilhadas em um arquivo de cabeçalho e a implementação em outro arquivo.

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios