13.1. Introduction au chiffres romains
Dans les chapitres précédents, nous avons «plongé»
en regardant immédiatement du code et en essayant de le comprendre le
plus vite possible. Maintenant que vous connaissez un peu plus de
Python, nous allons prendre un peu de recul
et regarder ce qui se passe avant que le code
soit écrit.
Dans ce chapitres et les suivants, nous allons écrire, déboguer et optimiser un ensemble de fonctions utilitaires pour convertir
vers et depuis des chiffres romains. Nous avons vu la méthode de construction et de validation des chiffres romains au chapitre
Section 7.3, «Exemple : chiffres romains», nous allons maintenant considérer ce qu’il faut faire pour étendre cette méthode pour qu’elle fonctionne dans les deux sens.
Les règles de construction des chiffres romains amènent à un certain nombre d’observations intéressantes :
- Il n’y a qu’une seule façon correcte de représenter une valeur
en chiffres romains.
- L’inverse est aussi vrai : si une chaîne de caractères en chiffres romains est un
nombre valide, elle ne représente qu’un nombre (c.a.d.
qu’elle ne peut être lue que d’une manière).
- Il y a un intervalle limité de valeurs pouvant être exprimées
en chiffres romains, les nombres de 1 à
3999 (les Romains avaient plusieurs manières
d’exprimer des nombres plus grand, par exemple en inscrivant une
barre au dessus d’un caractère pour signifier que sa valeur normale
devait être multipliée par 1000, mais nous
n’allons pas prendre ça en compte. Pour ce qui est de ce chapitre,
les chiffres romains vont de 1 à
3999).
- Il n’est pas possible de représenter 0 en
chiffres romains (étonnamment, les anciens romains n’avaient pas de
notion du 0 comme chiffre. Les nombres servaient
à compter les choses qu’on avait, comment compter ce que l’on n’a
pas ?).
- Il n’est pas possible de représenter les valeurs négatives en
chiffres romains.
- Il n’est pas possible de représenter des fractions ou des nombres non-entiers en chiffres romains.
Sachant tout cela, que pouvons nous exiger d’un ensemble de fonctions
pour convertir vers et depuis les chiffres romains ?
Spécification de roman.py
- toRoman doit retourner la représentation
en chiffres romains de tous les entiers entre 1
et 3999.
- toRoman doit échouer s’il lui est passé
un entier hors de l’intervalle 1 à
3999.
- toRoman doit échouer s’il lui est passé
une valeur non-entière.
- fromRoman doit prendre un nombre en chiffres romains
valide et retourner la valeur qu’il représente.
- fromRoman doit échouer s’il lui est passé
un nombre en chiffres romains invalide.
- Si vous prenez un nombre, le convertissez en chiffres romains,
puis le convertissez à nouveau en nombre, vous devez obtenir la même
valeur que celle de départ. Donc fromRoman(toRoman(n)) ==
n pour tout n compris dans
1..3999.
- toRoman doit toujours retourner un des chiffres
romains en lettres majuscules.
- fromRoman doit seulement accepter des
chiffres romains en majuscules (il doit échouer s’il lui est passé
une entrée en minuscules.
Pour en savoir plus
- Ce
site a plus d’information sur les nombres romains, y compris
une histoire
fascinante de la manière dont les Romains et d’autres civilisations
les utilisaient vraiment (pour faire court, à l’aveuglette et sans
cohérence).