Menu
Coddy logo textTech

Container de Formas

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 48 de 61.

challenge icon

Desafio

Fácil

Vamos levar o projeto Shape Drawer ao seu grand finale! Você criará um contêiner de formas que armazena uma coleção mista de Circles e Rectangles e, em seguida, iterará por elas 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.h e shape.c: sua interface base Shape e a função process_shape.
  • circle.h e circle.c: sua implementação de Circle com seu construtor e cálculo de área.
  • rectangle.h e rectangle.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 ponteiros Shape* que pode armazenar qualquer tipo de forma. Preencha-o com uma mistura de Circles e Rectangles e, em seguida, percorra o array para calcular e exibir a área total de todas as formas combinadas.

Seu programa receberá as seguintes entradas:

  1. O número de formas a serem criadas
  2. Para cada forma: um indicador de tipo (c para círculo, r para retângulo), seguido por suas dimensões

Para cada forma em seu contêiner, chame draw e area diretamente por meio do ponteiro Shape* (shapes[i]->draw(shapes[i]), shapes[i]->area(shapes[i])) e adicione a área a um total acumulado. Não use process_shape de shape.c aqui: ele 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.11

Exemplo 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.00

A ideia principal é que seu array armazena ponteiros Shape*. Ele não se importa se cada elemento é, na verdade, um Circle ou um Rectangle. Quando você itera e chama draw e area por meio de cada ponteiro, a implementação correta é executada automaticamente com base na forma 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 em 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 de tipo deve ignorar a quebra de linha restante no buffer de entrada. Use um espaço no início da string de formato para fazer isso:

scanf(" %c", &type);  // note the space before %c

Sem o espaço no início, scanf lerá o caractere de nova linha deixado pela entrada anterior em vez do c ou r pretendido, 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: Ler o número de formas
    // TODO: Alocar arrays para circles, rectangles 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 shapes[i]->draw(...) e
    //       shapes[i]->area(...) diretamente e acumular a área total
    //       (não chamar process_shape: ele imprime uma linha Area extra)
    // TODO: Imprimir a área total no formato: Total Area: X.XX
    // TODO: Liberar a memória alocada
    return 0;
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online