Exercícios de C/C++ para iniciantes

Contar a frequência de letras em uma string com C e C++

Nesta lição, você vai contar quantas vezes cada letra minúscula aparece em uma string usando um array de 26 elementos.

Introdução

Uma tabela de frequência associa cada caractere a um contador. Como só existem 26 letras minúsculas, de a até z, podemos usar um array de 26 elementos: a posição 0 conta a letra a, a posição 1 conta a letra b, e assim por diante.

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 <stdio.h>
int main(void) {
    const char *text = "banana"; int counts[26] = {0};
    // Convert each lowercase letter to an array index.
    for (; *text; ++text) ++counts[*text - 'a'];
    for (int i = 0; i < 26; ++i) if (counts[i]) printf("%c=%d\n", 'a' + i, counts[i]);
}
Resultado da execução
a=3
b=1
n=2
C++
Executar →
main.cpp
#include <array>
#include <iostream>
#include <string>
int main() {
    std::string text = "banana"; std::array<int, 26> counts{};
    // Convert each lowercase letter to an array index.
    for (char character : text) ++counts[character - 'a'];
    for (size_t i = 0; i < counts.size(); ++i) if (counts[i]) std::cout << char('a' + i) << '=' << counts[i] << '\n';
}
Resultado da execução
a=3
b=1
n=2

Comparação entre C e C++

A expressão *text - 'a' transforma uma letra em um índice de 0 a 25, porque as letras têm códigos consecutivos. O programa aumenta o contador nessa posição, e um segundo laço imprime só as letras com contador diferente de 0. Para "banana", o resultado é a=3, b=1 e n=2.

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