Rattrapage • mathSH
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 :
- https://cppreference.com ;
- https://git.ecole-89.com pour créer votre rendu seulement ;
- https://publish.obsidian.md/elise pour les sujets de ce rattrapage.
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/Makefilemathsh/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 Xajoute un ou plusieurs nombre·s à l’ensemblePOP Xretire un ou plusieurs nombre·s aux positionsXde l’ensemblePRINTaffiche tous les nombres, séparés par des espacesAVGcalcule et affiche la moyenne de tous les nombres en mémoireMEDIANpareil mais avec la médianeSORTtrie les nombres de l’ensemble et affiche le nombre d’opérations faites pour trierEXITarrê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
Shellsur laquelle on peut :- ajouter des
ICommand *ou desstd::unique_ptr<ICommand>, - appeler
runpour qu’elle lise sur l’entrée standard et exécute les commandes tapées par l’utilisateur ;
- ajouter des
- 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 ;
- une fonction qui permet de connaitre leur nom (ex.
maininitialise un objet de typeShell, lesICommands, et les ajoute aushell, puis enfin appellerunsur leshell.
À 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é.