Menu
Coddy logo textTech

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 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 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 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* 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 struct GenericArray
  • main.c: demonstre seu array genérico armazenando 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 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 inteiros, aloque memória para o int e armazene o ponteiro. Ao adicionar strings, aloque memória e copie a string. Ao recuperar, converta novamente para o tipo apropriado para imprimir.

Importante: para acompanhar os tipos durante a impressão, você pode usar um array paralelo simples 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 e, em seguida, i 42, s Hello, i 100:

42
Hello
100

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

World
Generic
-5
Arrays

Lembre-se de usar include guards no seu arquivo de cabeçalho. O contêiner em si 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 rastrear os tipos (array de char de tamanho n)
    
    // TODO: Para cada elemento:
    // - Leia o indicador de tipo (i ou s)
    // - Leia o valor
    // - Se inteiro: aloque memória para int, armazene o valor, adicione ao array
    // - Se string: aloque memória para string, copie o valor, adicione ao array
    // - Armazene o indicador de tipo no seu array paralelo
    
    // TODO: Itere pelo array e imprima cada elemento
    // - Verifique o tipo a partir do seu array paralelo
    // - Faça o cast do 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