Menu
Coddy logo textTech

Revisão: Array Genérico

Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 53 de 61.

challenge icon

Desafio

Fácil

Vamos construir um contêiner GenericArray — uma estrutura de dados flexível que pode conter uma mistura de inteiros e strings na mesma coleção usando ponteiros void*.

Você organizará seu código em três arquivos:

  • generic_array.h: Defina a struct GenericArray com três membros: um array void** para conter ponteiros, um int para a contagem atual e um int para a capacidade. Declare os protótipos das funções para criar o array, adicionar elementos, recuperar elementos por índice e liberar o array.
  • generic_array.c: Implemente a funcionalidade do seu contêiner:
    • create_array — aloca um GenericArray com uma capacidade inicial fornecida e inicializa a contagem como 0
    • add_element — armazena um ponteiro void* no próximo slot disponível e incrementa a contagem (assuma que a capacidade é suficiente)
    • get_element — retorna o void* no índice especificado
    • free_array — libera o array de itens e a própria struct GenericArray
  • main.c: Demonstre seu array genérico armazenando tanto inteiros quanto strings. Leia o número de elementos a serem adicionados, então, para cada elemento, leia um indicador de tipo (i para inteiro, s para string) seguido pelo valor. Após adicionar todos os elementos, itere pelo array e imprima cada valor. Para inteiros, imprima o número diretamente. Para strings, imprima o texto diretamente.

Seu programa receberá:

  1. O número de elementos a serem adicionados
  2. Para cada elemento: um indicador de tipo (i ou s) seguido pelo valor

Ao adicionar inteiros, aloque memória para o int e armazene o ponteiro. Ao adicionar strings, aloque memória e copie a string. Ao recuperar, faça o cast de volta para o tipo apropriado para imprimir.

Importante: Para rastrear os tipos para impressão, você pode usar um array paralelo simples de indicadores de tipo na main, ou armazenar o caractere indicador de tipo junto com cada elemento.

Exemplo de saída quando as entradas são 3, depois i 42, s Hello, i 100:

42
Hello
100

Exemplo de saída quando as entradas são 4, depois s World, s Generic, i -5, s Arrays:

World
Generic
-5
Arrays

Lembre-se de usar guards de inclusão (include guards) em seu arquivo de cabeçalho. O contêiner em si não precisa saber quais tipos ele armazena — ele apenas guarda ponteiros void*. A responsabilidade de saber o tipo recai sobre o código que adiciona e recupera os elementos.

Experimente você mesmo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: Criar um GenericArray com capacidade n
    
    // TODO: Criar um array paralelo para rastrear os tipos (array de char de tamanho n)
    
    // TODO: Para cada elemento:
    // - Ler o indicador de tipo (i ou s)
    // - Ler o valor
    // - Se for inteiro: alocar memória para int, armazenar o valor, adicionar ao array
    // - Se for string: alocar memória para string, copiar o valor, adicionar ao array
    // - Armazenar o indicador de tipo no seu array paralelo
    
    // TODO: Iterar pelo array e imprimir cada elemento
    // - Verificar o tipo a partir do seu array paralelo
    // - Fazer o cast do void* de volta para o tipo apropriado e imprimir
    
    // TODO: Liberar toda a memória alocada (inteiros, strings e o array)
    
    return 0;
}

Todas as lições de Object Oriented Programming