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.
Desafio
FácilVamos 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 structGenericArraycom três membros: um arrayvoid**para armazenar ponteiros, umintpara a contagem atual e umintpara 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 0add_element: armazena um ponteirovoid*na próxima posição disponível e incrementa a contagem (suponha que a capacidade seja suficiente)get_element: retorna ovoid*no índice especificadofree_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 (ipara inteiro,spara 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á:
- O número de elementos a adicionar
- Para cada elemento: um indicador de tipo (
ious) 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
100Exemplo de saída quando as entradas são 4 e, em seguida, s World, s Generic, i -5, s Arrays:
World
Generic
-5
ArraysLembre-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
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRecapitulação: Dispatch de Calculadora10Contêineres Genéricos
Revisão de Ponteiros VoidWrapper GenéricoTroca GenéricaComparação GenéricaRevisão: Array Genérico2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online