Menu
Coddy logo textTech

Conteneur de formes

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 48 sur 61.

challenge icon

Défi

Facile

Amenons le projet Shape Drawer vers son grand final ! Vous allez créer un conteneur de formes qui contient une collection mixte de cercles et de rectangles, puis itérer à travers eux pour calculer l'aire totale — démontrant ainsi la véritable puissance du polymorphisme.

En vous appuyant sur tout ce que vous avez créé jusqu'à présent, votre projet complet comprendra :

  • shape.h et shape.c : Votre interface de base Shape et la fonction process_shape.
  • circle.h et circle.c : Votre implémentation de Circle avec son constructeur et son calcul d'aire.
  • rectangle.h et rectangle.c : Votre implémentation de Rectangle avec son constructeur et son calcul d'aire.
  • main.c : C'est ici que la magie opère. Vous allez créer un tableau de pointeurs Shape* pouvant contenir n'importe quel type de forme. Remplissez-le avec un mélange de cercles et de rectangles, puis parcourez le tableau pour calculer et afficher l'aire totale de toutes les formes combinées.

Votre programme recevra les entrées suivantes :

  1. Le nombre de formes à créer
  2. Pour chaque forme : un indicateur de type (c pour cercle, r pour rectangle) suivi de ses dimensions

Pour chaque forme de votre conteneur, affichez sa sortie de dessin. Après avoir traité toutes les formes, affichez l'aire totale avec 2 décimales au format Total Area: X.XX.

Exemple avec les entrées 3, puis 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

Exemple avec les entrées 2, puis 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

L'idée clé est que votre tableau stocke des pointeurs Shape* — il ne se soucie pas de savoir si chaque élément est réellement un Circle ou un Rectangle. Lorsque vous itérez et appelez draw et area via chaque pointeur, l'implémentation correcte s'exécute automatiquement en fonction de la manière dont chaque forme a été construite. C'est le polymorphisme à l'œuvre : une boucle, une interface, plusieurs comportements.

N'oubliez pas que vous devrez stocker des pointeurs vers les membres Shape intégrés de vos formes concrètes dans le tableau. Utilisez 3.14159 pour π dans les calculs d'aire de cercle.

Important — lecture du caractère de type de forme : Après avoir lu le nombre de formes avec scanf("%d", &n), chaque appel suivant pour lire le caractère de type doit ignorer le saut de ligne restant dans le tampon d'entrée. Utilisez un espace de tête dans la chaîne de format pour ce faire :

scanf(" %c", &type);  // notez l'espace avant %c

Sans l'espace de tête, scanf lira le caractère de saut de ligne laissé par l'entrée précédente au lieu du c ou r prévu, ce qui entraînera l'échec silencieux de votre vérification de type de forme et ne produira aucune sortie.

Essayez vous-même

#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: Lire le nombre de formes
    // TODO: Allouer des tableaux pour les cercles, les rectangles et les pointeurs Shape*
    // TODO: Parcourir chaque forme, lire son type et ses dimensions,
    //       créer la forme et stocker un pointeur vers sa base dans le tableau shapes
    // TODO: Parcourir le tableau shapes, appeler draw sur chaque forme,
    //       et accumuler l'aire totale
    // TODO: Afficher l'aire totale au format : Total Area: X.XX
    // TODO: Libérer la mémoire allouée
    return 0;
}

Toutes les leçons de Object Oriented Programming