Contêiner de formas
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 48 de 61.
Desafio
FácilVamos levar o projeto Shape Drawer ao seu grande final! Você vai criar um contêiner de formas que armazena uma coleção mista de círculos e retângulos e, em seguida, 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ê vai criar um array de ponteirosShape*que pode armazenar qualquer tipo de forma. Preencha-o com uma combinação de círculos e retângulos e, em seguida, 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 criar
- Para cada forma: um indicador de tipo (
cpara círculo,rpara retângulo), seguido por suas dimensões
Para cada forma no seu contêiner, chame draw e area você mesmo por meio do ponteiro Shape* (shapes[i]->draw(shapes[i]), shapes[i]->area(shapes[i])) e some a área a um total acumulado. Não use process_shape de shape.c aqui: essa função imprime uma linha Area: extra para cada forma, que não aparece na saída esperada. Depois de processar todas as formas, imprima a área total com 2 casas decimais no formato Total Area: X.XX.
Exemplo com as 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 as 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.00A ideia principal é que seu array armazena ponteiros Shape*. Ele não se importa se cada elemento é, na verdade, um círculo ou um retângulo. Quando você percorre o array e chama draw e area por meio 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, vários comportamentos.
Lembre-se de que você precisará armazenar no array ponteiros para os membros Shape incorporados às suas formas concretas. Use 3.14159 para π nos cálculos da área do círculo.
Importante: lendo o caractere do tipo da forma: Depois de ler o número de formas com scanf("%d", &n), cada chamada subsequente para ler o caractere do tipo precisa 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 the space before %cSem o espaço inicial, scanf lerá o caractere de quebra de linha que sobrou da entrada anterior, em vez de ler c ou r, fazendo com que a verificação do tipo da 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: Leia o número de formas
// TODO: Aloque arrays para círculos, retângulos e ponteiros Shape*
// TODO: Percorra cada forma, leia seu tipo e suas dimensões,
// crie a forma e armazene um ponteiro para sua base no array shapes
// TODO: Percorra o array shapes, chame shapes[i]->draw(...) e
// shapes[i]->area(...) diretamente e acumule a área total
// (não chame process_shape: essa função imprime uma linha Area extra)
// TODO: Imprima a área total no formato: Total Area: X.XX
// TODO: Libere a memória alocada
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 secreta2Objetos 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