Cartouche

Champ Valeur
Auteur·e Élise
Édition 2024-07-02
Durée 3 heures 30 minutes
Taille des équipes Travail individuel
Rendu via git, dépôt 2023_cpp_retake, dossier mathsh/, droits en lecture à delivery_collector

Prélude

Conditions de travail

Ce sujet est à faire seul. La communication n’est pas permise.

Sauf autorisation explicite pour un site web ou une URL, l’accès à internet n’est pas autorisé. Sont autorisés :

Critères et grille

Ce rendu permettra l’évaluation des critères du tableau qui suit. Certains critères sont spécifiques à ce sujet, d’autres en commun avec le second sujet, d’autres encore seront exclusif au second sujet.

Pour qu’un critère soit considéré comme obtenu, vous devez en avoir fait la preuve tout au long de la journée de rattrapage.

Rattrapage • Grille d'évaluation

Conditions de rendu

Fichiers à rendre :

  • mathsh/Makefile
  • mathsh/src/**/*.{cpp,hpp}

Le projet MathSH doit être rendu dans un dossier mathsh à l’intérieur du dépôt. Le binaire produit par son Makefile doit s’appeler mathsh. Votre Makefile doit comporter les règles all, clean, fclean, re. Vous pouvez prendre pour référence ce Makefile.

Il est interdit de rendre des fichiers déjà compilé tels que des exécutables et des objets. Assurez-vous à chaque commit de ne rendre que des fichiers sources ou de configuration.

Dépôt de référence

Vous pouvez utiliser le dépôt de référence pour faciliter le formatage automatique de votre éditeur de code et argumenter son auto-complétion. https://git.ecole-89.com/eriizu/cpp_reference.

Déplacez le contenu du dépôt de référence dans le dossier mathsh de votre dépôt de rendu.

Fonctions autorisées

Toute la bibliothèque standard C++ est autorisée. L’utilisation de fonctions spécifiques au C (comme strlen, printf, etc.) est permise mais fait perdre les points d’utilisation de la bibliothèque standard.

Partie 1

Écrivez un programme qui lit sur l’entrée standard et parse les commandes suivantes. Dans l’exemple les lignes avec > sont écrites par l’utilisateur. Celles avec < sont écrites par le programme, en réponse au commandes.

> PUSH 4 2 3
> PUSH 1
> SUM
< 10
> AVG
< 2.5
> MEDIAN
< 2.5
> PUSH 50
> AVG
< 12 
> MEDIAN
< 3

Implémentez les commandes :

  • PUSH X ajoute un ou plusieurs nombre·s à l’ensemble
  • POP X retire un ou plusieurs nombre·s aux positions X de l’ensemble
  • PRINT affiche tous les nombres, séparés par des espaces
  • AVG calcule et affiche la moyenne de tous les nombres en mémoire
  • MEDIAN pareil mais avec la médiane
  • SORT trie les nombres de l’ensemble et affiche le nombre d’opérations faites pour trier
  • EXIT arrête le programme proprement (mais on doit aussi pouvoir quitter en faisant <kbd>ctrl + d</kbd>)

Gestion des erreurs : votre programme ne doit pas planter si vous recevez une valeur inattendue ou absente, autant pour le nom la commande que ses arguments. Affichez une erreur, en anglais qui décrit au mieux ce qu’il vient de se produire, et laissez l’utilisateur continuer à utiliser votre programme.

Partie 2

Vos commandes ont toutes des points communs. Elles ont toute un nom et elles travaillent sur un ensemble de nombres. Certaines d’entre elles prennent des arguments.

Notre objectif c’est de rendre modulaire notre shell, en facilitant l’ajout de commande ou leur désactivation.

Composants :

  • la classe Shell sur laquelle on peut :
    • ajouter des ICommand * ou des std::unique_ptr<ICommand>,
    • appeler run pour qu’elle lise sur l’entrée standard et exécute les commandes tapées par l’utilisateur ;
  • les classes héritières de ICommand, implémentent toutes :
    • une fonction qui permet de connaitre leur nom (ex. SUM),
    • une fonction qui permet de savoir si elles doivent recevoir des arguments, et si oui combien,
    • une fonction qui permet d’exécuter la commande, qui prend l’ensemble de nombres et les arguments en paramètre ;
  • main initialise un objet de type Shell, les ICommands, et les ajoute au shell, puis enfin appelle run sur le shell.

À la fin de l’exécution vous devez donner la quantité, la somme, la moyenne et la médiane de tous les nombres qui sont passés par votre shell. Vous devez aussi afficher le nombre de commandes qui a réussi vs. le nombre qui a échoué.