C++: Forme géométrique en C et C++

 

Voici des structures C développées pour manipuler des figures géométriques. 

typedef enum { _carre_, _rectangle_ } type_fg;

typedef struct _carre {
  int x, y, cote;
} carre;

typedef struct _rectangle {
  int x, y, longueur, largeur;  
} rectangle;

typedef struct _forme {
  type_fg tfg;
  void * geo;
} forme;

 

Un carré se manipule donc par les coordonnées xy du coin haut-gauche et par la valeur de son coté, un rectangle, par xy, sa longueur et sa largeur.

Le type forme permet de manipuler un carre ou un rectangle : si la valeur de tfg est $ \_carre$$ \_$, alors, le pointeur geo doit pointer sur une structure de type carre et si la valeur de tfg est $ \_rectangle$$ \_$, alors, geo doit pointer sur une structure de type rectangle.

 

Fonctions pour les carrés

En C

Mettre en oeuvre les fonctions suivantes en respectant les règles de mise en œuvre vues en cours :

  • void carre_creer(carre * self, int x, int y, int cote) permet d'initialiser (de creer) un carre;
  • void carre_detruire(carre * self) permet de détruire un carre;
  • void carre_modifier(carre * self, int x, int y, int cote) permet de modifier un carre;
  • void carre_recup(carre * self, int * x, int * y, int * cote) permet de recuperer la valeur de xy et de cote;
  • void carre_afficher(carre * self) permet d'afficher le contenu d'un carre sur la sortie standard;
  • void carre_copier(carre * self, carre * a_copier) permet de copier un carre;

Tests

Donner un programme de test simple pour ces fonctions.

Collection de formes en C++

On suppose que les fonctions déjà développées pour carre sont aussi disponibles pour rectangle.

On désire maintenant manipuler une collection C++ de formes géométriques pouvant être soit des carrés, soit des rectangles. Dans une telle collection, on peut avoir par exemple, 3 carres et 2 rectangles.

Voici l'interface de la classe C + + pour la gestion de cette collection : 

class ColFormes {
  public:
    ColFormes();
    ~ColFormes();
    void ajouter(const forme *);
    void ajouter_carre(int x, int y, int cote);
    void ajouter_rectangle(int x, int y, int long, int larg);
    int recuperer_les_carres(const carre ** liste_dyn) const;
    const forme * recuperer(int pos) const;
    int combien() const;
    void afficher() const;
  private:
    ColFormes(const ColFormes & a_copier) { }
    void & operator = (const ColFormes & a_copier) { }
    int nb;
    forme * col;
};
  • ColFormes() et ~ColFormes() sont respectivement le constructeur et le destructeur;
  • ajouter(const forme *) permet d'ajouter une forme à la collection;
  • ajouter_carre(int x, int y, int cote) et 
    ajouter_rectangle(int x, int y, int long, int larg) permettent respectivement d'ajouter un carre et un rectangle à la collection;
  • int recuperer_les_carres(const carre ** liste_dyn) const permet de récupérer un tableau alloué dynamiquement contenant tous les carrés de la collection; le tableau résultat est donc pointé par liste_dyn et cette fonction retourne le nombre de carres trouvés;
  • const forme * recuperer(int pos) const permet de récupérer la forme géométrique stockée à la position pos;
  • int combien() const retourne le nombre de formes contenues;
  • void afficher() const permet d'afficher le contenu de la collection sur la sortie standard (cout en C + +).

A propos de const

  1. Que signifie le const situé après la parenthèse fermante pour par exemple la fonction : 
    int combien() const ?
  2. Que signifie le const précédant le type de retour de la fonction : 
    const forme * recuperer(int pos) const ?
  3. Que signifie le const précédant le type du paramètre de la fonction : 
    int recuperer_les_carres(const carre ** liste_dyn) const ?

Mise en oeuvre

Mettre en œuvre les fonctions membres public de la classe ColFormes.

Tests

Proposer un programme de test.