\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\begin{document}
But: écrire un programme permettant de gérer les unités utilisées
en physiques. Un nombre unité se compose d'un nombre flottant
et d'un produit d'unités à une puissance entière.
Dans la suite, on suppose que l'espace de noms standard
du C++ est exporté ({\tt using namespace std;}) et on utilisera
la librairie standard C++ (Standard Template Library et flux 
\verb|iostream|).

\section{Objets-unités}
Placez les fonctions de cette section dans un fichier nommé \verb|unit1.cc|
\begin{enumerate}
\item Pour représenter une unité à une puissance, créez une
structure \verb|unit_pow| comportant un membre {\tt string} (pour l'unité)
et un membre {\tt int} pour la puissance, par exemple {\tt "m"} pour
le mètre. 

\item Créez un constructeur \verb|unit_pow(const string & _s,int _i)|.
Surchargez l'opérateur d'affichage \verb|ostream & operator <<|
pour pouvoir afficher des \verb|unit_pow|.

\item Pour représenter un produit d'unités, on utilisera 
{\tt vector<unite>}. 
Créez une classe {\tt unit} permettant de représenter un nombre unité.
Créez un constructeur d'{\tt unit} à partir d'un {\tt double}
et d'un {\tt vector<unite>}.
Surchargez l'opérateur d'affichage pour afficher des {\tt unit}

\item Surchargez les opérateur \verb|*| et \verb|/| pour faire
un produit ou un quotient d'objets unités.

\item Implémentez la fonction \verb|unit pow(const unit & u,int i);|
\item Testez ces fonctions.
\item Créez un fichier \verb|unit1.h| contenant les déclarations
nécessaires à l'utilisation des unités dans un autre programme.
\end{enumerate}

\section{Système international}
Copiez les fichiers {\tt unit1.cc} et {\tt unit1.h} dans {\tt unit.cc}
et {\tt unit.h}.

Pour pouvoir faire la somme ou la différence de deux objets
unités, il faut d'abord s'assurer que les unités sont compatibles.
Pour cela, on va utiliser le système international d'unités (SI).
Dans ce système, une unité s'exprime
en fonction des unités fondementales du système international
que sont le mètre (symbole m), kilogramme (kg), la seconde (s), l'Ampère (A), 
le Kelvin (K), la mole (mol), le candela (cd). On va donc
rajouter à la représentation d'une unité un {\tt double}, un 
\verb|vector<int>| ou un tableau de 7 {\tt int} pour les puissances.
\begin{enumerate}
\item Créez une structure \verb|unit_base| pour représenter une unité
de base par une chaine de caractère, et son équivalent SI. Par
exemple pour 1 litre (symbole L, équivalent $0.001m^3$), 
on utilisera la chaine "L", le nombre {\tt 1e-3} et le tableau
\verb|1,0,0,0,0,0,0|. Modifiez si nécessaire le reste du programme
pour qu'il fonctionne.
\item Créez une fonction qui convertit un nombre unité en son
équivalent SI (nombre et tableau ou vecteur de 7 {\tt int}).
\item Surchargez les opérateurs \verb|+| et \verb|-|,
en affichant un message d'erreur si on essaye d'additionner/soustraire
deux nombres unités incompatibles.
\item On souhaite maintenant que le résultat d'une operation
renvoie une unité pertinente si elle existe. Par exemple, une force
s'exprimera en Newton (symbole N, équivalent SI \verb|kg*m/s^2|).
En utilisant \verb|map|, créez un annuaire pour stocker des
unités pertinentes. Créez ensuite une fonction de recherche qui
identifie l'unité pertinente en fonction du vecteur (ou tableau)
de 7 int.
\item Proposez des modifications pour gérer les constantes physiques,
par exemple la vitesse de la lumière (symbole $c$, valeur
299792458 m/s)
\end{enumerate}

\end{document}
