Container de Formas
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 48 de 61.
Desafio
FácilVamos levar o projeto Shape Drawer ao seu grande final! Você criará um contêiner de formas que contém uma coleção mista de Círculos e Retângulos, depois iterará por eles para calcular a área total — demonstrando o verdadeiro poder do polimorfismo.
Com base em tudo o que você criou até agora, seu projeto completo incluirá:
shape.heshape.c: Sua interface base Shape e a funçãoprocess_shape.circle.hecircle.c: Sua implementação de Circle com seu construtor e cálculo de área.rectangle.herectangle.c: Sua implementação de Rectangle com seu construtor e cálculo de área.main.c: É aqui que a mágica acontece. Você criará um array de ponteirosShape*que pode conter qualquer tipo de forma. Preencha-o com uma mistura de Círculos e Retângulos, depois percorra o array para calcular e exibir a área total de todas as formas combinadas.
Seu programa receberá as seguintes entradas:
- O número de formas a serem criadas
- Para cada forma: um indicador de tipo (
cpara círculo,rpara retângulo) seguido por suas dimensões
Para cada forma em seu contêiner, imprima sua saída de desenho. Após processar todas as formas, imprima a área total com 2 casas decimais no formato Total Area: X.XX.
Exemplo com entradas 3, depois c 5.0, r 4.0 3.0, c 2.0:
Drawing Circle with radius: 5.00
Drawing Rectangle with width: 4.00 and height: 3.00
Drawing Circle with radius: 2.00
Total Area: 103.11Exemplo com entradas 2, depois r 6.0 4.0, r 3.0 2.0:
Drawing Rectangle with width: 6.00 and height: 4.00
Drawing Rectangle with width: 3.00 and height: 2.00
Total Area: 30.00O ponto principal é que seu array armazena ponteiros Shape* — ele não se importa se cada elemento é na verdade um Círculo ou Retângulo. Quando você itera e chama draw e area através de cada ponteiro, a implementação correta é executada automaticamente com base em como cada forma foi construída. Isso é o polimorfismo em ação: um loop, uma interface, múltiplos comportamentos.
Lembre-se de que você precisará armazenar ponteiros para os membros Shape incorporados de suas formas concretas no array. Use 3.14159 para π nos cálculos de área do círculo.
Importante — lendo o caractere de tipo de forma: Após ler o número de formas com scanf("%d", &n), cada chamada subsequente para ler o caractere de tipo deve ignorar a quebra de linha restante no buffer de entrada. Use um espaço inicial na string de formato para fazer isso:
scanf(" %c", &type); // note o espaço antes de %cSem o espaço inicial, o scanf lerá o caractere de nova linha deixado pela entrada anterior em vez do c ou r pretendido, fazendo com que sua verificação de tipo de forma falhe silenciosamente e não produza nenhuma saída.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: Ler o número de formas
// TODO: Alocar arrays para círculos, retângulos e ponteiros Shape*
// TODO: Percorrer cada forma, ler seu tipo e dimensões,
// criar a forma e armazenar um ponteiro para sua base no array shapes
// TODO: Percorrer o array shapes, chamar draw em cada forma,
// e acumular a área total
// TODO: Imprimir a área total no formato: Total Area: X.XX
// TODO: Liberar a memória alocada
return 0;
}
Todas as lições de Object Oriented Programming
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 Secreta2Objetos 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írculo