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 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 estruturaGenericArraycom 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 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 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 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 (ipara inteiro,spara 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á:
- O número de elementos a adicionar
- Para cada elemento: um indicador de tipo (
ious), 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
100Exemplo de saída quando as entradas são 4, depois s World, s Generic, i -5, s Arrays:
World
Generic
-5
ArraysLembre-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
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRevisão: Despacho da Calculadora10Contêineres Genéricos
Revisão de ponteiros voidInvólucro genéricoTroca genéricaComparação genéricaRevisão: array genérico2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online