Menu
CoddyTech

Revisão: array genérico

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 53 de 61.

challenge icon

Desafio

Fácil

Vamos criar um contêiner GenericArray: uma estrutura de dados flexível que pode armazenar uma mistura de números inteiros e strings na mesma coleção usando ponteiros void*.

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

  • generic_array.h: Defina a estrutura GenericArray com três membros: um array void** para armazenar 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 pelo í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* na próxima posição disponível e incrementa a contagem (suponha que a capacidade seja suficiente)
    • get_element: retorna o void* no índice especificado
    • free_array: libera o array de itens e a própria estrutura GenericArray
  • main.c: Demonstre seu array genérico armazenando números inteiros e strings. Leia o número de elementos a adicionar e, em seguida, para cada elemento, leia um indicador de tipo (i para inteiro, s para string), seguido pelo valor. Depois de adicionar todos os elementos, percorra o array e imprima cada valor. Para números inteiros, imprima o número diretamente. Para strings, imprima o texto diretamente.

Seu programa receberá:

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

Ao adicionar números inteiros, aloque memória para o int e armazene o ponteiro. Ao adicionar strings, aloque memória e copie a string. Ao recuperar os elementos, converta de volta para o tipo apropriado para imprimir.

Importante: Para acompanhar os tipos durante a impressão, você pode usar um simples array paralelo de indicadores de tipo em 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 guardas de inclusão no seu arquivo de cabeçalho. O próprio contêiner não precisa saber quais tipos armazena. Ele apenas mantém ponteiros void*. A responsabilidade de conhecer o tipo cabe ao 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: Crie um GenericArray com capacidade n
    
    // TODO: Crie um array paralelo para registrar os tipos (array de char de tamanho n)
    
    // TODO: Para cada elemento:
    // - Leia o indicador de tipo (i ou s)
    // - Leia o valor
    // - Se for inteiro: aloque memória para int, armazene o valor e adicione-o ao array
    // - Se for string: aloque memória para a string, copie o valor e adicione-o ao array
    // - Armazene o indicador de tipo no seu array paralelo
    
    // TODO: Percorra o array e imprima cada elemento
    // - Verifique o tipo no seu array paralelo
    // - Converta o void* de volta para o tipo apropriado e imprima
    
    // TODO: Libere toda a memória alocada (inteiros, strings e o array)
    
    return 0;
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online