# Examen de C++ - ZZ2

## Consignes générales

Voici votre examen de C++ ZZ2. Lisez tout le sujet avant de commencer : un certain nombre de tests ont été écrits pour être indépendants ou avec peu d'influence sur les autres.

La durée de l'examen est de 1h50 sans tiers-temps. Aucun appareil électronique hormis l'ordinateur mis à votre disposition n'est utilisable. Le support de cours distribué avec des notes manuscrites est autorisé (pas de photocopie). Tout usage de l'IA sera sanctionné. Toutes les commandes et tous les accès réseaux sont consignés.

À la fin de l'examen, vous devez transmettre le source/répertoire d'un programme qui compile. Une icône se trouve sur le bureau "Post Exam".

Pour plus de simplicité, vous DEVEZ utiliser trois fichiers en plus de `main.cpp` : `tests.cpp`, `code.hpp` et `code.cpp`. Ne changez pas la casse et n'ajoutez pas de fichiers, cela casserait la chaine de compilation et engendrerait une note nulle.

La ligne de compilation est la suivante :

> `make`

Si besoin, vous pouvez faire un `make clean`. La première compilation de la bibliothèque Catch est un peu longue, comme d'habitude

Ne jamais recommenter un test qui a réussi. Tous les tests décommentés doivent compiler dans le même temps (sauf mention contraire).

Pour garder une trace exécutable de votre programme sans stress supplémentaire :

- Vous pouvez utiliser GIT. Un rappel des commandes GIT est fait à la fin de l'énoncé. La correction s'interessera uniquement à la version disponible.
- Si vous préférez faire des copies de répertoires, cela marche également. Cependant ne vous trompez pas lors de la transmission finale !

DOCUMENTATION CPP

## Sujet

Goldorak (Grendizer en vo) est né il y a 50 ans. C'est un précurseur des mechas japonais. Dans l'animé, le robot Goldorak défend la terre et affronte des ennemis appelés Golgoths (qui changent de forme : soucoupe volante ou robot). De nombreux vaisseaux (ou soucoupes) sont également mis en jeu.

Vous allez plus ou moins implémenter le diagramme UML ci-dessous :

- Créer une classe `Objet` qui permet de représenter tout objet avec un attribut `nom`. [Objet1] [Objet2]. Cette classe peut servir de base pour toutes les autres.
- L'opérateur <<[Pilote1] permet de rediriger le nom dans un flux

Le programme utilise une exception `ImpossibleException` qu'il est nécessaire de créer [Impossible1]

On s'intéresse ensuite aux classes `Machine`, `Soucoupe` et `Robot`

- Les machines ont un nom pour être reconnaissable. Un pilote leur est affecté tout en pouvant être pilotée automatiquement
- Les machines peuvent bouger si elles sont en mode automatique ou commandées par un pilote [Robot1] [Robot2] [Soucoupe1] [Soucoupe3]. Dans le cas contraire, une exception est levée [Robot3]
- Une arme a un nom et une puissance [Arme1]
- Les machines sont dotées d'armes. La puissance de la machine est la somme des puissances de ses armes.
- Si on essaie d'utiliser une arme alors qu'elle n'est pas installée, une exception est levée [Arme4] [Arme6]
- On peut obtenir la liste des armes d'une machine soit dans l'ordre lexicographique [Machine4], soit dans l'ordre décroissant des puissances.[Machine 5]

La dernière classe à créer est la classe `Golgoth` : vous pouvez faire un héritage multiple, virtuel ou non. Vous pouvez même considérer (avec les tests) qu'un Golgoth est une `Soucoupe` dotée d'un `Robot`

Il n'y a pas de fuite mémoire à votre programme !

## Commandes GIT

Préparation du compte (1 fois, au début) :

> `git config --global user.name "un_nom" git config --global user.email "un_mail"`

Préparation du répertoire :

> `git init`

À chaque nouveau fichier:

> `git add fichier git add *`

Sauvegarder / Committer :

> `git commit -am "commentaire"`

`git log` permet d'avoir la liste des sauvegardes avec un numéro de hachage

Pour revenir en arrière :

> `git checkout numero_de_hash
> OU git revert numero_de_hash`